tree-loop-linear.c (gather_interchange_stats): For multidimensional arrays...

* 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.

From-SVN: r122935
This commit is contained in:
Sebastian Pop 2007-03-15 00:23:24 +01:00 committed by Sebastian Pop
parent 1f7f19c46a
commit c4d8f83b55
3 changed files with 37 additions and 8 deletions

View 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

View File

@ -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" } } */

View 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;
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;
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 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
|| TREE_CODE (tstride) != INTEGER_CST)
|| array_size == NULL_TREE
|| TREE_CODE (tstride) != INTEGER_CST
|| TREE_CODE (array_size) != INTEGER_CST)
continue;
(*access_strides) += int_cst_value (tstride);
(*access_strides) +=
int_cst_value (array_size) * int_cst_value (tstride);
}
}
}