diff options
author | Paolo Bonzini <bonzini@gnu.org> | 2009-02-06 07:33:05 +0000 |
---|---|---|
committer | Paolo Bonzini <bonzini@gcc.gnu.org> | 2009-02-06 07:33:05 +0000 |
commit | 851691140a53104db9e2b1135f923618299fd92b (patch) | |
tree | 0a8d158aa9cc33fc558acdf02d5f054a85411376 /gcc/tree-ssa-sccvn.c | |
parent | fe960d925789ffd66c24c3b2debf9c240d80eb24 (diff) | |
download | gcc-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.c | 23 |
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; |