Issue 128403
Summary [MLIR][Affine] Canonicalizing a valid IR leads to invalid IR
Labels mlir
Assignees bondhugula
Reporter bondhugula
    Canonicalizing an IR like this leads to invalid IR. When the operands of the affine.apply here are composed into its users, the resulting IR becomes invalid. This IR itself should have been invalid, but we are missing the necessary verification check.

```
#map = affine_map<()[s0, s1] -> (s0 * 23 + s1)>
module {
  func.func @func1(%arg0: memref<1x23x26xi32, strided<[?, ?, ?], offset: ?>>) -> () {
    %cst = arith.constant 63.9809875 : f32
 %cst_0 = arith.constant 1.19825836E-6 : f32
    %cst_1 = arith.constant 1.18534706E-4 : f32
    %cst_2 = arith.constant 0.00226843474 : f32
 %cst_3 = arith.constant 0.00489352504 : f32
    %cst_4 = arith.constant -2.76076837E-16 : f32
    %cst_5 = arith.constant 2.00018794E-13 : f32
 %cst_6 = arith.constant -8.60467184E-11 : f32
    %cst_7 = arith.constant 5.12229725E-8 : f32
    %cst_8 = arith.constant 1.48572235E-5 : f32
 %cst_9 = arith.constant 6.37261954E-4 : f32
    %cst_10 = arith.constant 0.00489352457 : f32
    %cst_11 = arith.constant 7.99881172 : f32
 %cst_12 = arith.constant 0.000000e+00 : f32
    %alloc = memref.alloc() {alignment = 64 : i64} : memref<23x26xf32>
    affine.for %arg1 = 0 to 23 {
      affine.for %arg2 = 0 to 26 {
        %0 = math.fma %cst, %cst_4, %cst_5 : f32
        %1 = math.fma %cst, %0, %cst_6 : f32
        %2 = math.fma %cst, %1, %cst_7 : f32
        %3 = math.fma %cst, %2, %cst_8 : f32
        %4 = math.fma %cst, %3, %cst_9 : f32
        %5 = math.fma %cst, %4, %cst_10 : f32
        %6 = arith.mulf %5, %cst_11 : f32
 %7 = math.fma %cst, %cst_0, %cst_1 : f32
        %8 = math.fma %cst, %7, %cst_2 : f32
        %9 = math.fma %cst, %8, %cst_3 : f32
        %10 = arith.divf %6, %9 : f32
        affine.store %10, %alloc[%arg1, %arg2] : memref<23x26xf32>
      }
    }
    %alloc_13 = memref.alloc() {alignment = 64 : i64} : memref<1x26xf32>
    affine.for %arg1 = 0 to 1 {
 affine.for %arg2 = 0 to 23 {
        affine.for %arg3 = 0 to 26 {
 %0 = affine.apply #map()[%arg1, %arg2]
          %1 = affine.load %alloc[%0, %arg3] : memref<23x26xf32>
          %2 = affine.load %alloc_13[%arg1, %arg3] : memref<1x26xf32>
          %3 = arith.addf %1, %2 : f32
 affine.store %3, %alloc_13[%arg1, %arg3] : memref<1x26xf32>
        }
 }
    }
    return 
  }
}
```

```
bin/mlir-opt -canonicalize canonicalize.mlir 
canonicalize.mlir:40:16: error: 'affine.load' op operand cannot be used as a symbol
          %1 = affine.load %alloc[%0, %arg3] : memref<23x26xf32>
               ^
canonicalize.mlir:40:16: note: see current operation: %15 = "affine.load"(%13, %arg3, %arg1, %arg2) <{map = affine_map<(d0)[s0, s1] -> (s0 * 23 + s1, d0)>}> : (memref<23x26xf32>, index, index, index) -> f32
```


```
bin/mlir-opt -canonicalize canonicalize.mlir 
canonicalize.mlir:40:16: error: 'affine.load' op operand cannot be used as a symbol
          %1 = affine.load %alloc[%0, %arg3] : memref<23x26xf32>
               ^
canonicalize.mlir:40:16: note: see current operation: %15 = "affine.load"(%13, %arg3, %arg1, %arg2) <{map = affine_map<(d0)[s0, s1] -> (s0 * 23 + s1, d0)>}> : (memref<23x26xf32>, index, index, index) -> f32
```

_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to