int b2a = value_dominates(b, a);
/* If there is no dominance relation, they do not interfere. */
- if(a2b + b2a > 0) {
+ if((a2b | b2a) > 0) {
const ir_edge_t *edge;
- ir_node *bb = get_nodes_block(b);
+ ir_node *bb;
/*
* Adjust a and b so, that a dominates b if
b = t;
}
+ bb = get_nodes_block(b);
+
/*
* If a is live end in b's block it is
* live at b's definition (a dominates b)
* Look at all usages of a.
* If there's one usage of a in the block of b, then
* we check, if this use is dominated by b, if that's true
- * a and b interfere.
+ * a and b interfere. Note that b must strictly dominate the user,
+ * since if b is the last user of in the block, b and a do not
+ * interfere.
* Uses of a not in b's block can be disobeyed, because the
* check for a being live at the end of b's block is already
* performed.
const ir_node *user = edge->src;
if(get_nodes_block(user) == bb
&& !is_Phi(user)
+ && b != user
&& value_dominates(b, user))
return 1;
}