aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRoger Sayle <roger@eyesopen.com>2004-12-11 13:46:37 +0000
committerRoger Sayle <sayle@gcc.gnu.org>2004-12-11 13:46:37 +0000
commitec7e2228d1837ecd3dead85408930799083b04f7 (patch)
tree9034b0a5e8cd5010cf9987f03fb424de0e508885 /gcc
parent49e4d5803eefeeb9d791af1900877831ce94481a (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/fold-const.c12
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr18921-1.c20
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;
+}
+