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

Reply via email to