xref: /llvm-project/mlir/test/python/dialects/affine.py (revision 31aa7f34e07c901773993dac0f33568307f96da6)
1de7857abSAmy Wang# RUN: %PYTHON %s | FileCheck %s
2de7857abSAmy Wang
3de7857abSAmy Wangfrom mlir.ir import *
4543589afSAmy Wangfrom mlir.dialects import func
5543589afSAmy Wangfrom mlir.dialects import arith
6543589afSAmy Wangfrom mlir.dialects import memref
7543589afSAmy Wangfrom mlir.dialects import affine
8db3bc494SMaksim Leventalimport mlir.extras.types as T
9de7857abSAmy Wang
10de7857abSAmy Wang
11543589afSAmy Wangdef constructAndPrintInModule(f):
12de7857abSAmy Wang    print("\nTEST:", f.__name__)
13543589afSAmy Wang    with Context(), Location.unknown():
14543589afSAmy Wang        module = Module.create()
15543589afSAmy Wang        with InsertionPoint(module.body):
16de7857abSAmy Wang            f()
17543589afSAmy Wang        print(module)
18de7857abSAmy Wang    return f
19de7857abSAmy Wang
20de7857abSAmy Wang
21de7857abSAmy Wang# CHECK-LABEL: TEST: testAffineStoreOp
22543589afSAmy Wang@constructAndPrintInModule
23de7857abSAmy Wangdef testAffineStoreOp():
24de7857abSAmy Wang    f32 = F32Type.get()
25de7857abSAmy Wang    index_type = IndexType.get()
26de7857abSAmy Wang    memref_type_out = MemRefType.get([12, 12], f32)
27de7857abSAmy Wang
28de7857abSAmy Wang    # CHECK: func.func @affine_store_test(%[[ARG0:.*]]: index) -> memref<12x12xf32> {
29de7857abSAmy Wang    @func.FuncOp.from_py_func(index_type)
30de7857abSAmy Wang    def affine_store_test(arg0):
31de7857abSAmy Wang        # CHECK: %[[O_VAR:.*]] = memref.alloc() : memref<12x12xf32>
32de7857abSAmy Wang        mem = memref.AllocOp(memref_type_out, [], []).result
33de7857abSAmy Wang
34de7857abSAmy Wang        d0 = AffineDimExpr.get(0)
35de7857abSAmy Wang        s0 = AffineSymbolExpr.get(0)
36de7857abSAmy Wang        map = AffineMap.get(1, 1, [s0 * 3, d0 + s0 + 1])
37de7857abSAmy Wang
38de7857abSAmy Wang        # CHECK: %[[A1:.*]] = arith.constant 2.100000e+00 : f32
39de7857abSAmy Wang        a1 = arith.ConstantOp(f32, 2.1)
40de7857abSAmy Wang
41de7857abSAmy Wang        # CHECK: affine.store %[[A1]], %alloc[symbol(%[[ARG0]]) * 3, %[[ARG0]] + symbol(%[[ARG0]]) + 1] : memref<12x12xf32>
42dd473f1dSMaksim Levental        affine.AffineStoreOp(a1, mem, indices=[arg0, arg0], map=map)
43de7857abSAmy Wang
44de7857abSAmy Wang        return mem
45de7857abSAmy Wang
46543589afSAmy Wang
4798d8dce6SMaksim Levental# CHECK-LABEL: TEST: testAffineDelinearizeInfer
4898d8dce6SMaksim Levental@constructAndPrintInModule
4998d8dce6SMaksim Leventaldef testAffineDelinearizeInfer():
5098d8dce6SMaksim Levental    # CHECK: %[[C1:.*]] = arith.constant 1 : index
5198d8dce6SMaksim Levental    c1 = arith.ConstantOp(T.index(), 1)
52704808c2SKrzysztof Drewniak    # CHECK: %{{.*}}:2 = affine.delinearize_index %[[C1:.*]] into (2, 3) : index, index
53*31aa7f34SKrzysztof Drewniak    two_indices = affine.AffineDelinearizeIndexOp([T.index()] * 2, c1, [], [2, 3])
5498d8dce6SMaksim Levental
5598d8dce6SMaksim Levental
56543589afSAmy Wang# CHECK-LABEL: TEST: testAffineLoadOp
57543589afSAmy Wang@constructAndPrintInModule
58543589afSAmy Wangdef testAffineLoadOp():
59543589afSAmy Wang    f32 = F32Type.get()
60543589afSAmy Wang    index_type = IndexType.get()
61543589afSAmy Wang    memref_type_in = MemRefType.get([10, 10], f32)
62543589afSAmy Wang
63543589afSAmy Wang    # CHECK: func.func @affine_load_test(%[[I_VAR:.*]]: memref<10x10xf32>, %[[ARG0:.*]]: index) -> f32 {
64543589afSAmy Wang    @func.FuncOp.from_py_func(memref_type_in, index_type)
65543589afSAmy Wang    def affine_load_test(I, arg0):
66543589afSAmy Wang        d0 = AffineDimExpr.get(0)
67543589afSAmy Wang        s0 = AffineSymbolExpr.get(0)
68543589afSAmy Wang        map = AffineMap.get(1, 1, [s0 * 3, d0 + s0 + 1])
69543589afSAmy Wang
70543589afSAmy Wang        # CHECK: {{.*}} = affine.load %[[I_VAR]][symbol(%[[ARG0]]) * 3, %[[ARG0]] + symbol(%[[ARG0]]) + 1] : memref<10x10xf32>
71543589afSAmy Wang        a1 = affine.AffineLoadOp(f32, I, indices=[arg0, arg0], map=map)
72543589afSAmy Wang
73543589afSAmy Wang        return a1
74543589afSAmy Wang
75543589afSAmy Wang
76543589afSAmy Wang# CHECK-LABEL: TEST: testAffineForOp
77543589afSAmy Wang@constructAndPrintInModule
78543589afSAmy Wangdef testAffineForOp():
79543589afSAmy Wang    f32 = F32Type.get()
80543589afSAmy Wang    index_type = IndexType.get()
81543589afSAmy Wang    memref_type = MemRefType.get([1024], f32)
82543589afSAmy Wang
83543589afSAmy Wang    # CHECK: #[[MAP0:.*]] = affine_map<(d0)[s0] -> (0, d0 + s0)>
84543589afSAmy Wang    # CHECK: #[[MAP1:.*]] = affine_map<(d0, d1) -> (d0 - 2, d1 * 32)>
85543589afSAmy Wang    # CHECK: func.func @affine_for_op_test(%[[BUFFER:.*]]: memref<1024xf32>) {
86543589afSAmy Wang    @func.FuncOp.from_py_func(memref_type)
87543589afSAmy Wang    def affine_for_op_test(buffer):
88543589afSAmy Wang        # CHECK: %[[C1:.*]] = arith.constant 1 : index
89543589afSAmy Wang        c1 = arith.ConstantOp(index_type, 1)
90543589afSAmy Wang        # CHECK: %[[C2:.*]] = arith.constant 2 : index
91543589afSAmy Wang        c2 = arith.ConstantOp(index_type, 2)
92543589afSAmy Wang        # CHECK: %[[C3:.*]] = arith.constant 3 : index
93543589afSAmy Wang        c3 = arith.ConstantOp(index_type, 3)
94543589afSAmy Wang        # CHECK: %[[C9:.*]] = arith.constant 9 : index
95543589afSAmy Wang        c9 = arith.ConstantOp(index_type, 9)
96543589afSAmy Wang        # CHECK: %[[AC0:.*]] = arith.constant 0.000000e+00 : f32
97543589afSAmy Wang        ac0 = AffineConstantExpr.get(0)
98543589afSAmy Wang
99543589afSAmy Wang        d0 = AffineDimExpr.get(0)
100543589afSAmy Wang        d1 = AffineDimExpr.get(1)
101543589afSAmy Wang        s0 = AffineSymbolExpr.get(0)
102543589afSAmy Wang        lb = AffineMap.get(1, 1, [ac0, d0 + s0])
103543589afSAmy Wang        ub = AffineMap.get(2, 0, [d0 - 2, 32 * d1])
104543589afSAmy Wang        sum_0 = arith.ConstantOp(f32, 0.0)
105543589afSAmy Wang
106543589afSAmy Wang        # CHECK: %0 = affine.for %[[INDVAR:.*]] = max #[[MAP0]](%[[C2]])[%[[C3]]] to min #[[MAP1]](%[[C9]], %[[C1]]) step 2 iter_args(%[[SUM0:.*]] = %[[AC0]]) -> (f32) {
107543589afSAmy Wang        sum = affine.AffineForOp(
108543589afSAmy Wang            lb,
109543589afSAmy Wang            ub,
110543589afSAmy Wang            2,
111543589afSAmy Wang            iter_args=[sum_0],
112543589afSAmy Wang            lower_bound_operands=[c2, c3],
113543589afSAmy Wang            upper_bound_operands=[c9, c1],
114543589afSAmy Wang        )
115543589afSAmy Wang
116543589afSAmy Wang        with InsertionPoint(sum.body):
117543589afSAmy Wang            # CHECK: %[[TMP:.*]] = memref.load %[[BUFFER]][%[[INDVAR]]] : memref<1024xf32>
118543589afSAmy Wang            tmp = memref.LoadOp(buffer, [sum.induction_variable])
119543589afSAmy Wang            sum_next = arith.AddFOp(sum.inner_iter_args[0], tmp)
120543589afSAmy Wang            affine.AffineYieldOp([sum_next])
121543589afSAmy Wang
122db3bc494SMaksim Levental
123db3bc494SMaksim Levental# CHECK-LABEL: TEST: testAffineForOpErrors
124db3bc494SMaksim Levental@constructAndPrintInModule
125db3bc494SMaksim Leventaldef testAffineForOpErrors():
126db3bc494SMaksim Levental    c1 = arith.ConstantOp(T.index(), 1)
127db3bc494SMaksim Levental    c2 = arith.ConstantOp(T.index(), 2)
128db3bc494SMaksim Levental    c3 = arith.ConstantOp(T.index(), 3)
129db3bc494SMaksim Levental    d0 = AffineDimExpr.get(0)
130db3bc494SMaksim Levental
131db3bc494SMaksim Levental    try:
132db3bc494SMaksim Levental        affine.AffineForOp(
133db3bc494SMaksim Levental            c1,
134db3bc494SMaksim Levental            c2,
135db3bc494SMaksim Levental            1,
136db3bc494SMaksim Levental            lower_bound_operands=[c3],
137db3bc494SMaksim Levental            upper_bound_operands=[],
138db3bc494SMaksim Levental        )
139db3bc494SMaksim Levental    except ValueError as e:
140db3bc494SMaksim Levental        assert (
141db3bc494SMaksim Levental            e.args[0]
142db3bc494SMaksim Levental            == "Either a concrete lower bound or an AffineMap in combination with lower bound operands, but not both, is supported."
143db3bc494SMaksim Levental        )
144db3bc494SMaksim Levental
145db3bc494SMaksim Levental    try:
146db3bc494SMaksim Levental        affine.AffineForOp(
147db3bc494SMaksim Levental            AffineMap.get_constant(1),
148db3bc494SMaksim Levental            c2,
149db3bc494SMaksim Levental            1,
150db3bc494SMaksim Levental            lower_bound_operands=[c3, c3],
151db3bc494SMaksim Levental            upper_bound_operands=[],
152db3bc494SMaksim Levental        )
153db3bc494SMaksim Levental    except ValueError as e:
154db3bc494SMaksim Levental        assert (
155db3bc494SMaksim Levental            e.args[0]
156db3bc494SMaksim Levental            == "Wrong number of lower bound operands passed to AffineForOp; Expected 0, got 2."
157db3bc494SMaksim Levental        )
158db3bc494SMaksim Levental
159db3bc494SMaksim Levental    try:
160*31aa7f34SKrzysztof Drewniak        two_indices = affine.AffineDelinearizeIndexOp([T.index()] * 2, c1, [], [1, 1])
161db3bc494SMaksim Levental        affine.AffineForOp(
162db3bc494SMaksim Levental            two_indices,
163db3bc494SMaksim Levental            c2,
164db3bc494SMaksim Levental            1,
165db3bc494SMaksim Levental            lower_bound_operands=[],
166db3bc494SMaksim Levental            upper_bound_operands=[],
167db3bc494SMaksim Levental        )
168db3bc494SMaksim Levental    except ValueError as e:
169db3bc494SMaksim Levental        assert e.args[0] == "Only a single concrete value is supported for lower bound."
170db3bc494SMaksim Levental
171db3bc494SMaksim Levental    try:
172db3bc494SMaksim Levental        affine.AffineForOp(
173db3bc494SMaksim Levental            1.0,
174db3bc494SMaksim Levental            c2,
175db3bc494SMaksim Levental            1,
176db3bc494SMaksim Levental            lower_bound_operands=[],
177db3bc494SMaksim Levental            upper_bound_operands=[],
178db3bc494SMaksim Levental        )
179db3bc494SMaksim Levental    except ValueError as e:
180db3bc494SMaksim Levental        assert e.args[0] == "lower bound must be int | ResultValueT | AffineMap."
181543589afSAmy Wang
182543589afSAmy Wang
183543589afSAmy Wang@constructAndPrintInModule
184543589afSAmy Wangdef testForSugar():
185db3bc494SMaksim Levental    memref_t = T.memref(10, T.index())
186543589afSAmy Wang    range = affine.for_
187543589afSAmy Wang
188db3bc494SMaksim Levental    # CHECK: #[[$ATTR_2:.+]] = affine_map<(d0) -> (d0)>
189543589afSAmy Wang
190db3bc494SMaksim Levental    # CHECK-LABEL:   func.func @range_loop_1(
191db3bc494SMaksim Levental    # CHECK-SAME:                            %[[VAL_0:.*]]: index, %[[VAL_1:.*]]: index, %[[VAL_2:.*]]: memref<10xindex>) {
192db3bc494SMaksim Levental    # CHECK:           affine.for %[[VAL_3:.*]] = #[[$ATTR_2]](%[[VAL_0]]) to #[[$ATTR_2]](%[[VAL_1]]) {
193db3bc494SMaksim Levental    # CHECK:             %[[VAL_4:.*]] = arith.addi %[[VAL_3]], %[[VAL_3]] : index
194db3bc494SMaksim Levental    # CHECK:             memref.store %[[VAL_4]], %[[VAL_2]]{{\[}}%[[VAL_3]]] : memref<10xindex>
195543589afSAmy Wang    # CHECK:           }
196543589afSAmy Wang    # CHECK:           return
197543589afSAmy Wang    # CHECK:         }
198db3bc494SMaksim Levental    @func.FuncOp.from_py_func(T.index(), T.index(), memref_t)
199db3bc494SMaksim Levental    def range_loop_1(lb, ub, memref_v):
200db3bc494SMaksim Levental        for i in range(lb, ub, step=1):
201543589afSAmy Wang            add = arith.addi(i, i)
202db3bc494SMaksim Levental            memref.store(add, memref_v, [i])
203543589afSAmy Wang
204db3bc494SMaksim Levental            affine.yield_([])
205db3bc494SMaksim Levental
206db3bc494SMaksim Levental    # CHECK-LABEL:   func.func @range_loop_2(
207db3bc494SMaksim Levental    # CHECK-SAME:                            %[[VAL_0:.*]]: index, %[[VAL_1:.*]]: index, %[[VAL_2:.*]]: memref<10xindex>) {
208db3bc494SMaksim Levental    # CHECK:           affine.for %[[VAL_3:.*]] = #[[$ATTR_2]](%[[VAL_0]]) to 10 {
209db3bc494SMaksim Levental    # CHECK:             %[[VAL_4:.*]] = arith.addi %[[VAL_3]], %[[VAL_3]] : index
210db3bc494SMaksim Levental    # CHECK:             memref.store %[[VAL_4]], %[[VAL_2]]{{\[}}%[[VAL_3]]] : memref<10xindex>
211543589afSAmy Wang    # CHECK:           }
212543589afSAmy Wang    # CHECK:           return
213543589afSAmy Wang    # CHECK:         }
214db3bc494SMaksim Levental    @func.FuncOp.from_py_func(T.index(), T.index(), memref_t)
215db3bc494SMaksim Levental    def range_loop_2(lb, ub, memref_v):
216db3bc494SMaksim Levental        for i in range(lb, 10, step=1):
217543589afSAmy Wang            add = arith.addi(i, i)
218db3bc494SMaksim Levental            memref.store(add, memref_v, [i])
219db3bc494SMaksim Levental            affine.yield_([])
220db3bc494SMaksim Levental
221db3bc494SMaksim Levental    # CHECK-LABEL:   func.func @range_loop_3(
222db3bc494SMaksim Levental    # CHECK-SAME:                            %[[VAL_0:.*]]: index, %[[VAL_1:.*]]: index, %[[VAL_2:.*]]: memref<10xindex>) {
223db3bc494SMaksim Levental    # CHECK:           affine.for %[[VAL_3:.*]] = 0 to #[[$ATTR_2]](%[[VAL_1]]) {
224db3bc494SMaksim Levental    # CHECK:             %[[VAL_4:.*]] = arith.addi %[[VAL_3]], %[[VAL_3]] : index
225db3bc494SMaksim Levental    # CHECK:             memref.store %[[VAL_4]], %[[VAL_2]]{{\[}}%[[VAL_3]]] : memref<10xindex>
226db3bc494SMaksim Levental    # CHECK:           }
227db3bc494SMaksim Levental    # CHECK:           return
228db3bc494SMaksim Levental    # CHECK:         }
229db3bc494SMaksim Levental    @func.FuncOp.from_py_func(T.index(), T.index(), memref_t)
230db3bc494SMaksim Levental    def range_loop_3(lb, ub, memref_v):
231db3bc494SMaksim Levental        for i in range(0, ub, step=1):
232db3bc494SMaksim Levental            add = arith.addi(i, i)
233db3bc494SMaksim Levental            memref.store(add, memref_v, [i])
234db3bc494SMaksim Levental            affine.yield_([])
235db3bc494SMaksim Levental
236db3bc494SMaksim Levental    # CHECK-LABEL:   func.func @range_loop_4(
237db3bc494SMaksim Levental    # CHECK-SAME:                            %[[VAL_0:.*]]: index, %[[VAL_1:.*]]: index, %[[VAL_2:.*]]: memref<10xindex>) {
238db3bc494SMaksim Levental    # CHECK:           affine.for %[[VAL_3:.*]] = 0 to 10 {
239db3bc494SMaksim Levental    # CHECK:             %[[VAL_4:.*]] = arith.addi %[[VAL_3]], %[[VAL_3]] : index
240db3bc494SMaksim Levental    # CHECK:             memref.store %[[VAL_4]], %[[VAL_2]]{{\[}}%[[VAL_3]]] : memref<10xindex>
241db3bc494SMaksim Levental    # CHECK:           }
242db3bc494SMaksim Levental    # CHECK:           return
243db3bc494SMaksim Levental    # CHECK:         }
244db3bc494SMaksim Levental    @func.FuncOp.from_py_func(T.index(), T.index(), memref_t)
245db3bc494SMaksim Levental    def range_loop_4(lb, ub, memref_v):
246db3bc494SMaksim Levental        for i in range(0, 10, step=1):
247db3bc494SMaksim Levental            add = arith.addi(i, i)
248db3bc494SMaksim Levental            memref.store(add, memref_v, [i])
249db3bc494SMaksim Levental            affine.yield_([])
250db3bc494SMaksim Levental
251db3bc494SMaksim Levental    # CHECK-LABEL:   func.func @range_loop_8(
252db3bc494SMaksim Levental    # CHECK-SAME:                            %[[VAL_0:.*]]: index, %[[VAL_1:.*]]: index, %[[VAL_2:.*]]: memref<10xindex>) {
253db3bc494SMaksim Levental    # CHECK:           %[[VAL_3:.*]] = affine.for %[[VAL_4:.*]] = 0 to 10 iter_args(%[[VAL_5:.*]] = %[[VAL_2]]) -> (memref<10xindex>) {
254db3bc494SMaksim Levental    # CHECK:             %[[VAL_6:.*]] = arith.addi %[[VAL_4]], %[[VAL_4]] : index
255db3bc494SMaksim Levental    # CHECK:             memref.store %[[VAL_6]], %[[VAL_5]]{{\[}}%[[VAL_4]]] : memref<10xindex>
256db3bc494SMaksim Levental    # CHECK:             affine.yield %[[VAL_5]] : memref<10xindex>
257db3bc494SMaksim Levental    # CHECK:           }
258db3bc494SMaksim Levental    # CHECK:           return
259db3bc494SMaksim Levental    # CHECK:         }
260db3bc494SMaksim Levental    @func.FuncOp.from_py_func(T.index(), T.index(), memref_t)
261db3bc494SMaksim Levental    def range_loop_8(lb, ub, memref_v):
262db3bc494SMaksim Levental        for i, it in range(0, 10, iter_args=[memref_v]):
263db3bc494SMaksim Levental            add = arith.addi(i, i)
264db3bc494SMaksim Levental            memref.store(add, it, [i])
265db3bc494SMaksim Levental            affine.yield_([it])
266d50fbe43SAmy Wang
267d50fbe43SAmy Wang
268d50fbe43SAmy Wang# CHECK-LABEL: TEST: testAffineIfWithoutElse
269d50fbe43SAmy Wang@constructAndPrintInModule
270d50fbe43SAmy Wangdef testAffineIfWithoutElse():
271d50fbe43SAmy Wang    index = IndexType.get()
272d50fbe43SAmy Wang    i32 = IntegerType.get_signless(32)
273d50fbe43SAmy Wang    d0 = AffineDimExpr.get(0)
274d50fbe43SAmy Wang
275d50fbe43SAmy Wang    # CHECK: #[[$SET0:.*]] = affine_set<(d0) : (d0 - 5 >= 0)>
276d50fbe43SAmy Wang    cond = IntegerSet.get(1, 0, [d0 - 5], [False])
277d50fbe43SAmy Wang
278d50fbe43SAmy Wang    # CHECK-LABEL:  func.func @simple_affine_if(
279d50fbe43SAmy Wang    # CHECK-SAME:                        %[[VAL_0:.*]]: index) {
280d50fbe43SAmy Wang    # CHECK:            affine.if #[[$SET0]](%[[VAL_0]]) {
281d50fbe43SAmy Wang    # CHECK:                %[[VAL_1:.*]] = arith.constant 1 : i32
282d50fbe43SAmy Wang    # CHECK:                %[[VAL_2:.*]] = arith.addi %[[VAL_1]], %[[VAL_1]] : i32
283d50fbe43SAmy Wang    # CHECK:            }
284d50fbe43SAmy Wang    # CHECK:            return
285d50fbe43SAmy Wang    # CHECK:        }
286d50fbe43SAmy Wang    @func.FuncOp.from_py_func(index)
287d50fbe43SAmy Wang    def simple_affine_if(cond_operands):
288d50fbe43SAmy Wang        if_op = affine.AffineIfOp(cond, cond_operands=[cond_operands])
289d50fbe43SAmy Wang        with InsertionPoint(if_op.then_block):
290d50fbe43SAmy Wang            one = arith.ConstantOp(i32, 1)
291d50fbe43SAmy Wang            add = arith.AddIOp(one, one)
292d50fbe43SAmy Wang            affine.AffineYieldOp([])
293d50fbe43SAmy Wang        return
294d50fbe43SAmy Wang
295d50fbe43SAmy Wang
296d50fbe43SAmy Wang# CHECK-LABEL: TEST: testAffineIfWithElse
297d50fbe43SAmy Wang@constructAndPrintInModule
298d50fbe43SAmy Wangdef testAffineIfWithElse():
299d50fbe43SAmy Wang    index = IndexType.get()
300d50fbe43SAmy Wang    i32 = IntegerType.get_signless(32)
301d50fbe43SAmy Wang    d0 = AffineDimExpr.get(0)
302d50fbe43SAmy Wang
303d50fbe43SAmy Wang    # CHECK: #[[$SET0:.*]] = affine_set<(d0) : (d0 - 5 >= 0)>
304d50fbe43SAmy Wang    cond = IntegerSet.get(1, 0, [d0 - 5], [False])
305d50fbe43SAmy Wang
306d50fbe43SAmy Wang    # CHECK-LABEL:  func.func @simple_affine_if_else(
307d50fbe43SAmy Wang    # CHECK-SAME:                                    %[[VAL_0:.*]]: index) {
308d50fbe43SAmy Wang    # CHECK:            %[[VAL_IF:.*]]:2 = affine.if #[[$SET0]](%[[VAL_0]]) -> (i32, i32) {
309d50fbe43SAmy Wang    # CHECK:                %[[VAL_XT:.*]] = arith.constant 0 : i32
310d50fbe43SAmy Wang    # CHECK:                %[[VAL_YT:.*]] = arith.constant 1 : i32
311d50fbe43SAmy Wang    # CHECK:                affine.yield %[[VAL_XT]], %[[VAL_YT]] : i32, i32
312d50fbe43SAmy Wang    # CHECK:            } else {
313d50fbe43SAmy Wang    # CHECK:                %[[VAL_XF:.*]] = arith.constant 2 : i32
314d50fbe43SAmy Wang    # CHECK:                %[[VAL_YF:.*]] = arith.constant 3 : i32
315d50fbe43SAmy Wang    # CHECK:                affine.yield %[[VAL_XF]], %[[VAL_YF]] : i32, i32
316d50fbe43SAmy Wang    # CHECK:            }
317d50fbe43SAmy Wang    # CHECK:            %[[VAL_ADD:.*]] = arith.addi %[[VAL_IF]]#0, %[[VAL_IF]]#1 : i32
318d50fbe43SAmy Wang    # CHECK:            return
319d50fbe43SAmy Wang    # CHECK:        }
320d50fbe43SAmy Wang
321d50fbe43SAmy Wang    @func.FuncOp.from_py_func(index)
322d50fbe43SAmy Wang    def simple_affine_if_else(cond_operands):
323d50fbe43SAmy Wang        if_op = affine.AffineIfOp(
324d50fbe43SAmy Wang            cond, [i32, i32], cond_operands=[cond_operands], has_else=True
325d50fbe43SAmy Wang        )
326d50fbe43SAmy Wang        with InsertionPoint(if_op.then_block):
327d50fbe43SAmy Wang            x_true = arith.ConstantOp(i32, 0)
328d50fbe43SAmy Wang            y_true = arith.ConstantOp(i32, 1)
329d50fbe43SAmy Wang            affine.AffineYieldOp([x_true, y_true])
330d50fbe43SAmy Wang        with InsertionPoint(if_op.else_block):
331d50fbe43SAmy Wang            x_false = arith.ConstantOp(i32, 2)
332d50fbe43SAmy Wang            y_false = arith.ConstantOp(i32, 3)
333d50fbe43SAmy Wang            affine.AffineYieldOp([x_false, y_false])
334d50fbe43SAmy Wang        add = arith.AddIOp(if_op.results[0], if_op.results[1])
335d50fbe43SAmy Wang        return
336