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 <[email protected]>
---
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/jatovm-devel