| // RUN: mlir-opt -pass-pipeline='builtin.module(func.func(affine-loop-fusion))' %s | FileCheck %s |
| |
| // Test fusion of affine nests in the presence of other region-holding ops |
| // (scf.for in the test case below) in the block. |
| |
| // CHECK-LABEL: func @scf_and_affine |
| func.func @scf_and_affine(%A : memref<10xf32>) { |
| %c0 = arith.constant 0 : index |
| %c1 = arith.constant 1 : index |
| %c10 = arith.constant 10 : index |
| %cst = arith.constant 0.0 : f32 |
| |
| %B = memref.alloc() : memref<10xf32> |
| %C = memref.alloc() : memref<10xf32> |
| |
| affine.for %j = 0 to 10 { |
| %v = affine.load %A[%j] : memref<10xf32> |
| affine.store %v, %B[%j] : memref<10xf32> |
| } |
| |
| affine.for %j = 0 to 10 { |
| %v = affine.load %B[%j] : memref<10xf32> |
| affine.store %v, %C[%j] : memref<10xf32> |
| } |
| // Nests are fused. |
| // CHECK: affine.for %{{.*}} = 0 to 10 |
| // CHECK-NOT: affine.for |
| // CHECK: scf.for |
| |
| scf.for %i = %c0 to %c10 step %c1 { |
| memref.store %cst, %B[%i] : memref<10xf32> |
| } |
| |
| // The nests below shouldn't be fused. |
| affine.for %j = 0 to 10 { |
| %v = affine.load %A[%j] : memref<10xf32> |
| affine.store %v, %B[%j] : memref<10xf32> |
| } |
| scf.for %i = %c0 to %c10 step %c1 { |
| memref.store %cst, %B[%i] : memref<10xf32> |
| } |
| affine.for %j = 0 to 10 { |
| %v = affine.load %B[%j] : memref<10xf32> |
| affine.store %v, %C[%j] : memref<10xf32> |
| } |
| // CHECK: affine.for |
| // CHECK: scf.for |
| // CHECK: affine.for |
| |
| return |
| } |