aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-sccvn.c
diff options
context:
space:
mode:
authorPaolo Bonzini <bonzini@gnu.org>2009-02-06 07:33:05 +0000
committerPaolo Bonzini <bonzini@gcc.gnu.org>2009-02-06 07:33:05 +0000
commit851691140a53104db9e2b1135f923618299fd92b (patch)
tree0a8d158aa9cc33fc558acdf02d5f054a85411376 /gcc/tree-ssa-sccvn.c
parentfe960d925789ffd66c24c3b2debf9c240d80eb24 (diff)
downloadgcc-851691140a53104db9e2b1135f923618299fd92b.zip
gcc-851691140a53104db9e2b1135f923618299fd92b.tar.gz
gcc-851691140a53104db9e2b1135f923618299fd92b.tar.bz2
re PR target/35659 (Miscompiled code with -O2 (but not with -O2 -funroll-loops) on ia64)
2009-02-06 Paolo Bonzini <bonzini@gnu.org> PR tree-optimization/35659 * tree-ssa-sccvn.c (vn_constant_eq, vn_reference_eq, vn_nary_op_eq vn_phi_eq): Shortcut if hashcode does not match. (vn_reference_op_compute_hash): Do not call iterative_hash_expr for NULL operands. * tree-ssa-pre.c (pre_expr_hash): Look at hashcode if available, and avoid iterative_hash_expr. (FOR_EACH_VALUE_ID_IN_SET): New. (value_id_compare): Remove. (sorted_array_from_bitmap_set): Use FOR_EACH_VALUE_ID_IN_SET to sort expressions by value id. From-SVN: r143980
Diffstat (limited to 'gcc/tree-ssa-sccvn.c')
-rw-r--r--gcc/tree-ssa-sccvn.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c
index 87ddcb6..5f4d1c5 100644
--- a/gcc/tree-ssa-sccvn.c
+++ b/gcc/tree-ssa-sccvn.c
@@ -316,6 +316,9 @@ vn_constant_eq (const void *p1, const void *p2)
const struct vn_constant_s *vc1 = (const struct vn_constant_s *) p1;
const struct vn_constant_s *vc2 = (const struct vn_constant_s *) p2;
+ if (vc1->hashcode != vc2->hashcode)
+ return false;
+
return vn_constant_eq_with_type (vc1->constant, vc2->constant);
}
@@ -386,6 +389,7 @@ vn_reference_op_eq (const void *p1, const void *p2)
{
const_vn_reference_op_t const vro1 = (const_vn_reference_op_t) p1;
const_vn_reference_op_t const vro2 = (const_vn_reference_op_t) p2;
+
return vro1->opcode == vro2->opcode
&& types_compatible_p (vro1->type, vro2->type)
&& expressions_equal_p (vro1->op0, vro2->op0)
@@ -398,9 +402,14 @@ vn_reference_op_eq (const void *p1, const void *p2)
static hashval_t
vn_reference_op_compute_hash (const vn_reference_op_t vro1)
{
- return iterative_hash_expr (vro1->op0, vro1->opcode)
- + iterative_hash_expr (vro1->op1, vro1->opcode)
- + iterative_hash_expr (vro1->op2, vro1->opcode);
+ hashval_t result = 0;
+ if (vro1->op0)
+ result += iterative_hash_expr (vro1->op0, vro1->opcode);
+ if (vro1->op1)
+ result += iterative_hash_expr (vro1->op1, vro1->opcode);
+ if (vro1->op2)
+ result += iterative_hash_expr (vro1->op2, vro1->opcode);
+ return result;
}
/* Return the hashcode for a given reference operation P1. */
@@ -442,6 +451,8 @@ vn_reference_eq (const void *p1, const void *p2)
const_vn_reference_t const vr1 = (const_vn_reference_t) p1;
const_vn_reference_t const vr2 = (const_vn_reference_t) p2;
+ if (vr1->hashcode != vr2->hashcode)
+ return false;
if (vr1->vuses == vr2->vuses
&& vr1->operands == vr2->operands)
@@ -1183,6 +1194,9 @@ vn_nary_op_eq (const void *p1, const void *p2)
const_vn_nary_op_t const vno2 = (const_vn_nary_op_t) p2;
unsigned i;
+ if (vno1->hashcode != vno2->hashcode)
+ return false;
+
if (vno1->opcode != vno2->opcode
|| !types_compatible_p (vno1->type, vno2->type))
return false;
@@ -1449,6 +1463,9 @@ vn_phi_eq (const void *p1, const void *p2)
const_vn_phi_t const vp1 = (const_vn_phi_t) p1;
const_vn_phi_t const vp2 = (const_vn_phi_t) p2;
+ if (vp1->hashcode != vp2->hashcode)
+ return false;
+
if (vp1->block == vp2->block)
{
int i;