|
5 | 5 | from mlir.dialects import arith
|
6 | 6 | from mlir.dialects import memref
|
7 | 7 | from mlir.dialects import affine
|
| 8 | +import mlir.extras.types as T |
8 | 9 |
|
9 | 10 |
|
10 | 11 | def constructAndPrintInModule(f):
|
@@ -115,58 +116,130 @@ def affine_for_op_test(buffer):
|
115 | 116 |
|
116 | 117 | @constructAndPrintInModule
|
117 | 118 | def testForSugar():
|
118 |
| - index_type = IndexType.get() |
119 |
| - memref_t = MemRefType.get([10], index_type) |
| 119 | + memref_t = T.memref(10, T.index()) |
120 | 120 | range = affine.for_
|
121 | 121 |
|
122 |
| - # CHECK: func.func @range_loop_1(%[[VAL_0:.*]]: index, %[[VAL_1:.*]]: index, %[[VAL_2:.*]]: index, %[[VAL_3:.*]]: memref<10xindex>) { |
123 |
| - # CHECK: %[[VAL_4:.*]] = arith.constant 10 : index |
124 |
| - # CHECK: affine.for %[[VAL_6:.*]] = %[[VAL_0]] to %[[VAL_4]] step 2 { |
125 |
| - # CHECK: %[[VAL_7:.*]] = arith.addi %[[VAL_6]], %[[VAL_6]] : index |
126 |
| - # CHECK: affine.store %[[VAL_7]], %[[VAL_3]]{{\[symbol\(}}%[[VAL_6]]{{\)\]}} : memref<10xindex> |
127 |
| - # CHECK: } |
128 |
| - # CHECK: return |
129 |
| - # CHECK: } |
130 |
| - @func.FuncOp.from_py_func(index_type, index_type, index_type, memref_t) |
131 |
| - def range_loop_1(lb, ub, step, memref_v): |
132 |
| - for i in range(lb, 10, 2): |
| 122 | + # CHECK-LABEL: func.func @range_loop_1( |
| 123 | + # CHECK-SAME: %[[VAL_0:.*]]: index, %[[VAL_1:.*]]: index, %[[VAL_2:.*]]: memref<10xindex>) { |
| 124 | + # CHECK: affine.for %[[VAL_3:.*]] = 1 to 1 iter_args() -> () { |
| 125 | + # CHECK: %[[VAL_4:.*]] = arith.addi %[[VAL_3]], %[[VAL_3]] : index |
| 126 | + # CHECK: memref.store %[[VAL_4]], %[[VAL_2]]{{\[}}%[[VAL_3]]] : memref<10xindex> |
| 127 | + # CHECK: affine.yield |
| 128 | + # CHECK: } |
| 129 | + # CHECK: return |
| 130 | + # CHECK: } |
| 131 | + @func.FuncOp.from_py_func(T.index(), T.index(), memref_t) |
| 132 | + def range_loop_1(lb, ub, memref_v): |
| 133 | + for i in range(lb, ub, step=1): |
| 134 | + add = arith.addi(i, i) |
| 135 | + memref.store(add, memref_v, [i]) |
| 136 | + |
| 137 | + affine.yield_([]) |
| 138 | + |
| 139 | + # CHECK-LABEL: func.func @range_loop_2( |
| 140 | + # CHECK-SAME: %[[VAL_0:.*]]: index, %[[VAL_1:.*]]: index, %[[VAL_2:.*]]: memref<10xindex>) { |
| 141 | + # CHECK: affine.for %[[VAL_3:.*]] = 1 to 10 iter_args() -> () { |
| 142 | + # CHECK: %[[VAL_4:.*]] = arith.addi %[[VAL_3]], %[[VAL_3]] : index |
| 143 | + # CHECK: memref.store %[[VAL_4]], %[[VAL_2]]{{\[}}%[[VAL_3]]] : memref<10xindex> |
| 144 | + # CHECK: affine.yield |
| 145 | + # CHECK: } |
| 146 | + # CHECK: return |
| 147 | + # CHECK: } |
| 148 | + @func.FuncOp.from_py_func(T.index(), T.index(), memref_t) |
| 149 | + def range_loop_2(lb, ub, memref_v): |
| 150 | + for i in range(lb, 10, step=1): |
| 151 | + add = arith.addi(i, i) |
| 152 | + memref.store(add, memref_v, [i]) |
| 153 | + affine.yield_([]) |
| 154 | + |
| 155 | + # CHECK-LABEL: func.func @range_loop_3( |
| 156 | + # CHECK-SAME: %[[VAL_0:.*]]: index, %[[VAL_1:.*]]: index, %[[VAL_2:.*]]: memref<10xindex>) { |
| 157 | + # CHECK: affine.for %[[VAL_3:.*]] = 0 to 1 iter_args() -> () { |
| 158 | + # CHECK: %[[VAL_4:.*]] = arith.addi %[[VAL_3]], %[[VAL_3]] : index |
| 159 | + # CHECK: memref.store %[[VAL_4]], %[[VAL_2]]{{\[}}%[[VAL_3]]] : memref<10xindex> |
| 160 | + # CHECK: affine.yield |
| 161 | + # CHECK: } |
| 162 | + # CHECK: return |
| 163 | + # CHECK: } |
| 164 | + @func.FuncOp.from_py_func(T.index(), T.index(), memref_t) |
| 165 | + def range_loop_3(lb, ub, memref_v): |
| 166 | + for i in range(0, ub, step=1): |
| 167 | + add = arith.addi(i, i) |
| 168 | + memref.store(add, memref_v, [i]) |
| 169 | + affine.yield_([]) |
| 170 | + |
| 171 | + # CHECK-LABEL: func.func @range_loop_4( |
| 172 | + # CHECK-SAME: %[[VAL_0:.*]]: index, %[[VAL_1:.*]]: index, %[[VAL_2:.*]]: memref<10xindex>) { |
| 173 | + # CHECK: affine.for %[[VAL_3:.*]] = 0 to 10 { |
| 174 | + # CHECK: %[[VAL_4:.*]] = arith.addi %[[VAL_3]], %[[VAL_3]] : index |
| 175 | + # CHECK: memref.store %[[VAL_4]], %[[VAL_2]]{{\[}}%[[VAL_3]]] : memref<10xindex> |
| 176 | + # CHECK: } |
| 177 | + # CHECK: return |
| 178 | + # CHECK: } |
| 179 | + @func.FuncOp.from_py_func(T.index(), T.index(), memref_t) |
| 180 | + def range_loop_4(lb, ub, memref_v): |
| 181 | + for i in range(0, 10, step=1): |
| 182 | + add = arith.addi(i, i) |
| 183 | + memref.store(add, memref_v, [i]) |
| 184 | + affine.yield_([]) |
| 185 | + |
| 186 | + # CHECK-LABEL: func.func @range_loop_5( |
| 187 | + # CHECK-SAME: %[[VAL_0:.*]]: index, %[[VAL_1:.*]]: index, %[[VAL_2:.*]]: memref<10xindex>) { |
| 188 | + # CHECK: affine.for %[[VAL_3:.*]] = 0 to 10 { |
| 189 | + # CHECK: %[[VAL_4:.*]] = arith.addi %[[VAL_3]], %[[VAL_3]] : index |
| 190 | + # CHECK: memref.store %[[VAL_4]], %[[VAL_2]]{{\[}}%[[VAL_3]]] : memref<10xindex> |
| 191 | + # CHECK: } |
| 192 | + # CHECK: return |
| 193 | + # CHECK: } |
| 194 | + @func.FuncOp.from_py_func(T.index(), T.index(), memref_t) |
| 195 | + def range_loop_5(lb, ub, memref_v): |
| 196 | + for i in range(0, 10, step=1): |
| 197 | + add = arith.addi(i, i) |
| 198 | + memref.store(add, memref_v, [i]) |
| 199 | + affine.yield_([]) |
| 200 | + |
| 201 | + # CHECK-LABEL: func.func @range_loop_6( |
| 202 | + # CHECK-SAME: %[[VAL_0:.*]]: index, %[[VAL_1:.*]]: index, %[[VAL_2:.*]]: memref<10xindex>) { |
| 203 | + # CHECK: affine.for %[[VAL_3:.*]] = 0 to 10 { |
| 204 | + # CHECK: %[[VAL_4:.*]] = arith.addi %[[VAL_3]], %[[VAL_3]] : index |
| 205 | + # CHECK: memref.store %[[VAL_4]], %[[VAL_2]]{{\[}}%[[VAL_3]]] : memref<10xindex> |
| 206 | + # CHECK: } |
| 207 | + # CHECK: return |
| 208 | + # CHECK: } |
| 209 | + @func.FuncOp.from_py_func(T.index(), T.index(), memref_t) |
| 210 | + def range_loop_6(lb, ub, memref_v): |
| 211 | + for i in range(0, 10): |
133 | 212 | add = arith.addi(i, i)
|
134 |
| - s0 = AffineSymbolExpr.get(0) |
135 |
| - map = AffineMap.get(0, 1, [s0]) |
136 |
| - affine.store(add, memref_v, [i], map=map) |
137 |
| - affine.AffineYieldOp([]) |
138 |
| - |
139 |
| - # CHECK: func.func @range_loop_2(%[[VAL_0:.*]]: index, %[[VAL_1:.*]]: index, %[[VAL_2:.*]]: index, %[[VAL_3:.*]]: memref<10xindex>) { |
140 |
| - # CHECK: %[[VAL_4:.*]] = arith.constant 0 : index |
141 |
| - # CHECK: %[[VAL_5:.*]] = arith.constant 10 : index |
142 |
| - # CHECK: affine.for %[[VAL_7:.*]] = %[[VAL_4]] to %[[VAL_5]] { |
143 |
| - # CHECK: %[[VAL_8:.*]] = arith.addi %[[VAL_7]], %[[VAL_7]] : index |
144 |
| - # CHECK: affine.store %[[VAL_8]], %[[VAL_3]]{{\[symbol\(}}%[[VAL_7]]{{\)\]}} : memref<10xindex> |
145 |
| - # CHECK: } |
146 |
| - # CHECK: return |
147 |
| - # CHECK: } |
148 |
| - @func.FuncOp.from_py_func(index_type, index_type, index_type, memref_t) |
149 |
| - def range_loop_2(lb, ub, step, memref_v): |
150 |
| - for i in range(0, 10, 1): |
| 213 | + memref.store(add, memref_v, [i]) |
| 214 | + affine.yield_([]) |
| 215 | + |
| 216 | + # CHECK-LABEL: func.func @range_loop_7( |
| 217 | + # CHECK-SAME: %[[VAL_0:.*]]: index, %[[VAL_1:.*]]: index, %[[VAL_2:.*]]: memref<10xindex>) { |
| 218 | + # CHECK: affine.for %[[VAL_3:.*]] = 0 to 10 { |
| 219 | + # CHECK: %[[VAL_4:.*]] = arith.addi %[[VAL_3]], %[[VAL_3]] : index |
| 220 | + # CHECK: memref.store %[[VAL_4]], %[[VAL_2]]{{\[}}%[[VAL_3]]] : memref<10xindex> |
| 221 | + # CHECK: } |
| 222 | + # CHECK: return |
| 223 | + # CHECK: } |
| 224 | + @func.FuncOp.from_py_func(T.index(), T.index(), memref_t) |
| 225 | + def range_loop_7(lb, ub, memref_v): |
| 226 | + for i in range(10): |
151 | 227 | add = arith.addi(i, i)
|
152 |
| - s0 = AffineSymbolExpr.get(0) |
153 |
| - map = AffineMap.get(0, 1, [s0]) |
154 |
| - affine.store(add, memref_v, [i], map=map) |
155 |
| - affine.AffineYieldOp([]) |
156 |
| - |
157 |
| - # CHECK: func.func @range_loop_3(%[[VAL_0:.*]]: index, %[[VAL_1:.*]]: index, %[[VAL_2:.*]]: index, %[[VAL_3:.*]]: memref<10xindex>) { |
158 |
| - # CHECK: %[[VAL_4:.*]] = arith.constant 0 : index |
159 |
| - # CHECK: affine.for %[[VAL_6:.*]] = %[[VAL_4]] to %[[VAL_1]] { |
160 |
| - # CHECK: %[[VAL_7:.*]] = arith.addi %[[VAL_6]], %[[VAL_6]] : index |
161 |
| - # CHECK: affine.store %[[VAL_7]], %[[VAL_3]]{{\[symbol\(}}%[[VAL_6]]{{\)\]}} : memref<10xindex> |
162 |
| - # CHECK: } |
163 |
| - # CHECK: return |
164 |
| - # CHECK: } |
165 |
| - @func.FuncOp.from_py_func(index_type, index_type, index_type, memref_t) |
166 |
| - def range_loop_3(lb, ub, step, memref_v): |
167 |
| - for i in range(0, ub, 1): |
| 228 | + memref.store(add, memref_v, [i]) |
| 229 | + affine.yield_([]) |
| 230 | + |
| 231 | + # CHECK-LABEL: func.func @range_loop_8( |
| 232 | + # CHECK-SAME: %[[VAL_0:.*]]: index, %[[VAL_1:.*]]: index, %[[VAL_2:.*]]: memref<10xindex>) { |
| 233 | + # CHECK: %[[VAL_3:.*]] = affine.for %[[VAL_4:.*]] = 0 to 10 iter_args(%[[VAL_5:.*]] = %[[VAL_2]]) -> (memref<10xindex>) { |
| 234 | + # CHECK: %[[VAL_6:.*]] = arith.addi %[[VAL_4]], %[[VAL_4]] : index |
| 235 | + # CHECK: memref.store %[[VAL_6]], %[[VAL_5]]{{\[}}%[[VAL_4]]] : memref<10xindex> |
| 236 | + # CHECK: affine.yield %[[VAL_5]] : memref<10xindex> |
| 237 | + # CHECK: } |
| 238 | + # CHECK: return |
| 239 | + # CHECK: } |
| 240 | + @func.FuncOp.from_py_func(T.index(), T.index(), memref_t) |
| 241 | + def range_loop_8(lb, ub, memref_v): |
| 242 | + for i, it in range(10, iter_args=[memref_v]): |
168 | 243 | add = arith.addi(i, i)
|
169 |
| - s0 = AffineSymbolExpr.get(0) |
170 |
| - map = AffineMap.get(0, 1, [s0]) |
171 |
| - affine.store(add, memref_v, [i], map=map) |
172 |
| - affine.AffineYieldOp([]) |
| 244 | + memref.store(add, it, [i]) |
| 245 | + affine.yield_([it]) |
0 commit comments