@@ -103,18 +103,18 @@ Optimize MLIR code described in the Affine dialect by Pluto:
103
103
``` mlir
104
104
// File name: matmul.mlir
105
105
func @matmul() {
106
- %A = alloc() : memref<64x64xf32>
107
- %B = alloc() : memref<64x64xf32>
108
- %C = alloc() : memref<64x64xf32>
106
+ %A = memref. alloc() : memref<64x64xf32>
107
+ %B = memref. alloc() : memref<64x64xf32>
108
+ %C = memref. alloc() : memref<64x64xf32>
109
109
110
110
affine.for %i = 0 to 64 {
111
111
affine.for %j = 0 to 64 {
112
112
affine.for %k = 0 to 64 {
113
113
%0 = affine.load %A[%i, %k] : memref<64x64xf32>
114
114
%1 = affine.load %B[%k, %j] : memref<64x64xf32>
115
- %2 = mulf %0, %1 : f32
115
+ %2 = arith. mulf %0, %1 : f32
116
116
%3 = affine.load %C[%i, %j] : memref<64x64xf32>
117
- %4 = addf %2, %3 : f32
117
+ %4 = arith. addf %2, %3 : f32
118
118
affine.store %4, %C[%i, %j] : memref<64x64xf32>
119
119
}
120
120
}
@@ -135,21 +135,29 @@ Output:
135
135
136
136
``` mlir
137
137
#map0 = affine_map<(d0) -> (d0 * 32)>
138
- #map1 = affine_map<(d0) -> (d0 * 32 + 31 )>
138
+ #map1 = affine_map<(d0) -> (d0 * 32 + 32 )>
139
139
module {
140
- func @main(%arg0: memref<?x?xf32>, %arg1: memref<?x?xf32>, %arg2: memref<?x?xf32>) {
141
- affine.for %arg3 = 0 to 1 {
142
- affine.for %arg4 = 0 to 1 {
143
- affine.for %arg5 = 0 to 1 {
144
- affine.for %arg6 = #map0(%arg3) to #map1(%arg3) {
145
- affine.for %arg7 = #map0(%arg5) to #map1(%arg5) {
146
- affine.for %arg8 = #map0(%arg4) to #map1(%arg4) {
147
- %0 = affine.load %arg0[%arg6, %arg8] : memref<?x?xf32>
148
- %1 = affine.load %arg2[%arg7, %arg8] : memref<?x?xf32>
149
- %2 = affine.load %arg1[%arg6, %arg7] : memref<?x?xf32>
150
- %3 = mulf %2, %1 : f32
151
- %4 = addf %3, %0 : f32
152
- affine.store %4, %arg0[%arg6, %arg8] : memref<?x?xf32>
140
+ func private @S0(%arg0: index, %arg1: index, %arg2: memref<64x64xf32>, %arg3: index, %arg4: memref<64x64xf32>, %arg5: memref<64x64xf32>) attributes {scop.stmt} {
141
+ %0 = affine.load %arg5[symbol(%arg0), symbol(%arg3)] : memref<64x64xf32>
142
+ %1 = affine.load %arg4[symbol(%arg3), symbol(%arg1)] : memref<64x64xf32>
143
+ %2 = arith.mulf %0, %1 : f32
144
+ %3 = affine.load %arg2[symbol(%arg0), symbol(%arg1)] : memref<64x64xf32>
145
+ %4 = arith.addf %2, %3 : f32
146
+ affine.store %4, %arg2[symbol(%arg0), symbol(%arg1)] : memref<64x64xf32>
147
+ return
148
+ }
149
+
150
+ func @matmul() {
151
+ %0 = memref.alloc() : memref<64x64xf32>
152
+ %1 = memref.alloc() : memref<64x64xf32>
153
+ %2 = memref.alloc() : memref<64x64xf32>
154
+ affine.for %arg0 = 0 to 2 {
155
+ affine.for %arg1 = 0 to 2 {
156
+ affine.for %arg2 = 0 to 2 {
157
+ affine.for %arg3 = #map0(%arg0) to #map1(%arg0) {
158
+ affine.for %arg4 = #map0(%arg2) to #map1(%arg2) {
159
+ affine.for %arg5 = #map0(%arg1) to #map1(%arg1) {
160
+ call @S0(%arg3, %arg5, %0, %arg4, %1, %2) : (index, index, memref<64x64xf32>, index, memref<64x64xf32>, memref<64x64xf32>) -> ()
153
161
}
154
162
}
155
163
}
0 commit comments