re PR middle-end/18921 (wrong code with operator "?")
authorRoger Sayle <roger@eyesopen.com>
Sat, 11 Dec 2004 13:46:37 +0000 (13:46 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Sat, 11 Dec 2004 13:46:37 +0000 (13:46 +0000)
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
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr18921-1.c [new file with mode: 0644]

index 61951ee86ac3aefe4a5c7757b4c0c8f50380d40d..48dbd15481d7e5e42e757fd3686937737377480a 100644 (file)
@@ -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
index 878cbd9a2d883b169e041166f13f8001b0fda472..da7a284be49961afa09afbbcd6c280b5e11b4fd0 100644 (file)
@@ -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;
index 5fb65ed0111ac88e266d7279cc9f0dea6ef1334a..50912ca9b4b7c313c7fba537d15d14b59791fbd0 100644 (file)
@@ -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 (file)
index 0000000..b8c91aa
--- /dev/null
@@ -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;
+}
+