This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Fix PR middle-end/55219


This is a regression present on the mainline and 4.7 branch.  For expressions 
of the form:

  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);

there is a memory explosion in the folder: fold_binary_op_with_conditional_arg 
is distributing the + inside the conditional expressions at each level 
recursively.  The transformation was originally applied only if the argument 
was TREE_CONSTANT, but during 4.7 development I extended it to more general 
arguments to help Ada.

Fixed by disabling recursion entirely, as it was originally.


Bootstrapped/regtested on x86_64-suse-linux, applied on mainline and 4.7 
branch as obvious.


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  Eric Botcazou  <ebotcazou@adacore.com>

	* gcc.c-torture/compile/20121107-1.c: New test.


-- 
Eric Botcazou
Index: fold-const.c
===================================================================
--- fold-const.c	(revision 193280)
+++ fold-const.c	(working copy)
@@ -5987,10 +5987,11 @@ fold_binary_op_with_conditional_arg (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;
 
/* 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);
}

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]