diff gcc/tree-scalar-evolution.c @ 47:3bfb6c00c1e0

update it from 4.4.2 to 4.4.3.
author kent <kent@cr.ie.u-ryukyu.ac.jp>
date Sun, 07 Feb 2010 17:44:34 +0900
parents 58ad6c70ea60
children 77e2b8dfacca
line wrap: on
line diff
--- a/gcc/tree-scalar-evolution.c	Sun Feb 07 17:43:48 2010 +0900
+++ b/gcc/tree-scalar-evolution.c	Sun Feb 07 17:44:34 2010 +0900
@@ -2186,8 +2186,19 @@
       if (CHREC_LEFT (chrec) != op0
 	  || CHREC_RIGHT (chrec) != op1)
 	{
+	  unsigned var = CHREC_VARIABLE (chrec);
+
+	  /* When the instantiated stride or base has an evolution in an
+	     innermost loop, return chrec_dont_know, as this is not a
+	     valid SCEV representation.  In the reduced testcase for
+	     PR40281 we would have {0, +, {1, +, 1}_2}_1 that has no
+	     meaning.  */
+	  if ((tree_is_chrec (op0) && CHREC_VARIABLE (op0) > var)
+	      || (tree_is_chrec (op1) && CHREC_VARIABLE (op1) > var))
+	    return chrec_dont_know;
+
 	  op1 = chrec_convert_rhs (chrec_type (op0), op1, NULL);
-	  chrec = build_polynomial_chrec (CHREC_VARIABLE (chrec), op0, op1);
+	  chrec = build_polynomial_chrec (var, op0, op1);
 	}
       return chrec;