diff options
author | Richard Guenther <rguenther@suse.de> | 2008-03-26 15:07:27 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2008-03-26 15:07:27 +0000 |
commit | 2041e75c3cee7c6636283cf056c1f8f58478d393 (patch) | |
tree | a91eff174d12923082c681b930fb2889f199f561 /gcc | |
parent | aefa9d43dcc6925454a258b8107e91462e60beac (diff) | |
download | gcc-2041e75c3cee7c6636283cf056c1f8f58478d393.zip gcc-2041e75c3cee7c6636283cf056c1f8f58478d393.tar.gz gcc-2041e75c3cee7c6636283cf056c1f8f58478d393.tar.bz2 |
revert: fold-const.c (target.h): Include.
2008-03-26 Richard Guenther <rguenther@suse.de>
Revert
2008-03-26 Richard Guenther <rguenther@suse.de>
* fold-const.c (target.h): Include.
(fold_comparison): Fold comparison of addresses of two decls
that bind locally. Consolidate address folding code.
* gcc.dg/fold-addr-1.c: New testcase.
From-SVN: r133608
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/fold-const.c | 71 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/fold-addr-1.c | 10 |
4 files changed, 48 insertions, 49 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f8bbc30..20c7e99 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2008-03-26 Richard Guenther <rguenther@suse.de> + + Revert + 2008-03-26 Richard Guenther <rguenther@suse.de> + + * fold-const.c (target.h): Include. + (fold_comparison): Fold comparison of addresses of two decls + that bind locally. Consolidate address folding code. + 2008-03-26 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> * builtins.c (expand_builtin_pow, fold_builtin_cabs, diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 4964ef7..3bfe52e 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -58,7 +58,6 @@ along with GCC; see the file COPYING3. If not see #include "rtl.h" #include "expr.h" #include "tm_p.h" -#include "target.h" #include "toplev.h" #include "intl.h" #include "ggc.h" @@ -8482,12 +8481,11 @@ fold_comparison (enum tree_code code, tree type, tree op0, tree op1) HOST_WIDE_INT bitsize, bitpos0 = 0, bitpos1 = 0; enum machine_mode mode; int volatilep, unsignedp; - bool indirect_base0 = false, indirect_base1 = false; + bool indirect_base0 = false; /* Get base and offset for the access. Strip ADDR_EXPR for get_inner_reference, but put it back by stripping INDIRECT_REF - off the base object if possible. indirect_baseN will be true - if baseN is not an address but refers to the object itself. */ + off the base object if possible. */ base0 = arg0; if (TREE_CODE (arg0) == ADDR_EXPR) { @@ -8511,19 +8509,24 @@ fold_comparison (enum tree_code code, tree type, tree op0, tree op1) base1 = get_inner_reference (TREE_OPERAND (arg1, 0), &bitsize, &bitpos1, &offset1, &mode, &unsignedp, &volatilep, false); - if (TREE_CODE (base1) == INDIRECT_REF) + /* We have to make sure to have an indirect/non-indirect base1 + just the same as we did for base0. */ + if (TREE_CODE (base1) == INDIRECT_REF + && !indirect_base0) base1 = TREE_OPERAND (base1, 0); - else - indirect_base1 = true; + else if (!indirect_base0) + base1 = NULL_TREE; } else if (TREE_CODE (arg1) == POINTER_PLUS_EXPR) { base1 = TREE_OPERAND (arg1, 0); offset1 = TREE_OPERAND (arg1, 1); } + else if (indirect_base0) + base1 = NULL_TREE; /* If we have equivalent bases we might be able to simplify. */ - if (indirect_base0 == indirect_base1 + if (base0 && base1 && operand_equal_p (base0, base1, 0)) { /* We can fold this expression to a constant if the non-constant @@ -8578,37 +8581,6 @@ fold_comparison (enum tree_code code, tree type, tree op0, tree op1) return fold_build2 (code, type, offset0, offset1); } } - /* For non-equal bases we can simplify if they are plain decls. */ - else if (!indirect_base0 && !indirect_base1 - && TREE_CODE (arg0) == ADDR_EXPR - && TREE_CODE (arg1) == ADDR_EXPR - && DECL_P (base0) && DECL_P (base1) - && !operand_equal_p (base0, base1, 0) - && targetm.binds_local_p (base0) - && targetm.binds_local_p (base1)) - { - if (code == EQ_EXPR) - return omit_two_operands (type, boolean_false_node, arg0, arg1); - else if (code == NE_EXPR) - return omit_two_operands (type, boolean_true_node, arg0, arg1); - } - /* For equal offsets we can simplify to a comparison of the - base addresses. */ - else if (bitpos0 == bitpos1 - && (indirect_base0 - ? base0 != TREE_OPERAND (arg0, 0) : base0 != arg0) - && (indirect_base1 - ? base1 != TREE_OPERAND (arg1, 0) : base1 != arg1) - && ((offset0 == offset1) - || (offset0 && offset1 - && operand_equal_p (offset0, offset1, 0)))) - { - if (indirect_base0) - base0 = fold_addr_expr (base0); - if (indirect_base1) - base1 = fold_addr_expr (base1); - return fold_build2 (code, type, base0, base1); - } } /* Transform comparisons of the form X +- C1 CMP Y +- C2 to @@ -8955,6 +8927,27 @@ fold_comparison (enum tree_code code, tree type, tree op0, tree op1) } } + /* Fold a comparison of the address of COMPONENT_REFs with the same + type and component to a comparison of the address of the base + object. In short, &x->a OP &y->a to x OP y and + &x->a OP &y.a to x OP &y */ + if (TREE_CODE (arg0) == ADDR_EXPR + && TREE_CODE (TREE_OPERAND (arg0, 0)) == COMPONENT_REF + && TREE_CODE (arg1) == ADDR_EXPR + && TREE_CODE (TREE_OPERAND (arg1, 0)) == COMPONENT_REF) + { + tree cref0 = TREE_OPERAND (arg0, 0); + tree cref1 = TREE_OPERAND (arg1, 0); + if (TREE_OPERAND (cref0, 1) == TREE_OPERAND (cref1, 1)) + { + tree op0 = TREE_OPERAND (cref0, 0); + tree op1 = TREE_OPERAND (cref1, 0); + return fold_build2 (code, type, + fold_addr_expr (op0), + fold_addr_expr (op1)); + } + } + /* We can fold X/C1 op C2 where C1 and C2 are integer constants into a single range test. */ if ((TREE_CODE (arg0) == TRUNC_DIV_EXPR diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a8f5511..0ad8102 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2008-03-26 Richard Guenther <rguenther@suse.de> + + Revert + 2008-03-26 Richard Guenther <rguenther@suse.de> + + * gcc.dg/fold-addr-1.c: New testcase. + 2008-03-26 Uros Bizjak <ubizjak@gmail.com> * gcc.target/i386/sse-13.c: Include <mm_malloc.h> diff --git a/gcc/testsuite/gcc.dg/fold-addr-1.c b/gcc/testsuite/gcc.dg/fold-addr-1.c deleted file mode 100644 index 7323ffd..0000000 --- a/gcc/testsuite/gcc.dg/fold-addr-1.c +++ /dev/null @@ -1,10 +0,0 @@ -/* { dg-do compile } */ -/* { dg-options "-fdump-tree-original" } */ - -int bar(char p1, char p2) -{ - return &p1 == &p2; -} - -/* { dg-final { scan-tree-dump "return 0;" "original" } } */ -/* { dg-final { cleanup-tree-dump "original" } } */ |