diff options
author | Jakub Jelinek <jakub@redhat.com> | 2011-03-14 21:12:16 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2011-03-14 21:12:16 +0100 |
commit | 2e64f8b8f6e40ba69829f030eb9bf7220ae39bb3 (patch) | |
tree | 616419a240f8d7d0dc79298ff66f5f5b9b80dfc8 /gcc | |
parent | de888d9027079b9a38b068a4c58a8563a4a4d600 (diff) | |
download | gcc-2e64f8b8f6e40ba69829f030eb9bf7220ae39bb3.zip gcc-2e64f8b8f6e40ba69829f030eb9bf7220ae39bb3.tar.gz gcc-2e64f8b8f6e40ba69829f030eb9bf7220ae39bb3.tar.bz2 |
re PR middle-end/38878 (gcc.dg/tree-ssa/foldaddr-1.c XFAILed)
PR middle-end/38878
* fold-const.c (fold_binary_loc) <case EQ_EXPR, NE_EXPR>: Add
STRIP_NOPS on arg0 and arg1. When optimizing X +- C == X
and C - X == X also strip nops from +/-/p+ operand.
When optimizing -X == C, fold C to arg0's type.
* gcc.dg/tree-ssa/foldaddr-1.c: Remove xfail.
From-SVN: r170957
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fold-const.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/foldaddr-1.c | 2 |
4 files changed, 23 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a9d4d62..d437a60 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2011-03-14 Jakub Jelinek <jakub@redhat.com> + PR middle-end/38878 + * fold-const.c (fold_binary_loc) <case EQ_EXPR, NE_EXPR>: Add + STRIP_NOPS on arg0 and arg1. When optimizing X +- C == X + and C - X == X also strip nops from +/-/p+ operand. + When optimizing -X == C, fold C to arg0's type. + PR debug/47946 * dwarf2out.c (add_bit_offset_attribute): If bit_offset is negative, emit it as add_AT_int instead of add_AT_unsigned. diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 957049c..354aa4f 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -12112,6 +12112,9 @@ fold_binary_loc (location_t loc, case EQ_EXPR: case NE_EXPR: + STRIP_NOPS (arg0); + STRIP_NOPS (arg1); + tem = fold_comparison (loc, code, type, op0, op1); if (tem != NULL_TREE) return tem; @@ -12194,7 +12197,8 @@ fold_binary_loc (location_t loc, /* Similarly for a NEGATE_EXPR. */ if (TREE_CODE (arg0) == NEGATE_EXPR && TREE_CODE (arg1) == INTEGER_CST - && 0 != (tem = negate_expr (arg1)) + && 0 != (tem = negate_expr (fold_convert_loc (loc, TREE_TYPE (arg0), + arg1))) && TREE_CODE (tem) == INTEGER_CST && !TREE_OVERFLOW (tem)) return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), tem); @@ -12214,7 +12218,9 @@ fold_binary_loc (location_t loc, if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == POINTER_PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR) - && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0) + && operand_equal_p (tree_strip_nop_conversions (TREE_OPERAND (arg0, + 0)), + arg1, 0) && (INTEGRAL_TYPE_P (TREE_TYPE (arg0)) || POINTER_TYPE_P (TREE_TYPE (arg0)))) { @@ -12230,7 +12236,9 @@ fold_binary_loc (location_t loc, /* Transform comparisons of the form C - X CMP X if C % 2 == 1. */ if (TREE_CODE (arg0) == MINUS_EXPR && TREE_CODE (TREE_OPERAND (arg0, 0)) == INTEGER_CST - && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0) + && operand_equal_p (tree_strip_nop_conversions (TREE_OPERAND (arg0, + 1)), + arg1, 0) && (TREE_INT_CST_LOW (TREE_OPERAND (arg0, 0)) & 1) == 1) { return omit_two_operands_loc (loc, type, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1206685..4c1bea9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-03-14 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/38878 + * gcc.dg/tree-ssa/foldaddr-1.c: Remove xfail. + 2011-03-14 Uros Bizjak <ubizjak@gmail.com> * gcc.target/i386/sse4_1-floor-vec.c: New test. diff --git a/gcc/testsuite/gcc.dg/tree-ssa/foldaddr-1.c b/gcc/testsuite/gcc.dg/tree-ssa/foldaddr-1.c index a3c6a2e..d74022e 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/foldaddr-1.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/foldaddr-1.c @@ -11,6 +11,6 @@ int foo(char *b) /* Folding should have determined that the two addresses were not identical and thus collapsed the function into a trivial "return 0". */ -/* { dg-final { scan-tree-dump-times "return 0" 1 "original" { xfail *-*-* } } } */ +/* { dg-final { scan-tree-dump-times "return 0" 1 "original" } } */ /* { dg-final { cleanup-tree-dump "original" } } */ |