192233062Smax# RUN: %PYTHON %s | FileCheck %s 292233062Smax# This is just a smoke test that the dialect is functional. 392233062Smax 492233062Smaxfrom mlir.ir import * 592233062Smaxfrom mlir.dialects import llvm 692233062Smax 792233062Smax 892233062Smaxdef constructAndPrintInModule(f): 992233062Smax print("\nTEST:", f.__name__) 1092233062Smax with Context(), Location.unknown(): 1192233062Smax module = Module.create() 1292233062Smax with InsertionPoint(module.body): 1392233062Smax f() 1492233062Smax print(module) 1592233062Smax return f 1692233062Smax 1792233062Smax 18bd8fcf75SOleksandr "Alex" Zinenko# CHECK-LABEL: testStructType 19bd8fcf75SOleksandr "Alex" Zinenko@constructAndPrintInModule 20bd8fcf75SOleksandr "Alex" Zinenkodef testStructType(): 21bd8fcf75SOleksandr "Alex" Zinenko print(llvm.StructType.get_literal([])) 22bd8fcf75SOleksandr "Alex" Zinenko # CHECK: !llvm.struct<()> 23bd8fcf75SOleksandr "Alex" Zinenko 24bd8fcf75SOleksandr "Alex" Zinenko i8, i32, i64 = tuple(map(lambda x: IntegerType.get_signless(x), [8, 32, 64])) 25bd8fcf75SOleksandr "Alex" Zinenko print(llvm.StructType.get_literal([i8, i32, i64])) 26bd8fcf75SOleksandr "Alex" Zinenko print(llvm.StructType.get_literal([i32])) 27bd8fcf75SOleksandr "Alex" Zinenko print(llvm.StructType.get_literal([i32, i32], packed=True)) 28bd8fcf75SOleksandr "Alex" Zinenko literal = llvm.StructType.get_literal([i8, i32, i64]) 29bd8fcf75SOleksandr "Alex" Zinenko assert len(literal.body) == 3 30bd8fcf75SOleksandr "Alex" Zinenko print(*tuple(literal.body)) 31bd8fcf75SOleksandr "Alex" Zinenko assert literal.name is None 32bd8fcf75SOleksandr "Alex" Zinenko # CHECK: !llvm.struct<(i8, i32, i64)> 33bd8fcf75SOleksandr "Alex" Zinenko # CHECK: !llvm.struct<(i32)> 34bd8fcf75SOleksandr "Alex" Zinenko # CHECK: !llvm.struct<packed (i32, i32)> 35bd8fcf75SOleksandr "Alex" Zinenko # CHECK: i8 i32 i64 36bd8fcf75SOleksandr "Alex" Zinenko 37bd8fcf75SOleksandr "Alex" Zinenko assert llvm.StructType.get_literal([i32]) == llvm.StructType.get_literal([i32]) 38bd8fcf75SOleksandr "Alex" Zinenko assert llvm.StructType.get_literal([i32]) != llvm.StructType.get_literal([i64]) 39bd8fcf75SOleksandr "Alex" Zinenko 40bd8fcf75SOleksandr "Alex" Zinenko print(llvm.StructType.get_identified("foo")) 41bd8fcf75SOleksandr "Alex" Zinenko print(llvm.StructType.get_identified("bar")) 42bd8fcf75SOleksandr "Alex" Zinenko # CHECK: !llvm.struct<"foo", opaque> 43bd8fcf75SOleksandr "Alex" Zinenko # CHECK: !llvm.struct<"bar", opaque> 44bd8fcf75SOleksandr "Alex" Zinenko 45bd8fcf75SOleksandr "Alex" Zinenko assert llvm.StructType.get_identified("foo") == llvm.StructType.get_identified( 46bd8fcf75SOleksandr "Alex" Zinenko "foo" 47bd8fcf75SOleksandr "Alex" Zinenko ) 48bd8fcf75SOleksandr "Alex" Zinenko assert llvm.StructType.get_identified("foo") != llvm.StructType.get_identified( 49bd8fcf75SOleksandr "Alex" Zinenko "bar" 50bd8fcf75SOleksandr "Alex" Zinenko ) 51bd8fcf75SOleksandr "Alex" Zinenko 52bd8fcf75SOleksandr "Alex" Zinenko foo_struct = llvm.StructType.get_identified("foo") 53bd8fcf75SOleksandr "Alex" Zinenko print(foo_struct.name) 54bd8fcf75SOleksandr "Alex" Zinenko print(foo_struct.body) 55bd8fcf75SOleksandr "Alex" Zinenko assert foo_struct.opaque 56bd8fcf75SOleksandr "Alex" Zinenko foo_struct.set_body([i32, i64]) 57bd8fcf75SOleksandr "Alex" Zinenko print(*tuple(foo_struct.body)) 58bd8fcf75SOleksandr "Alex" Zinenko print(foo_struct) 59bd8fcf75SOleksandr "Alex" Zinenko assert not foo_struct.packed 60bd8fcf75SOleksandr "Alex" Zinenko assert not foo_struct.opaque 61bd8fcf75SOleksandr "Alex" Zinenko assert llvm.StructType.get_identified("foo") == foo_struct 62bd8fcf75SOleksandr "Alex" Zinenko # CHECK: foo 63bd8fcf75SOleksandr "Alex" Zinenko # CHECK: None 64bd8fcf75SOleksandr "Alex" Zinenko # CHECK: i32 i64 65bd8fcf75SOleksandr "Alex" Zinenko # CHECK: !llvm.struct<"foo", (i32, i64)> 66bd8fcf75SOleksandr "Alex" Zinenko 67bd8fcf75SOleksandr "Alex" Zinenko bar_struct = llvm.StructType.get_identified("bar") 68bd8fcf75SOleksandr "Alex" Zinenko bar_struct.set_body([i32], packed=True) 69bd8fcf75SOleksandr "Alex" Zinenko print(bar_struct) 70bd8fcf75SOleksandr "Alex" Zinenko assert bar_struct.packed 71bd8fcf75SOleksandr "Alex" Zinenko # CHECK: !llvm.struct<"bar", packed (i32)> 72bd8fcf75SOleksandr "Alex" Zinenko 73bd8fcf75SOleksandr "Alex" Zinenko # Same body, should not raise. 74bd8fcf75SOleksandr "Alex" Zinenko foo_struct.set_body([i32, i64]) 75bd8fcf75SOleksandr "Alex" Zinenko 76bd8fcf75SOleksandr "Alex" Zinenko try: 77bd8fcf75SOleksandr "Alex" Zinenko foo_struct.set_body([]) 78bd8fcf75SOleksandr "Alex" Zinenko except ValueError as e: 79bd8fcf75SOleksandr "Alex" Zinenko pass 80bd8fcf75SOleksandr "Alex" Zinenko else: 81bd8fcf75SOleksandr "Alex" Zinenko assert False, "expected exception not raised" 82bd8fcf75SOleksandr "Alex" Zinenko 83bd8fcf75SOleksandr "Alex" Zinenko try: 84bd8fcf75SOleksandr "Alex" Zinenko bar_struct.set_body([i32]) 85bd8fcf75SOleksandr "Alex" Zinenko except ValueError as e: 86bd8fcf75SOleksandr "Alex" Zinenko pass 87bd8fcf75SOleksandr "Alex" Zinenko else: 88bd8fcf75SOleksandr "Alex" Zinenko assert False, "expected exception not raised" 89bd8fcf75SOleksandr "Alex" Zinenko 90bd8fcf75SOleksandr "Alex" Zinenko print(llvm.StructType.new_identified("foo", [])) 91bd8fcf75SOleksandr "Alex" Zinenko assert llvm.StructType.new_identified("foo", []) != llvm.StructType.new_identified( 92bd8fcf75SOleksandr "Alex" Zinenko "foo", [] 93bd8fcf75SOleksandr "Alex" Zinenko ) 94bd8fcf75SOleksandr "Alex" Zinenko # CHECK: !llvm.struct<"foo{{[^"]+}} 95bd8fcf75SOleksandr "Alex" Zinenko 96bd8fcf75SOleksandr "Alex" Zinenko opaque = llvm.StructType.get_opaque("opaque") 97bd8fcf75SOleksandr "Alex" Zinenko print(opaque) 98bd8fcf75SOleksandr "Alex" Zinenko assert opaque.opaque 99bd8fcf75SOleksandr "Alex" Zinenko # CHECK: !llvm.struct<"opaque", opaque> 100bd8fcf75SOleksandr "Alex" Zinenko 101bd8fcf75SOleksandr "Alex" Zinenko 10292233062Smax# CHECK-LABEL: testSmoke 10392233062Smax@constructAndPrintInModule 10492233062Smaxdef testSmoke(): 10592233062Smax mat64f32_t = Type.parse( 10692233062Smax "!llvm.struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)>" 10792233062Smax ) 10892233062Smax result = llvm.UndefOp(mat64f32_t) 10992233062Smax # CHECK: %0 = llvm.mlir.undef : !llvm.struct<(f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32, f32)> 110*79d4d165SMaksim Levental 111*79d4d165SMaksim Levental 112*79d4d165SMaksim Levental# CHECK-LABEL: testPointerType 113*79d4d165SMaksim Levental@constructAndPrintInModule 114*79d4d165SMaksim Leventaldef testPointerType(): 115*79d4d165SMaksim Levental ptr = llvm.PointerType.get() 116*79d4d165SMaksim Levental # CHECK: !llvm.ptr 117*79d4d165SMaksim Levental print(ptr) 118*79d4d165SMaksim Levental 119*79d4d165SMaksim Levental ptr_with_addr = llvm.PointerType.get(1) 120*79d4d165SMaksim Levental # CHECK: !llvm.ptr<1> 121*79d4d165SMaksim Levental print(ptr_with_addr) 122*79d4d165SMaksim Levental 123*79d4d165SMaksim Levental 124*79d4d165SMaksim Levental# CHECK-LABEL: testConstant 125*79d4d165SMaksim Levental@constructAndPrintInModule 126*79d4d165SMaksim Leventaldef testConstant(): 127*79d4d165SMaksim Levental i32 = IntegerType.get_signless(32) 128*79d4d165SMaksim Levental c_128 = llvm.mlir_constant(IntegerAttr.get(i32, 128)) 129*79d4d165SMaksim Levental # CHECK: %{{.*}} = llvm.mlir.constant(128 : i32) : i32 130*79d4d165SMaksim Levental print(c_128.owner) 131*79d4d165SMaksim Levental 132*79d4d165SMaksim Levental 133*79d4d165SMaksim Levental# CHECK-LABEL: testIntrinsics 134*79d4d165SMaksim Levental@constructAndPrintInModule 135*79d4d165SMaksim Leventaldef testIntrinsics(): 136*79d4d165SMaksim Levental i32 = IntegerType.get_signless(32) 137*79d4d165SMaksim Levental ptr = llvm.PointerType.get() 138*79d4d165SMaksim Levental c_128 = llvm.mlir_constant(IntegerAttr.get(i32, 128)) 139*79d4d165SMaksim Levental # CHECK: %[[CST128:.*]] = llvm.mlir.constant(128 : i32) : i32 140*79d4d165SMaksim Levental print(c_128.owner) 141*79d4d165SMaksim Levental 142*79d4d165SMaksim Levental alloca = llvm.alloca(ptr, c_128, i32) 143*79d4d165SMaksim Levental # CHECK: %[[ALLOCA:.*]] = llvm.alloca %[[CST128]] x i32 : (i32) -> !llvm.ptr 144*79d4d165SMaksim Levental print(alloca.owner) 145*79d4d165SMaksim Levental 146*79d4d165SMaksim Levental c_0 = llvm.mlir_constant(IntegerAttr.get(IntegerType.get_signless(8), 0)) 147*79d4d165SMaksim Levental # CHECK: %[[CST0:.+]] = llvm.mlir.constant(0 : i8) : i8 148*79d4d165SMaksim Levental print(c_0.owner) 149*79d4d165SMaksim Levental 150*79d4d165SMaksim Levental result = llvm.intr_memset(alloca, c_0, c_128, False) 151*79d4d165SMaksim Levental # CHECK: "llvm.intr.memset"(%[[ALLOCA]], %[[CST0]], %[[CST128]]) <{isVolatile = false}> : (!llvm.ptr, i8, i32) -> () 152*79d4d165SMaksim Levental print(result) 153