This fixes potential bugs when "master-master" relationships: A C E \ / \ / \ \ / \ / \ B D F
A and F are slaves, the rest are masters. If we browse blocks in order, it is B that is going to pick the temporary. We easily see that this temporary must be used by *all* the blocks for their mimic stack spill slots. Recursive propagation of the temporary choice from B into C, D, E does this. Signed-off-by: Arthur HUILLET <arthur.huil...@free.fr> --- jit/bytecode-to-ir.c | 34 ++++++++++++++++++++++------------ 1 files changed, 22 insertions(+), 12 deletions(-) diff --git a/jit/bytecode-to-ir.c b/jit/bytecode-to-ir.c index a8d0eec..9fbc8cd 100644 --- a/jit/bytecode-to-ir.c +++ b/jit/bytecode-to-ir.c @@ -301,14 +301,12 @@ assign_temporary(struct basic_block *bb, int entry, int slot_ndx, } } -static void pick_and_propagate_temporaries(struct basic_block *bb, bool entry) +static void propagate_temporary(struct basic_block *bb, bool entry, int slot_ndx, + struct var_info *tmp_high, struct var_info *tmp_low, struct basic_block *from) { - struct var_info *tmp_high, *tmp_low; struct basic_block **neighbors; - struct expression *expr; int nr_neighbors; - unsigned int i; - int slot_ndx; + int j; if (entry) { neighbors = bb->predecessors; @@ -318,9 +316,24 @@ static void pick_and_propagate_temporaries(struct basic_block *bb, bool entry) nr_neighbors = bb->nr_successors; } - for (i = 0; i < bb->nr_mimic_stack_expr; i++) { - int j; + assign_temporary(bb, entry, slot_ndx, tmp_high, tmp_low); + + for (j = 0; j < nr_neighbors; j++) { + if (neighbors[j] == from) + continue; + + propagate_temporary(neighbors[j], !entry, slot_ndx, tmp_high, tmp_low, bb); + } +} + +static void pick_and_propagate_temporaries(struct basic_block *bb, bool entry) +{ + struct var_info *tmp_high, *tmp_low; + struct expression *expr; + unsigned int i; + int slot_ndx; + for (i = 0; i < bb->nr_mimic_stack_expr; i++) { expr = bb->mimic_stack_expr[i]; /* Skip expressions that already been transformed */ @@ -341,11 +354,8 @@ static void pick_and_propagate_temporaries(struct basic_block *bb, bool entry) /* Save the slot number */ slot_ndx = expr->slot_ndx; - /* Assign this temporary to same mimic stack expressions in this block */ - assign_temporary(bb, entry, expr->slot_ndx, tmp_high, tmp_low); - - for (j = 0; j < nr_neighbors; j++) - assign_temporary(neighbors[j], !entry, slot_ndx, tmp_high, tmp_low); + /* Assign this temporary to same mimic stack expressions in this block and its neighbors */ + propagate_temporary(bb, entry, expr->slot_ndx, tmp_high, tmp_low, bb); } } -- 1.6.3.2 ------------------------------------------------------------------------------ _______________________________________________ Jatovm-devel mailing list Jatovm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jatovm-devel