aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2022-07-18 13:09:57 +0200
committerRichard Biener <rguenther@suse.de>2022-07-18 14:42:51 +0200
commit87f46a16ec05beb51439f55a4d3c36d64b95b00f (patch)
treea52b3bca598e579e167ef85c61260860aebb43a9
parentc8697735abaca3b3dfe8ae4188a086d1fd7048eb (diff)
downloadgcc-87f46a16ec05beb51439f55a4d3c36d64b95b00f.zip
gcc-87f46a16ec05beb51439f55a4d3c36d64b95b00f.tar.gz
gcc-87f46a16ec05beb51439f55a4d3c36d64b95b00f.tar.bz2
Fix builtin vs non-builtin partition merge in loop distribution
When r7-6373-g40b6bff965d004 fixed a costing issue it failed to make the logic symmetric which means that we now fuse normal vs. builtin when the cost model says so but we don't fuse builtin vs. normal. The following fixes that, also allowing the cost model to decide to fuse two builtin partitions as otherwise an intermediate non-builtin can result in a partial merge as well. * tree-loop-distribution.cc (loop_distribution::distribute_loop): When computing cost-based merging do not disregard builtin classified partitions in some cases. * gcc.dg/tree-ssa/ldist-24.c: XFAIL. * gcc.dg/tree-ssa/ldist-36.c: Adjust expected outcome.
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/ldist-24.c5
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/ldist-36.c3
-rw-r--r--gcc/tree-loop-distribution.cc5
3 files changed, 6 insertions, 7 deletions
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ldist-24.c b/gcc/testsuite/gcc.dg/tree-ssa/ldist-24.c
index 75f7b8f..2403a24 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/ldist-24.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/ldist-24.c
@@ -20,5 +20,6 @@ void foo ()
}
}
-/* { dg-final { scan-tree-dump "generated memcpy" "ldist" } } */
-/* { dg-final { scan-tree-dump "generated memset zero" "ldist" } } */
+/* The cost modeling does not consider WAR as beneficial to split. */
+/* { dg-final { scan-tree-dump "generated memcpy" "ldist" { xfail *-*-* } } } */
+/* { dg-final { scan-tree-dump "generated memset zero" "ldist" { xfail *-*-* } } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ldist-36.c b/gcc/testsuite/gcc.dg/tree-ssa/ldist-36.c
index 07393f0..6d56006 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/ldist-36.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/ldist-36.c
@@ -25,4 +25,5 @@ foo (struct st * restrict p)
}
}
-/* { dg-final { scan-tree-dump-times "Loop nest . distributed: split to 0 loops and 3 library" 1 "ldist" } } */
+/* The cost modeling doesn't consider splitting a WAR re-use profitable. */
+/* { dg-final { scan-tree-dump-times "Loop nest . distributed: split to 1 loops and 1 library" 1 "ldist" } } */
diff --git a/gcc/tree-loop-distribution.cc b/gcc/tree-loop-distribution.cc
index 0714bc4..0ee441c 100644
--- a/gcc/tree-loop-distribution.cc
+++ b/gcc/tree-loop-distribution.cc
@@ -3090,10 +3090,7 @@ loop_distribution::distribute_loop (class loop *loop,
for (i = 0; partitions.iterate (i, &into); ++i)
{
bool changed = false;
- if (partition_builtin_p (into) || into->kind == PKIND_PARTIAL_MEMSET)
- continue;
- for (int j = i + 1;
- partitions.iterate (j, &partition); ++j)
+ for (int j = i + 1; partitions.iterate (j, &partition); ++j)
{
if (share_memory_accesses (rdg, into, partition))
{