# RUN: %PYTHON %s | FileCheck %s import gc from mlir.ir import * def run(f): print("\nTEST:", f.__name__) f() gc.collect() assert Context._get_live_count() == 0 return f # CHECK-LABEL: TEST: testAffineExprCapsule @run def testAffineExprCapsule(): with Context() as ctx: affine_expr = AffineExpr.get_constant(42) affine_expr_capsule = affine_expr._CAPIPtr # CHECK: capsule object # CHECK: mlir.ir.AffineExpr._CAPIPtr print(affine_expr_capsule) affine_expr_2 = AffineExpr._CAPICreate(affine_expr_capsule) assert affine_expr == affine_expr_2 assert affine_expr_2.context == ctx # CHECK-LABEL: TEST: testAffineExprEq @run def testAffineExprEq(): with Context(): a1 = AffineExpr.get_constant(42) a2 = AffineExpr.get_constant(42) a3 = AffineExpr.get_constant(43) # CHECK: True print(a1 == a1) # CHECK: True print(a1 == a2) # CHECK: False print(a1 == a3) # CHECK: False print(a1 == None) # CHECK: False print(a1 == "foo") # CHECK-LABEL: TEST: testAffineExprContext @run def testAffineExprContext(): with Context(): a1 = AffineExpr.get_constant(42) with Context(): a2 = AffineExpr.get_constant(42) # CHECK: False print(a1 == a2) run(testAffineExprContext) # CHECK-LABEL: TEST: testAffineExprConstant @run def testAffineExprConstant(): with Context(): a1 = AffineExpr.get_constant(42) # CHECK: 42 print(a1.value) # CHECK: 42 print(a1) a2 = AffineConstantExpr.get(42) # CHECK: 42 print(a2.value) # CHECK: 42 print(a2) assert a1 == a2 # CHECK-LABEL: TEST: testAffineExprDim @run def testAffineExprDim(): with Context(): d1 = AffineExpr.get_dim(1) d11 = AffineDimExpr.get(1) d2 = AffineDimExpr.get(2) # CHECK: 1 print(d1.position) # CHECK: d1 print(d1) # CHECK: 2 print(d2.position) # CHECK: d2 print(d2) assert d1 == d11 assert d1 != d2 # CHECK-LABEL: TEST: testAffineExprSymbol @run def testAffineExprSymbol(): with Context(): s1 = AffineExpr.get_symbol(1) s11 = AffineSymbolExpr.get(1) s2 = AffineSymbolExpr.get(2) # CHECK: 1 print(s1.position) # CHECK: s1 print(s1) # CHECK: 2 print(s2.position) # CHECK: s2 print(s2) assert s1 == s11 assert s1 != s2 # CHECK-LABEL: TEST: testAffineAddExpr @run def testAffineAddExpr(): with Context(): d1 = AffineDimExpr.get(1) d2 = AffineDimExpr.get(2) d12 = AffineExpr.get_add(d1, d2) # CHECK: d1 + d2 print(d12) d12op = d1 + d2 # CHECK: d1 + d2 print(d12op) d1cst_op = d1 + 2 # CHECK: d1 + 2 print(d1cst_op) d1cst_op2 = 2 + d1 # CHECK: d1 + 2 print(d1cst_op2) assert d12 == d12op assert d12.lhs == d1 assert d12.rhs == d2 # CHECK-LABEL: TEST: testAffineMulExpr @run def testAffineMulExpr(): with Context(): d1 = AffineDimExpr.get(1) c2 = AffineConstantExpr.get(2) expr = AffineExpr.get_mul(d1, c2) # CHECK: d1 * 2 print(expr) # CHECK: d1 * 2 op = d1 * c2 print(op) # CHECK: d1 * 2 op_cst = d1 * 2 print(op_cst) # CHECK: d1 * 2 op_cst2 = 2 * d1 print(op_cst2) assert expr == op assert expr == op_cst assert expr.lhs == d1 assert expr.rhs == c2 # CHECK-LABEL: TEST: testAffineModExpr @run def testAffineModExpr(): with Context(): d1 = AffineDimExpr.get(1) c2 = AffineConstantExpr.get(2) expr = AffineExpr.get_mod(d1, c2) # CHECK: d1 mod 2 print(expr) # CHECK: d1 mod 2 op = d1 % c2 print(op) # CHECK: d1 mod 2 op_cst = d1 % 2 print(op_cst) # CHECK: 2 mod d1 print(2 % d1) assert expr == op assert expr == op_cst assert expr.lhs == d1 assert expr.rhs == c2 expr2 = AffineExpr.get_mod(c2, d1) expr3 = AffineExpr.get_mod(2, d1) expr4 = AffineExpr.get_mod(d1, 2) # CHECK: 2 mod d1 print(expr2) # CHECK: 2 mod d1 print(expr3) # CHECK: d1 mod 2 print(expr4) assert expr2 == expr3 assert expr4 == expr # CHECK-LABEL: TEST: testAffineFloorDivExpr @run def testAffineFloorDivExpr(): with Context(): d1 = AffineDimExpr.get(1) c2 = AffineConstantExpr.get(2) expr = AffineExpr.get_floor_div(d1, c2) # CHECK: d1 floordiv 2 print(expr) assert expr.lhs == d1 assert expr.rhs == c2 expr2 = AffineExpr.get_floor_div(c2, d1) expr3 = AffineExpr.get_floor_div(2, d1) expr4 = AffineExpr.get_floor_div(d1, 2) # CHECK: 2 floordiv d1 print(expr2) # CHECK: 2 floordiv d1 print(expr3) # CHECK: d1 floordiv 2 print(expr4) assert expr2 == expr3 assert expr4 == expr # CHECK-LABEL: TEST: testAffineCeilDivExpr @run def testAffineCeilDivExpr(): with Context(): d1 = AffineDimExpr.get(1) c2 = AffineConstantExpr.get(2) expr = AffineExpr.get_ceil_div(d1, c2) # CHECK: d1 ceildiv 2 print(expr) assert expr.lhs == d1 assert expr.rhs == c2 expr2 = AffineExpr.get_ceil_div(c2, d1) expr3 = AffineExpr.get_ceil_div(2, d1) expr4 = AffineExpr.get_ceil_div(d1, 2) # CHECK: 2 ceildiv d1 print(expr2) # CHECK: 2 ceildiv d1 print(expr3) # CHECK: d1 ceildiv 2 print(expr4) assert expr2 == expr3 assert expr4 == expr # CHECK-LABEL: TEST: testAffineExprSub @run def testAffineExprSub(): with Context(): d1 = AffineDimExpr.get(1) d2 = AffineDimExpr.get(2) expr = d1 - d2 # CHECK: d1 - d2 print(expr) assert expr.lhs == d1 rhs = AffineMulExpr(expr.rhs) # CHECK: d2 print(rhs.lhs) # CHECK: -1 print(rhs.rhs) # CHECK: d1 - 42 print(d1 - 42) # CHECK: -d1 + 42 print(42 - d1) c42 = AffineConstantExpr.get(42) assert d1 - 42 == d1 - c42 assert 42 - d1 == c42 - d1 # CHECK-LABEL: TEST: testClassHierarchy @run def testClassHierarchy(): with Context(): d1 = AffineDimExpr.get(1) c2 = AffineConstantExpr.get(2) add = AffineAddExpr.get(d1, c2) mul = AffineMulExpr.get(d1, c2) mod = AffineModExpr.get(d1, c2) floor_div = AffineFloorDivExpr.get(d1, c2) ceil_div = AffineCeilDivExpr.get(d1, c2) # CHECK: False print(isinstance(d1, AffineBinaryExpr)) # CHECK: False print(isinstance(c2, AffineBinaryExpr)) # CHECK: True print(isinstance(add, AffineBinaryExpr)) # CHECK: True print(isinstance(mul, AffineBinaryExpr)) # CHECK: True print(isinstance(mod, AffineBinaryExpr)) # CHECK: True print(isinstance(floor_div, AffineBinaryExpr)) # CHECK: True print(isinstance(ceil_div, AffineBinaryExpr)) try: AffineBinaryExpr(d1) except ValueError as e: # CHECK: Cannot cast affine expression to AffineBinaryExpr print(e) try: AffineBinaryExpr(c2) except ValueError as e: # CHECK: Cannot cast affine expression to AffineBinaryExpr print(e) # CHECK-LABEL: TEST: testIsInstance @run def testIsInstance(): with Context(): d1 = AffineDimExpr.get(1) c2 = AffineConstantExpr.get(2) add = AffineAddExpr.get(d1, c2) mul = AffineMulExpr.get(d1, c2) # CHECK: True print(AffineDimExpr.isinstance(d1)) # CHECK: False print(AffineConstantExpr.isinstance(d1)) # CHECK: True print(AffineConstantExpr.isinstance(c2)) # CHECK: False print(AffineMulExpr.isinstance(c2)) # CHECK: True print(AffineAddExpr.isinstance(add)) # CHECK: False print(AffineMulExpr.isinstance(add)) # CHECK: True print(AffineMulExpr.isinstance(mul)) # CHECK: False print(AffineAddExpr.isinstance(mul)) # CHECK-LABEL: TEST: testCompose @run def testCompose(): with Context(): # d0 + d2. expr = AffineAddExpr.get(AffineDimExpr.get(0), AffineDimExpr.get(2)) # (d0, d1, d2)[s0, s1] -> (d0 + s1, d1 + s0, d0 + d1 + d2) map1 = AffineAddExpr.get(AffineDimExpr.get(0), AffineSymbolExpr.get(1)) map2 = AffineAddExpr.get(AffineDimExpr.get(1), AffineSymbolExpr.get(0)) map3 = AffineAddExpr.get( AffineAddExpr.get(AffineDimExpr.get(0), AffineDimExpr.get(1)), AffineDimExpr.get(2), ) map = AffineMap.get(3, 2, [map1, map2, map3]) # CHECK: d0 + s1 + d0 + d1 + d2 print(expr.compose(map)) # CHECK-LABEL: TEST: testHash @run def testHash(): with Context(): d0 = AffineDimExpr.get(0) s1 = AffineSymbolExpr.get(1) assert hash(d0) == hash(AffineDimExpr.get(0)) assert hash(d0 + s1) == hash(AffineAddExpr.get(d0, s1)) dictionary = dict() dictionary[d0] = 0 dictionary[s1] = 1 assert d0 in dictionary assert s1 in dictionary