aboutsummaryrefslogtreecommitdiff
path: root/gcc/fold-const.c
diff options
context:
space:
mode:
authorAndrew Pinski <pinskia@physics.uc.edu>2005-11-27 21:31:36 +0000
committerAndrew Pinski <pinskia@gcc.gnu.org>2005-11-27 13:31:36 -0800
commit965d7fa40ee25eb6d5168ddbbb2c6541e4558c2d (patch)
treeb7fdf4f01178be8199203636f4b7c9cb41de7ae9 /gcc/fold-const.c
parenta0a7fbc94e5c317cbb5f5164ee626f51ae6844d3 (diff)
downloadgcc-965d7fa40ee25eb6d5168ddbbb2c6541e4558c2d.zip
gcc-965d7fa40ee25eb6d5168ddbbb2c6541e4558c2d.tar.gz
gcc-965d7fa40ee25eb6d5168ddbbb2c6541e4558c2d.tar.bz2
re PR tree-optimization/24575 (-(i /10) is not foldded to i/-10)
2005-11-27 Andrew Pinski <pinskia@physics.uc.edu> PR middle-end/24575 * fold-const.c (negate_expr_p): Add case for signed divides if overflow is undefined. (negate_expr): Likewise. 2005-11-27 Andrew Pinski <pinskia@physics.uc.edu> PR middle-end/24575 * gcc.dg/tree-ssa/divide-3.c: New test. * gcc.dg/tree-ssa/divide-4.c: New test. From-SVN: r107575
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r--gcc/fold-const.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 63f1294..45863ee 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -991,6 +991,16 @@ negate_expr_p (tree t)
|| negate_expr_p (TREE_OPERAND (t, 0));
break;
+ case TRUNC_DIV_EXPR:
+ case ROUND_DIV_EXPR:
+ case FLOOR_DIV_EXPR:
+ case CEIL_DIV_EXPR:
+ case EXACT_DIV_EXPR:
+ if (TYPE_UNSIGNED (TREE_TYPE (t)) || flag_wrapv)
+ break;
+ return negate_expr_p (TREE_OPERAND (t, 1))
+ || negate_expr_p (TREE_OPERAND (t, 0));
+
case NOP_EXPR:
/* Negate -((double)float) as (double)(-float). */
if (TREE_CODE (type) == REAL_TYPE)
@@ -1132,6 +1142,28 @@ negate_expr (tree t)
}
break;
+ case TRUNC_DIV_EXPR:
+ case ROUND_DIV_EXPR:
+ case FLOOR_DIV_EXPR:
+ case CEIL_DIV_EXPR:
+ case EXACT_DIV_EXPR:
+ if (!TYPE_UNSIGNED (TREE_TYPE (t)) && !flag_wrapv)
+ {
+ tem = TREE_OPERAND (t, 1);
+ if (negate_expr_p (tem))
+ return fold_convert (type,
+ fold_build2 (TREE_CODE (t), TREE_TYPE (t),
+ TREE_OPERAND (t, 0),
+ negate_expr (tem)));
+ tem = TREE_OPERAND (t, 0);
+ if (negate_expr_p (tem))
+ return fold_convert (type,
+ fold_build2 (TREE_CODE (t), TREE_TYPE (t),
+ negate_expr (tem),
+ TREE_OPERAND (t, 1)));
+ }
+ break;
+
case NOP_EXPR:
/* Convert -((double)float) into (double)(-float). */
if (TREE_CODE (type) == REAL_TYPE)