summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr31343.c35
-rw-r--r--gcc/tree-chrec.h35
3 files changed, 58 insertions, 19 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d5f2ac7b5a6..ef788643cd8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2007-04-10 Sebastian Pop <sebastian.pop@inria.fr>
+
+ PR tree-optimization/31343
+ * tree-chrec.h (chrec_zerop): Moved before build_polynomial_chrec.
+ (build_polynomial_chrec): Return a scalar when the evolution is zero.
+ * testsuite/gcc.dg/vect/pr31343.c: New.
+
2007-04-10 Eric Christopher <echristo@apple.com>
* config/i386/i386.h (X87_FLOAT_MODE_P): New.
diff --git a/gcc/testsuite/gcc.dg/vect/pr31343.c b/gcc/testsuite/gcc.dg/vect/pr31343.c
new file mode 100644
index 00000000000..856422221cf
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr31343.c
@@ -0,0 +1,35 @@
+/* { dg-do compile } */
+
+#define N 16
+
+struct
+{
+ unsigned int x;
+ unsigned int y;
+} pS [100];
+
+void
+main1 ()
+{
+ int i, j;
+ unsigned int ub[N] =
+ { 1, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45 };
+ unsigned int uc[N] =
+ { 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
+ unsigned int udiffx, udiffy;
+
+ for (i = 0; i < N; i++)
+ {
+ pS[i].x = 0;
+ pS[i].y = 0;
+ for (j = 0; j < N; j++)
+ {
+ udiffx = (ub[j] - uc[j]);
+ udiffy = (ub[j] - uc[j]);
+ pS[i].x = udiffx;
+ pS[i].y = udiffy;
+ }
+ }
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/tree-chrec.h b/gcc/tree-chrec.h
index c22867ba0d2..95c6f384dde 100644
--- a/gcc/tree-chrec.h
+++ b/gcc/tree-chrec.h
@@ -84,7 +84,19 @@ extern bool evolution_function_is_affine_multivariate_p (tree);
extern bool evolution_function_is_univariate_p (tree);
extern unsigned nb_vars_in_chrec (tree);
-
+/* Determines whether CHREC is equal to zero. */
+
+static inline bool
+chrec_zerop (tree chrec)
+{
+ if (chrec == NULL_TREE)
+ return false;
+
+ if (TREE_CODE (chrec) == INTEGER_CST)
+ return integer_zerop (chrec);
+
+ return false;
+}
/* Build a polynomial chain of recurrence. */
@@ -99,28 +111,13 @@ build_polynomial_chrec (unsigned loop_num,
gcc_assert (TREE_TYPE (left) == TREE_TYPE (right));
+ if (chrec_zerop (right))
+ return left;
+
return build3 (POLYNOMIAL_CHREC, TREE_TYPE (left),
build_int_cst (NULL_TREE, loop_num), left, right);
}
-
-
-/* Observers. */
-
-/* Determines whether CHREC is equal to zero. */
-
-static inline bool
-chrec_zerop (tree chrec)
-{
- if (chrec == NULL_TREE)
- return false;
-
- if (TREE_CODE (chrec) == INTEGER_CST)
- return integer_zerop (chrec);
-
- return false;
-}
-
/* Determines whether the expression CHREC is a constant. */
static inline bool