When branch target points to the same basic block that contains that branch then branch insn will be added to the backpatch list because target_bb->is_emitted field is false yet. The backpatch list for basic block is browsed before its instructions are emitted. Therefore the branch whose target points to the containing basic block will never be patched.
Solution to this problem is to set ->is_emitted to true as soon as ->mach_offset is set (before basic block's instructions are emitted). This will cause that branches pointing to the containing basic block will be resolved immediately. Affected code: public class Test2 { static public void c() { } public static void main(String[] args) { while (true) c(); } } Acked-by: Arthur HUILLET <arthur.huil...@free.fr> Signed-off-by: Tomek Grabiec <tgrab...@gmail.com> --- jit/emit.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/jit/emit.c b/jit/emit.c index ac31b8b..ec79c3e 100644 --- a/jit/emit.c +++ b/jit/emit.c @@ -121,12 +121,13 @@ void emit_body(struct basic_block *bb, struct buffer *buf) struct insn *insn; bb->mach_offset = buffer_offset(buf); + bb->is_emitted = true; + backpatch_branches(buf, &bb->backpatch_insns, bb->mach_offset); for_each_insn(insn, &bb->insn_list) { emit_insn(buf, insn); } - bb->is_emitted = true; } static struct buffer_operations exec_buf_ops = { -- 1.6.0.6 ------------------------------------------------------------------------------ _______________________________________________ Jatovm-devel mailing list Jatovm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jatovm-devel