OSDN Git Service

PR middle-end/55219
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 7 Nov 2012 22:28:32 +0000 (22:28 +0000)
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 7 Nov 2012 22:28:32 +0000 (22:28 +0000)
* fold-const.c (fold_binary_op_with_conditional_arg): Do not fold if
the argument is itself a conditional expression.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@193313 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/20121107-1.c [new file with mode: 0644]

index 8467e9e..71d14d8 100644 (file)
@@ -1,3 +1,9 @@
+2012-11-07  Eric Botcazou  <ebotcazou@adacore.com>
+
+       PR middle-end/55219
+       * fold-const.c (fold_binary_op_with_conditional_arg): Do not fold if
+       the argument is itself a conditional expression.
+
 2012-11-05  H.J. Lu  <hongjiu.lu@intel.com>
 
        * config/i386/i386.c (print_reg): Replace REX_INT_REG_P with
index 3636a2f..d5fd2a4 100644 (file)
@@ -6026,10 +6026,11 @@ fold_binary_op_with_conditional_arg (location_t loc,
     }
 
   /* This transformation is only worthwhile if we don't have to wrap ARG
-     in a SAVE_EXPR and the operation can be simplified on at least one
-     of the branches once its pushed inside the COND_EXPR.  */
+     in a SAVE_EXPR and the operation can be simplified without recursing
+     on at least one of the branches once its pushed inside the COND_EXPR.  */
   if (!TREE_CONSTANT (arg)
       && (TREE_SIDE_EFFECTS (arg)
+         || TREE_CODE (arg) == COND_EXPR || TREE_CODE (arg) == VEC_COND_EXPR
          || TREE_CONSTANT (true_value) || TREE_CONSTANT (false_value)))
     return NULL_TREE;
 
index d14f660..6e4a181 100644 (file)
@@ -1,3 +1,7 @@
+2012-11-07  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc.c-torture/compile/20121107-1.c: New test.
+
 2012-11-06  Janus Weil  <janus@gcc.gnu.org>
 
        PR fortran/54917
diff --git a/gcc/testsuite/gcc.c-torture/compile/20121107-1.c b/gcc/testsuite/gcc.c-torture/compile/20121107-1.c
new file mode 100644 (file)
index 0000000..a862067
--- /dev/null
@@ -0,0 +1,14 @@
+/* PR middle-end/55219 */
+/* Testcase by Markus Trippelsdorf <markus@trippelsdorf.de> */
+
+int x, c, d, e, f, g, h, i;
+double j;
+const int k;
+const enum { B } a;
+void
+fn1 (void)
+{
+  h = (g ? c : g ? f : g ? e : g ? i : g ? f : g ? e : g ? d : x)
+      + (a ? : a ? : a ? : a ? : a ? : a ? : a ? : a ? : a ? : a ? : a
+         ? j : a ? : 0 ? : a ? : a ? : a ? : a ? : a ? : a ? k : a ? : x);
+}