diff options
author | Roger Sayle <roger@eyesopen.com> | 2004-12-11 13:46:37 +0000 |
---|---|---|
committer | Roger Sayle <sayle@gcc.gnu.org> | 2004-12-11 13:46:37 +0000 |
commit | ec7e2228d1837ecd3dead85408930799083b04f7 (patch) | |
tree | 9034b0a5e8cd5010cf9987f03fb424de0e508885 /gcc | |
parent | 49e4d5803eefeeb9d791af1900877831ce94481a (diff) | |
download | gcc-ec7e2228d1837ecd3dead85408930799083b04f7.zip gcc-ec7e2228d1837ecd3dead85408930799083b04f7.tar.gz gcc-ec7e2228d1837ecd3dead85408930799083b04f7.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fold-const.c | 12 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr18921-1.c | 20 |
4 files changed, 37 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 61951ee..48dbd15 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2004-12-11 Roger Sayle <roger@eyesopen.com> + + 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 <dave.anglin@nrc-cnrc.gc.ca> * 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 878cbd9..da7a284 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 5fb65ed..50912ca9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-12-11 Roger Sayle <roger@eyesopen.com> + + PR middle-end/18921 + * gcc.dg/pr18921-1.c: New test case. + 2004-12-11 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de> 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 0000000..b8c91aa --- /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; +} + |