OSDN Git Service

2007-10-03 Sebastian Pop <sebastian.pop@amd.com>
authorspop <spop@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 3 Oct 2007 15:45:10 +0000 (15:45 +0000)
committerspop <spop@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 3 Oct 2007 15:45:10 +0000 (15:45 +0000)
        PR tree-optimization/33576
        * testsuite/gcc.dg/tree-ssa/pr33576.c: New.
        * tree-loop-linear.c (linear_transform_loops): Call remove_iv.
        * lambda.h (lambda_loopnest_to_gcc_loopnest): New parameter.
        (remove_iv): Declared.
        * lambda-code.c (remove_iv): Not static.
        (lambda_loopnest_to_gcc_loopnest): New parameter remove_ivs.
        Don't remove ivs there, save ivs in the buffer.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@128986 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/lambda-code.c
gcc/lambda.h
gcc/testsuite/gcc.dg/tree-ssa/pr33576.c [new file with mode: 0644]
gcc/tree-loop-linear.c

index 73010ea..e9e2b6a 100644 (file)
@@ -1,3 +1,14 @@
+2007-10-03  Sebastian Pop  <sebastian.pop@amd.com>
+
+       PR tree-optimization/33576
+       * testsuite/gcc.dg/tree-ssa/pr33576.c: New.
+       * tree-loop-linear.c (linear_transform_loops): Call remove_iv.
+       * lambda.h (lambda_loopnest_to_gcc_loopnest): New parameter.
+       (remove_iv): Declared.
+       * lambda-code.c (remove_iv): Not static.
+       (lambda_loopnest_to_gcc_loopnest): New parameter remove_ivs.
+       Don't remove ivs there, save ivs in the buffer.
+
 2007-10-03  Jason Merrill  <jason@redhat.com>
 
        PR c++/15764
index c573437..84ad869 100644 (file)
@@ -1639,7 +1639,7 @@ lle_to_gcc_expression (lambda_linear_expression lle,
 
 /* Remove the induction variable defined at IV_STMT.  */
 
-static void
+void
 remove_iv (tree iv_stmt)
 {
   if (TREE_CODE (iv_stmt) == PHI_NODE)
@@ -1692,6 +1692,7 @@ void
 lambda_loopnest_to_gcc_loopnest (struct loop *old_loopnest,
                                 VEC(tree,heap) *old_ivs,
                                 VEC(tree,heap) *invariants,
+                                VEC(tree,heap) **remove_ivs,
                                 lambda_loopnest new_loopnest,
                                  lambda_trans_matrix transform,
                                  struct obstack * lambda_obstack)
@@ -1861,7 +1862,7 @@ lambda_loopnest_to_gcc_loopnest (struct loop *old_loopnest,
        }
 
       /* Remove the now unused induction variable.  */
-      remove_iv (oldiv_stmt);
+      VEC_safe_push (tree, heap, *remove_ivs, oldiv_stmt);
     }
   VEC_free (tree, heap, new_ivs);
 }
index e7a75fd..fc28d46 100644 (file)
@@ -206,8 +206,10 @@ lambda_loopnest gcc_loopnest_to_lambda_loopnest (struct loop *,
                                                  struct obstack *);
 void lambda_loopnest_to_gcc_loopnest (struct loop *,
                                      VEC(tree,heap) *, VEC(tree,heap) *,
+                                     VEC(tree,heap) **,
                                       lambda_loopnest, lambda_trans_matrix,
                                       struct obstack *);
+void remove_iv (tree);
 
 static inline void lambda_vector_negate (lambda_vector, lambda_vector, int);
 static inline void lambda_vector_mult_const (lambda_vector, lambda_vector, int, int);
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr33576.c b/gcc/testsuite/gcc.dg/tree-ssa/pr33576.c
new file mode 100644 (file)
index 0000000..2470762
--- /dev/null
@@ -0,0 +1,20 @@
+/* { dg-do compile } */ 
+/* { dg-options "-O2 -ftree-loop-linear" } */
+
+int a1[6][4][4];
+short b1[16];
+
+int c1;
+void CalculateQuantParam(void)
+{
+  int i, j, k, temp;
+
+   for(k=0; k<6; k++)
+      for(j=0; j<4; j++)
+        for(i=0; i<4; i++)
+        {
+          temp = (i<<2)+j;
+          a1[k][j][i]  = c1/b1[temp];
+        }
+}
+
index d04045d..295993f 100644 (file)
@@ -253,7 +253,10 @@ linear_transform_loops (void)
   loop_iterator li;
   VEC(tree,heap) *oldivs = NULL;
   VEC(tree,heap) *invariants = NULL;
+  VEC(tree,heap) *remove_ivs = VEC_alloc (tree, heap, 3);
   struct loop *loop_nest;
+  tree oldiv_stmt;
+  unsigned i;
 
   FOR_EACH_LOOP (li, loop_nest, 0)
     {
@@ -351,6 +354,7 @@ linear_transform_loops (void)
        }
 
       lambda_loopnest_to_gcc_loopnest (loop_nest, oldivs, invariants,
+                                      &remove_ivs,
                                        after, trans, &lambda_obstack);
       modified = true;
 
@@ -363,8 +367,12 @@ linear_transform_loops (void)
       free_data_refs (datarefs);
     }
 
+  for (i = 0; VEC_iterate (tree, remove_ivs, i, oldiv_stmt); i++)
+    remove_iv (oldiv_stmt);
+
   VEC_free (tree, heap, oldivs);
   VEC_free (tree, heap, invariants);
+  VEC_free (tree, heap, remove_ivs);
   scev_reset ();
 
   if (modified)