re PR tree-optimization/58453 (Revision 202431 results in miscompare for CPU2006 434.zeusmp)

2013-09-20  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/58453
	* tree-loop-distribution.c (distribute_loop): Apply the cost
	model for -ftree-loop-distribute-patterns, too.

	* gcc.dg/tree-ssa/ldist-23.c: New testcase.

From-SVN: r202775
This commit is contained in:
Richard Biener 2013-09-20 12:21:08 +00:00 committed by Richard Biener
parent a820c83467
commit 9fed7f3aa8
4 changed files with 86 additions and 40 deletions

View File

@ -1,3 +1,9 @@
2013-09-20 Richard Biener <rguenther@suse.de>
PR tree-optimization/58453
* tree-loop-distribution.c (distribute_loop): Apply the cost
model for -ftree-loop-distribute-patterns, too.
2013-09-20 Richard Biener <rguenther@suse.de>
PR middle-end/58473

View File

@ -1,3 +1,8 @@
2013-09-20 Richard Biener <rguenther@suse.de>
PR tree-optimization/58453
* gcc.dg/tree-ssa/ldist-23.c: New testcase.
2013-09-20 Janus Weil <janus@gcc.gnu.org>
PR fortran/58099

View File

@ -0,0 +1,34 @@
/* { dg-do run } */
/* { dg-options "-O3 -fdump-tree-ldist-details" } */
extern void abort (void);
int a[128], b[128], c[128], d[128];
void __attribute__((noinline,noclone))
foo (void)
{
int i;
for (i = 0; i < 128; ++i)
{
a[i] = a[i] + 1;
b[i] = d[i];
c[i] = a[i] / d[i];
}
}
int main()
{
int i;
for (i = 0; i < 128; ++i)
a[i] = i;
for (i = 0; i < 128; ++i)
d[i] = 1;
foo ();
if (c[0] != 1)
abort ();
return 0;
}
/* { dg-final { scan-tree-dump "split to 2 loops" "ldist" } } */
/* { dg-final { scan-tree-dump "generated memcpy" "ldist" } } */
/* { dg-final { cleanup-tree-dump "ldist" } } */

View File

@ -1514,18 +1514,51 @@ distribute_loop (struct loop *loop, vec<gimple> stmts,
any_builtin |= partition_builtin_p (partition);
}
/* If we did not detect any builtin but are not asked to apply
regular loop distribution simply bail out. */
if (!flag_tree_loop_distribution
&& !any_builtin)
{
nbp = 0;
goto ldist_done;
}
/* Apply our simple cost model - fuse partitions with similar
memory accesses. */
partition_t into;
for (i = 0; partitions.iterate (i, &into); ++i)
{
if (partition_builtin_p (into))
continue;
for (int j = i + 1;
partitions.iterate (j, &partition); ++j)
{
if (!partition_builtin_p (partition)
&& similar_memory_accesses (rdg, into, partition))
{
if (dump_file && (dump_flags & TDF_DETAILS))
{
fprintf (dump_file, "fusing partitions\n");
dump_bitmap (dump_file, into->stmts);
dump_bitmap (dump_file, partition->stmts);
fprintf (dump_file, "because they have similar "
"memory accesses\n");
}
bitmap_ior_into (into->stmts, partition->stmts);
if (partition->kind == PKIND_REDUCTION)
into->kind = PKIND_REDUCTION;
partitions.ordered_remove (j);
partition_free (partition);
j--;
}
}
}
/* If we are only distributing patterns fuse all partitions that
were not properly classified as builtins. Else fuse partitions
with similar memory accesses. */
were not properly classified as builtins. */
if (!flag_tree_loop_distribution)
{
partition_t into;
/* If we did not detect any builtin simply bail out. */
if (!any_builtin)
{
nbp = 0;
goto ldist_done;
}
/* Only fuse adjacent non-builtin partitions, see PR53616.
??? Use dependence information to improve partition ordering. */
i = 0;
@ -1549,38 +1582,6 @@ distribute_loop (struct loop *loop, vec<gimple> stmts,
}
while ((unsigned) i < partitions.length ());
}
else
{
partition_t into;
int j;
for (i = 0; partitions.iterate (i, &into); ++i)
{
if (partition_builtin_p (into))
continue;
for (j = i + 1;
partitions.iterate (j, &partition); ++j)
{
if (!partition_builtin_p (partition)
&& similar_memory_accesses (rdg, into, partition))
{
if (dump_file && (dump_flags & TDF_DETAILS))
{
fprintf (dump_file, "fusing partitions\n");
dump_bitmap (dump_file, into->stmts);
dump_bitmap (dump_file, partition->stmts);
fprintf (dump_file, "because they have similar "
"memory accesses\n");
}
bitmap_ior_into (into->stmts, partition->stmts);
if (partition->kind == PKIND_REDUCTION)
into->kind = PKIND_REDUCTION;
partitions.ordered_remove (j);
partition_free (partition);
j--;
}
}
}
}
/* Fuse all reduction partitions into the last. */
if (partitions.length () > 1)