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
?