From 212f6d6d5ed26eb3192806ee6bfe9ee11ff65348 Mon Sep 17 00:00:00 2001 From: pinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4> Date: Sun, 27 Nov 2005 21:31:36 +0000 Subject: [PATCH] 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@107575 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 7 ++++++ gcc/fold-const.c | 32 ++++++++++++++++++++++++ gcc/testsuite/ChangeLog | 6 +++++ gcc/testsuite/gcc.dg/tree-ssa/divide-3.c | 14 +++++++++++ gcc/testsuite/gcc.dg/tree-ssa/divide-4.c | 14 +++++++++++ 5 files changed, 73 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/divide-3.c create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/divide-4.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 446ae10f91af..615160c8fe57 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,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 Andreas Schwab <schwab@suse.de> * config/m68k/m68k.c: Reindent and fix whitespace, remove diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 63f12949ab71..45863ee77e3c 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) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index cb6923587468..8c38c8803177 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +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. + 2005-11-27 Steven G. Kargl <kargls@comcast.net> PR fortran/24917 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/divide-3.c b/gcc/testsuite/gcc.dg/tree-ssa/divide-3.c new file mode 100644 index 000000000000..fa3e35a6a0be --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/divide-3.c @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O1 -fdump-tree-optimized" } */ + +int f(int a) +{ + return -(a/10); +} + +/* { dg-final { scan-tree-dump-times "a / 10" 0 "optimized"} } */ +/* { dg-final { scan-tree-dump-times "a / -10" 1 "optimized"} } */ + +/* { dg-final { cleanup-tree-dump "optimized" } } */ + + diff --git a/gcc/testsuite/gcc.dg/tree-ssa/divide-4.c b/gcc/testsuite/gcc.dg/tree-ssa/divide-4.c new file mode 100644 index 000000000000..38c68cf6e8dd --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/divide-4.c @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O1 -fdump-tree-optimized" } */ + +int f(int a) +{ + return -(-a/10); +} + +/* { dg-final { scan-tree-dump-times "-a / 10" 0 "optimized"} } */ +/* { dg-final { scan-tree-dump-times "a / 10" 1 "optimized"} } */ + +/* { dg-final { cleanup-tree-dump "optimized" } } */ + + -- GitLab