re PR middle-end/55219 (memory explosion on nested conditional expressions)
authorEric Botcazou <ebotcazou@adacore.com>
Wed, 7 Nov 2012 22:26:02 +0000 (22:26 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Wed, 7 Nov 2012 22:26:02 +0000 (22:26 +0000)
PR middle-end/55219
* fold-const.c (fold_binary_op_with_conditional_arg): Do not fold if
the argument is itself a conditional expression.

From-SVN: r193312

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

index 294b3a5..b11e703 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-07  Vladimir Makarov  <vmakarov@redhat.com>
 
        PR rtl-optimization/55122
index 62a4e21..4fa1fd6 100644 (file)
@@ -5987,10 +5987,11 @@ fold_binary_op_with_conditional_arg (location_t loc,
     cond_code = VEC_COND_EXPR;
 
   /* 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 311188c..302daff 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-07  Vladimir Makarov  <vmakarov@redhat.com>
 
        PR rtl-optimization/55151
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);
+}