xref: /llvm-project/mlir/test/python/dialects/llvm.py (revision 79d4d165638b7587937fc60431e0865fd73c9334)
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