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