The presence of AffineIfOp inside AffineFor prevents fusion of the other loops to happen. For example:
affine.for %i0 = 0 to 10 {
affine.store %cf7, %a[%i0] : memref<10xf32>
}
affine.for %i1 = 0 to 10 {
%v0 = affine.load %a[%i1] : memref<10xf32>
affine.store %v0, %b[%i1] : memref<10xf32>
}
affine.for %i2 = 0 to 10 {
affine.if #set(%i2) {
%v0 = affine.load %b[%i2] : memref<10xf32>
}
}The first two loops were not be fused because of affine.if inside the last affine.for.
The issue seems to come from a conservative constraint that does not allow fusion if there are ops whose number of regions != 0 (affine.if is one of them).
This patch just removes such a constraint when`affine.if` is inside affine.for. The existing canFuseLoops method is able to handle affine.if correctly.
This name has become very convoluted. Isn't the same as:
hasNonAffineRegionOp
?