aboutsummaryrefslogtreecommitdiff
path: root/gcc/fold-const.c
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2007-04-12 09:15:53 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2007-04-12 09:15:53 +0000
commit5852948c5b998dc8ddd9073ca68c097b96180838 (patch)
tree03bea213dba9cc1181e65e0dcad9f2ea2208af80 /gcc/fold-const.c
parentd51347f96ce3765c6fad1c4e50c2b911e350339f (diff)
downloadgcc-5852948c5b998dc8ddd9073ca68c097b96180838.zip
gcc-5852948c5b998dc8ddd9073ca68c097b96180838.tar.gz
gcc-5852948c5b998dc8ddd9073ca68c097b96180838.tar.bz2
re PR tree-optimization/24689 (operand_equal_p does not return true for some equivalent ARRAY_REF)
2007-04-12 Richard Guenther <rguenther@suse.de> PR tree-optimization/24689 PR tree-optimization/31307 * fold-const.c (operand_equal_p): Compare INTEGER_CST array indices by value. * gimplify.c (canonicalize_addr_expr): To be consistent with gimplify_compound_lval only set operands two and three of ARRAY_REFs if they are not gimple_min_invariant. This makes it never at this place. * tree-ssa-ccp.c (maybe_fold_offset_to_array_ref): Likewise. * g++.dg/tree-ssa/pr31307.C: New testcase. * gcc.dg/tree-ssa/pr24689.c: Likewise. From-SVN: r123736
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r--gcc/fold-const.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index ceaa446..857065f 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -2884,9 +2884,13 @@ operand_equal_p (tree arg0, tree arg1, unsigned int flags)
case ARRAY_REF:
case ARRAY_RANGE_REF:
- /* Operands 2 and 3 may be null. */
+ /* Operands 2 and 3 may be null.
+ Compare the array index by value if it is constant first as we
+ may have different types but same value here. */
return (OP_SAME (0)
- && OP_SAME (1)
+ && (tree_int_cst_equal (TREE_OPERAND (arg0, 1),
+ TREE_OPERAND (arg1, 1))
+ || OP_SAME (1))
&& OP_SAME_WITH_NULL (2)
&& OP_SAME_WITH_NULL (3));