From ec7e2228d1837ecd3dead85408930799083b04f7 Mon Sep 17 00:00:00 2001 From: Roger Sayle Date: Sat, 11 Dec 2004 13:46:37 +0000 Subject: [PATCH] re PR middle-end/18921 (wrong code with operator "?") PR middle-end/18921 * fold-const.c (fold_unwidened_comparison): Use omit_one_operand instead of constant_boolean_node as arg0 may have side-effects. * gcc.dg/pr18921-1.c: New test case. From-SVN: r92030 --- gcc/ChangeLog | 6 ++++++ gcc/fold-const.c | 12 ++++++------ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr18921-1.c | 20 ++++++++++++++++++++ 4 files changed, 37 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr18921-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 61951ee86ac..48dbd15481d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2004-12-11 Roger Sayle + + PR middle-end/18921 + * fold-const.c (fold_unwidened_comparison): Use omit_one_operand + instead of constant_boolean_node as arg0 may have side-effects. + 2004-12-10 John David Anglin * pa-host.c (pa_gt_pch_use_address): Use lseek and read to copy PCH diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 878cbd9a2d8..da7a284be49 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -6023,27 +6023,27 @@ fold_widened_comparison (enum tree_code code, tree type, tree arg0, tree arg1) { case EQ_EXPR: if (above || below) - return constant_boolean_node (false, type); + return omit_one_operand (type, integer_zero_node, arg0); break; case NE_EXPR: if (above || below) - return constant_boolean_node (true, type); + return omit_one_operand (type, integer_one_node, arg0); break; case LT_EXPR: case LE_EXPR: if (above) - return constant_boolean_node (true, type); + return omit_one_operand (type, integer_one_node, arg0); else if (below) - return constant_boolean_node (false, type);; + return omit_one_operand (type, integer_zero_node, arg0); case GT_EXPR: case GE_EXPR: if (above) - return constant_boolean_node (false, type); + return omit_one_operand (type, integer_zero_node, arg0); else if (below) - return constant_boolean_node (true, type);; + return omit_one_operand (type, integer_one_node, arg0); default: break; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5fb65ed0111..50912ca9b4b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-12-11 Roger Sayle + + PR middle-end/18921 + * gcc.dg/pr18921-1.c: New test case. + 2004-12-11 Tobias Schlueter PR fortran/17175 diff --git a/gcc/testsuite/gcc.dg/pr18921-1.c b/gcc/testsuite/gcc.dg/pr18921-1.c new file mode 100644 index 00000000000..b8c91aa0948 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr18921-1.c @@ -0,0 +1,20 @@ +/* PR middle-end/18921 */ +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +extern void abort (void); + +int foo (int k) +{ + unsigned char j = 0; + (k ? 0 : j++) == -1; + return j; +} + +int main () +{ + if (!foo (0)) + abort (); + return 0; +} + -- 2.30.2