summaryrefslogtreecommitdiffhomepage
path: root/ir/be/bera.c
diff options
context:
space:
mode:
authorSebastian Hack <hack@ipd.info.uni-karlsruhe.de>2005-12-14 11:54:49 +0100
committerSebastian Hack <hack@ipd.info.uni-karlsruhe.de>2005-12-14 11:54:49 +0100
commit3ba827d6477fe73c675228678cab6aa31d86426e (patch)
tree7939fb2597073bd35e05c4b8f575f669d0ae330f /ir/be/bera.c
parentee1fc38ecb6d0832d827e198f28edd6d2ed8c997 (diff)
Fixed two bugs
Diffstat (limited to 'ir/be/bera.c')
-rw-r--r--ir/be/bera.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/ir/be/bera.c b/ir/be/bera.c
index 90ea5c9..024452a 100644
--- a/ir/be/bera.c
+++ b/ir/be/bera.c
@@ -55,9 +55,9 @@ int values_interfere(const ir_node *a, const ir_node *b)
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
@@ -69,6 +69,8 @@ int values_interfere(const ir_node *a, const ir_node *b)
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)
@@ -80,7 +82,9 @@ int values_interfere(const ir_node *a, const ir_node *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.
@@ -89,6 +93,7 @@ int values_interfere(const ir_node *a, const ir_node *b)
const ir_node *user = edge->src;
if(get_nodes_block(user) == bb
&& !is_Phi(user)
+ && b != user
&& value_dominates(b, user))
return 1;
}