forked from OSchip/llvm-project
c8fc5c0385
This patch adds support for producer-consumer fusion scenarios with multiple producer stores to the AffineLoopFusion pass. The patch introduces some changes to the producer-consumer algorithm, including: * For a given consumer loop, producer-consumer fusion iterates over its producer candidates until a fixed point is reached. * Producer candidates are gathered beforehand for each iteration of the consumer loop and visited in reverse program order (not strictly guaranteed) to maximize the number of loops fused per iteration. In general, these changes were needed to simplify the multi-store producer support and remove some of the workarounds that were introduced in the past to support more fusion cases under the single-store producer limitation. This patch also preserves the existing functionality of AffineLoopFusion with one minor change in behavior. Producer-consumer fusion didn't fuse scenarios with escaping memrefs and multiple outgoing edges (from a single store). Multi-store producer scenarios will usually (always?) have multiple outgoing edges so we couldn't fuse any with escaping memrefs, which would greatly limit the applicability of this new feature. Therefore, the patch enables fusion for these scenarios. Please, see modified tests for specific details. Reviewed By: andydavis1, bondhugula Differential Revision: https://reviews.llvm.org/D92876 |
||
---|---|---|
.. | ||
Utils | ||
BufferDeallocation.cpp | ||
BufferOptimizations.cpp | ||
BufferResultsToOutParams.cpp | ||
BufferUtils.cpp | ||
Bufferize.cpp | ||
CMakeLists.txt | ||
CSE.cpp | ||
Canonicalizer.cpp | ||
CopyRemoval.cpp | ||
Inliner.cpp | ||
LocationSnapshot.cpp | ||
LoopCoalescing.cpp | ||
LoopFusion.cpp | ||
LoopInvariantCodeMotion.cpp | ||
MemRefDataFlowOpt.cpp | ||
NormalizeMemRefs.cpp | ||
OpStats.cpp | ||
ParallelLoopCollapsing.cpp | ||
PassDetail.h | ||
PipelineDataTransfer.cpp | ||
SCCP.cpp | ||
StripDebugInfo.cpp | ||
SymbolDCE.cpp | ||
ViewOpGraph.cpp | ||
ViewRegionGraph.cpp |