This patch is a refactoring/clean-up step that is needed to add support for
producer-consumer fusion with multi-store producer loops and, in general,
to implement more general loop fusion strategies in Affine. It introduces
the following changes:
- AffineLoopFusion pass now uses loop fusion utilities more broadly to compute fusion legality (canFuseLoops utility) and perform the fusion transformation (fuseLoops utility).
- Loop fusion utilities have been extended to deal with AffineLoopFusion requirements and assumptions while preserving both loop fusion utilities and AffineLoopFusion current functionality within a unified implementation. 'FusionStrategy' has been introduced for this purpose and, in the future, it will allow us to have a single loop fusion core implementation that will produce different fusion outputs depending on the strategy used.
- Improve separation of concerns for legality and profitability analysis: 'isFusionProfitable' no longer filters out illegal scenarios that 'canFuse' didn't detect, or the other way around. 'canFuse' now takes loop dependences into account to determine the fusion loop depth (producer-consumer fusion only).
- As a result, maximal fusion now doesn't require any profitability analysis.
- Slices are now computed only once and reused across the legality, profitability and fusion transformation steps (producer-consumer).
- Refactor some utilities and remove redundant copies of them.
Despite all these changes, this patch is NFCI and should preserve the existing
functionality of both the AffineLoopFusion pass and the affine fusion utilities.
The comment isn't mentioning the per-memref behavior - this is only clear from the class code below.