aboutsummaryrefslogtreecommitdiff
path: root/gcc/fold-const.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2011-03-14 21:12:16 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2011-03-14 21:12:16 +0100
commit2e64f8b8f6e40ba69829f030eb9bf7220ae39bb3 (patch)
tree616419a240f8d7d0dc79298ff66f5f5b9b80dfc8 /gcc/fold-const.c
parentde888d9027079b9a38b068a4c58a8563a4a4d600 (diff)
downloadgcc-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/fold-const.c')
-rw-r--r--gcc/fold-const.c14
1 files changed, 11 insertions, 3 deletions
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,