aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJeff Law <law@redhat.com>2005-07-13 10:31:23 -0600
committerJeff Law <law@gcc.gnu.org>2005-07-13 10:31:23 -0600
commit59f7a2023f89b0405726d42a2391bb12efb1458c (patch)
tree74485a550b11de6d6b4c0f96a5a04ad88b50adb4 /gcc
parent4969c0d82c8bc9a2815883e3c968d81287c83483 (diff)
downloadgcc-59f7a2023f89b0405726d42a2391bb12efb1458c.zip
gcc-59f7a2023f89b0405726d42a2391bb12efb1458c.tar.gz
gcc-59f7a2023f89b0405726d42a2391bb12efb1458c.tar.bz2
fold-const.c (fold_binary): When comparing two simple ADDR_EXPR expressions...
* fold-const.c (fold_binary): When comparing two simple ADDR_EXPR expressions, test their _DECL operands for pointer equality rather than using operand_equal_p. * gcc.dg/tree-ssa/pr22321.c: New test. From-SVN: r101974
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/fold-const.c20
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr22321.c20
4 files changed, 47 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 03ca42b..622cec8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2005-07-13 Jeff Law <law@redhat.com>
+
+ * fold-const.c (fold_binary): When comparing two simple ADDR_EXPR
+ expressions, test their _DECL operands for pointer equality rather
+ than using operand_equal_p.
+
2005-07-13 H.J. Lu <hongjiu.lu@intel.com>
* config/alpha/linux.h (TARGET_HAS_F_SETLKW): Renamed to ...
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index beee337..3bc27eb 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -8757,9 +8757,23 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1)
&& ! lookup_attribute ("alias",
DECL_ATTRIBUTES (TREE_OPERAND (arg1, 0)))
&& ! DECL_EXTERNAL (TREE_OPERAND (arg1, 0)))
- return constant_boolean_node (operand_equal_p (arg0, arg1, 0)
- ? code == EQ_EXPR : code != EQ_EXPR,
- type);
+ {
+ /* We know that we're looking at the address of two
+ non-weak, unaliased, static _DECL nodes.
+
+ It is both wasteful and incorrect to call operand_equal_p
+ to compare the two ADDR_EXPR nodes. It is wasteful in that
+ all we need to do is test pointer equality for the arguments
+ to the two ADDR_EXPR nodes. It is incorrect to use
+ operand_equal_p as that function is NOT equivalent to a
+ C equality test. It can in fact return false for two
+ objects which would test as equal using the C equality
+ operator. */
+ bool equal = TREE_OPERAND (arg0, 0) == TREE_OPERAND (arg1, 0);
+ return constant_boolean_node (equal
+ ? code == EQ_EXPR : code != EQ_EXPR,
+ type);
+ }
/* If this is a comparison of two exprs that look like an
ARRAY_REF of the same object, then we can fold this to a
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ebc793e..145830f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2005-07-13 Jeff Law <law@redhat.com>
+
+ * gcc.dg/tree-ssa/pr22321.c: New test
+
2005-07-13 Paolo Bonzini <bonzini@gnu.org>
PR tree-optimization/21921
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr22321.c b/gcc/testsuite/gcc.dg/tree-ssa/pr22321.c
new file mode 100644
index 0000000..64a94ab
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr22321.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fno-tree-vrp -fno-tree-copy-prop -fno-tree-ccp -fdump-tree-optimized" } */
+
+
+volatile int x;
+
+int main ()
+{
+ volatile int *vip;
+ vip = &x;
+ volatile int *cvip;
+ cvip = vip;
+
+ if (vip != cvip) return -1;
+ return 0;
+}
+
+/* { dg-final { scan-tree-dump-times "return 0" 1 "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
+