OSDN Git Service

* tree-loop-linear.c (gather_interchange_stats): For multidimensional
authorspop <spop@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 14 Mar 2007 23:23:24 +0000 (23:23 +0000)
committerspop <spop@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 14 Mar 2007 23:23:24 +0000 (23:23 +0000)
arrays, multiply the access strides by the size of the sub-array.
* testsuite/gcc.dg/tree-ssa/ltrans-5.c: New.

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

gcc/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/ltrans-5.c [new file with mode: 0644]
gcc/tree-loop-linear.c

index 3cb3328..56d9d74 100644 (file)
@@ -1,3 +1,9 @@
+2007-03-14  Sebastian Pop  <sebastian.pop@inria.fr>
+
+       * tree-loop-linear.c (gather_interchange_stats): For multidimensional
+       arrays, multiply the access strides by the size of the sub-array.
+       * testsuite/gcc.dg/tree-ssa/ltrans-5.c: New.
+
 2007-03-14  Uros Bizjak  <ubizjak@gmail.com>
 
        * configure.ac (HAVE_AS_IX86_SAHF): On x86 targets check whether
 2007-03-14  Uros Bizjak  <ubizjak@gmail.com>
 
        * configure.ac (HAVE_AS_IX86_SAHF): On x86 targets check whether
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ltrans-5.c b/gcc/testsuite/gcc.dg/tree-ssa/ltrans-5.c
new file mode 100644 (file)
index 0000000..fae44d5
--- /dev/null
@@ -0,0 +1,17 @@
+/* { dg-do compile } */ 
+/* { dg-options "-O2 -ftree-loop-linear -fdump-tree-ltrans-all" } */
+
+int foo ()
+{
+  int A[100][1111];
+  int i, j;
+
+  for( i = 0; i < 1111; i++)
+    for( j = 0; j < 100; j++)
+      A[j][i] = 5 * A[j][i];
+
+  return A[10][10];
+}
+
+/* { dg-final { scan-tree-dump-times "transformed loop" 1 "ltrans"} } */ 
+/* { dg-final { cleanup-tree-dump "ltrans" } } */
index 61fdee3..94f3d59 100644 (file)
@@ -134,24 +134,30 @@ gather_interchange_stats (VEC (ddr_p, heap) *dependence_relations,
   for (i = 0; VEC_iterate (data_reference_p, datarefs, i, dr); i++)
     {
       unsigned int it;
   for (i = 0; VEC_iterate (data_reference_p, datarefs, i, dr); i++)
     {
       unsigned int it;
+      tree ref = DR_REF (dr);
       tree stmt = DR_STMT (dr);
       struct loop *stmt_loop = loop_containing_stmt (stmt);
       struct loop *inner_loop = first_loop->inner;
       tree stmt = DR_STMT (dr);
       struct loop *stmt_loop = loop_containing_stmt (stmt);
       struct loop *inner_loop = first_loop->inner;
-      
+
       if (inner_loop != stmt_loop 
          && !flow_loop_nested_p (inner_loop, stmt_loop))
        continue;
       if (inner_loop != stmt_loop 
          && !flow_loop_nested_p (inner_loop, stmt_loop))
        continue;
-      for (it = 0; it < DR_NUM_DIMENSIONS (dr); it++)
+
+      for (it = 0; it < DR_NUM_DIMENSIONS (dr); 
+          it++, ref = TREE_OPERAND (ref, 0))
        {
          tree chrec = DR_ACCESS_FN (dr, it);
        {
          tree chrec = DR_ACCESS_FN (dr, it);
-         tree tstride = evolution_part_in_loop_num 
-           (chrec, loop->num);
-         
+         tree tstride = evolution_part_in_loop_num (chrec, loop->num);
+         tree array_size = TYPE_SIZE (TREE_TYPE (ref));
+
          if (tstride == NULL_TREE
          if (tstride == NULL_TREE
-             || TREE_CODE (tstride) != INTEGER_CST)
+             || array_size == NULL_TREE 
+             || TREE_CODE (tstride) != INTEGER_CST
+             || TREE_CODE (array_size) != INTEGER_CST)
            continue;
            continue;
-         
-         (*access_strides) += int_cst_value (tstride);
+
+         (*access_strides) += 
+           int_cst_value (array_size) * int_cst_value (tstride);
        }
     }
 }
        }
     }
 }