diff options
author | Jeff Law <law@redhat.com> | 2005-07-13 10:31:23 -0600 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 2005-07-13 10:31:23 -0600 |
commit | 59f7a2023f89b0405726d42a2391bb12efb1458c (patch) | |
tree | 74485a550b11de6d6b4c0f96a5a04ad88b50adb4 /gcc/fold-const.c | |
parent | 4969c0d82c8bc9a2815883e3c968d81287c83483 (diff) | |
download | gcc-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/fold-const.c')
-rw-r--r-- | gcc/fold-const.c | 20 |
1 files changed, 17 insertions, 3 deletions
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 |