xref: /llvm-project/mlir/test/Dialect/LLVMIR/types.mlir (revision 673604a5398dd1732d23bcd8025987dd66b10947)
1// RUN: mlir-opt -allow-unregistered-dialect %s -split-input-file | mlir-opt -allow-unregistered-dialect | FileCheck %s
2
3// CHECK-LABEL: @primitive
4func.func @primitive() {
5  // CHECK: !llvm.void
6  "some.op"() : () -> !llvm.void
7  // CHECK: !llvm.ppc_fp128
8  "some.op"() : () -> !llvm.ppc_fp128
9  // CHECK: !llvm.token
10  "some.op"() : () -> !llvm.token
11  // CHECK: !llvm.label
12  "some.op"() : () -> !llvm.label
13  // CHECK: !llvm.metadata
14  "some.op"() : () -> !llvm.metadata
15  return
16}
17
18// CHECK-LABEL: @func
19func.func @func() {
20  // CHECK: !llvm.func<void ()>
21  "some.op"() : () -> !llvm.func<void ()>
22  // CHECK: !llvm.func<void (i32)>
23  "some.op"() : () -> !llvm.func<void (i32)>
24  // CHECK: !llvm.func<i32 ()>
25  "some.op"() : () -> !llvm.func<i32 ()>
26  // CHECK: !llvm.func<i32 (f16, bf16, f32, f64)>
27  "some.op"() : () -> !llvm.func<i32 (f16, bf16, f32, f64)>
28  // CHECK: !llvm.func<i32 (i32, i32)>
29  "some.op"() : () -> !llvm.func<i32 (i32, i32)>
30  // CHECK: !llvm.func<void (...)>
31  "some.op"() : () -> !llvm.func<void (...)>
32  // CHECK: !llvm.func<void (i32, i32, ...)>
33  "some.op"() : () -> !llvm.func<void (i32, i32, ...)>
34  return
35}
36
37// CHECK-LABEL: @integer
38func.func @integer() {
39  // CHECK: i1
40  "some.op"() : () -> i1
41  // CHECK: i8
42  "some.op"() : () -> i8
43  // CHECK: i16
44  "some.op"() : () -> i16
45  // CHECK: i32
46  "some.op"() : () -> i32
47  // CHECK: i64
48  "some.op"() : () -> i64
49  // CHECK: i57
50  "some.op"() : () -> i57
51  // CHECK: i129
52  "some.op"() : () -> i129
53  return
54}
55
56// CHECK-LABEL: @ptr
57func.func @ptr() {
58  // CHECK: !llvm.ptr
59  "some.op"() : () -> !llvm.ptr
60  // CHECK: !llvm.ptr
61  "some.op"() : () -> !llvm.ptr<0>
62  // CHECK: !llvm.ptr<42>
63  "some.op"() : () -> !llvm.ptr<42>
64  // CHECK: !llvm.ptr<9>
65  "some.op"() : () -> !llvm.ptr<9>
66  return
67}
68
69// CHECK-LABEL: @vec
70func.func @vec() {
71  // CHECK: vector<4xi32>
72  "some.op"() : () -> vector<4xi32>
73  // CHECK: vector<4xf32>
74  "some.op"() : () -> vector<4xf32>
75  // CHECK: !llvm.vec<? x 4 x i32>
76  "some.op"() : () -> !llvm.vec<? x 4 x i32>
77  // CHECK: !llvm.vec<? x 8 x f16>
78  "some.op"() : () -> !llvm.vec<? x 8 x f16>
79  // CHECK: !llvm.vec<4 x ptr>
80  "some.op"() : () -> !llvm.vec<4 x ptr>
81  return
82}
83
84// CHECK-LABEL: @array
85func.func @array() {
86  // CHECK: !llvm.array<10 x i32>
87  "some.op"() : () -> !llvm.array<10 x i32>
88  // CHECK: !llvm.array<8 x f32>
89  "some.op"() : () -> !llvm.array<8 x f32>
90  // CHECK: !llvm.array<10 x ptr<4>>
91  "some.op"() : () -> !llvm.array<10 x ptr<4>>
92  // CHECK: !llvm.array<10 x array<4 x f32>>
93  "some.op"() : () -> !llvm.array<10 x array<4 x f32>>
94  // CHECK: !llvm.array<10 x array<4 x vector<8xf32>>>
95  "some.op"() : () -> !llvm.array<10 x array<4 x vector<8xf32>>>
96  // CHECK: !llvm.array<10 x array<4 x vector<[8]xf32>>>
97  "some.op"() : () -> !llvm.array<10 x array<4 x vector<[8]xf32>>>
98  return
99}
100
101// CHECK-LABEL: @literal_struct
102func.func @literal_struct() {
103  // CHECK: !llvm.struct<()>
104  "some.op"() : () -> !llvm.struct<()>
105  // CHECK: !llvm.struct<(i32)>
106  "some.op"() : () -> !llvm.struct<(i32)>
107  // CHECK: !llvm.struct<(f32, i32)>
108  "some.op"() : () -> !llvm.struct<(f32, i32)>
109  // CHECK: !llvm.struct<(struct<(i32)>)>
110  "some.op"() : () -> !llvm.struct<(struct<(i32)>)>
111  // CHECK: !llvm.struct<(i32, struct<(i32)>, f32)>
112  "some.op"() : () -> !llvm.struct<(i32, struct<(i32)>, f32)>
113
114  // CHECK: !llvm.struct<packed ()>
115  "some.op"() : () -> !llvm.struct<packed ()>
116  // CHECK: !llvm.struct<packed (i32)>
117  "some.op"() : () -> !llvm.struct<packed (i32)>
118  // CHECK: !llvm.struct<packed (f32, i32)>
119  "some.op"() : () -> !llvm.struct<packed (f32, i32)>
120  // CHECK: !llvm.struct<packed (f32, i32)>
121  "some.op"() : () -> !llvm.struct<packed (f32, i32)>
122  // CHECK: !llvm.struct<packed (struct<(i32)>)>
123  "some.op"() : () -> !llvm.struct<packed (struct<(i32)>)>
124  // CHECK: !llvm.struct<packed (i32, struct<(i32, i1)>, f32)>
125  "some.op"() : () -> !llvm.struct<packed (i32, struct<(i32, i1)>, f32)>
126
127  // CHECK: !llvm.struct<(struct<packed (i32)>)>
128  "some.op"() : () -> !llvm.struct<(struct<packed (i32)>)>
129  // CHECK: !llvm.struct<packed (struct<(i32)>)>
130  "some.op"() : () -> !llvm.struct<packed (struct<(i32)>)>
131  return
132}
133
134// CHECK-LABEL: @identified_struct
135func.func @identified_struct() {
136  // CHECK: !llvm.struct<"empty", ()>
137  "some.op"() : () -> !llvm.struct<"empty", ()>
138  // CHECK: !llvm.struct<"opaque", opaque>
139  "some.op"() : () -> !llvm.struct<"opaque", opaque>
140  // CHECK: !llvm.struct<"long", (i32, struct<(i32, i1)>, f32, ptr)>
141  "some.op"() : () -> !llvm.struct<"long", (i32, struct<(i32, i1)>, f32, ptr)>
142  // CHECK: !llvm.struct<"unpacked", (i32)>
143  "some.op"() : () -> !llvm.struct<"unpacked", (i32)>
144  // CHECK: !llvm.struct<"packed", packed (i32)>
145  "some.op"() : () -> !llvm.struct<"packed", packed (i32)>
146  // CHECK: !llvm.struct<"name with spaces and !^$@$#", packed (i32)>
147  "some.op"() : () -> !llvm.struct<"name with spaces and !^$@$#", packed (i32)>
148  // CHECK: !llvm.struct<"outer", (struct<"nested", ()>)>
149  "some.op"() : () -> !llvm.struct<"outer", (struct<"nested", ()>)>
150  // CHECK: !llvm.struct<"referring-another", (ptr)>
151  "some.op"() : () -> !llvm.struct<"referring-another", (ptr)>
152  // CHECK: !llvm.struct<"struct-of-arrays", (array<10 x i32>)>
153  "some.op"() : () -> !llvm.struct<"struct-of-arrays", (array<10 x i32>)>
154  // CHECK: !llvm.array<10 x struct<"array-of-structs", (i32)>>
155  "some.op"() : () -> !llvm.array<10 x struct<"array-of-structs", (i32)>>
156  return
157}
158
159func.func @verbose() {
160  // CHECK: !llvm.struct<(i64, struct<(f32)>)>
161  "some.op"() : () -> !llvm.struct<(i64, !llvm.struct<(f32)>)>
162  return
163}
164
165// -----
166
167// Check that type aliases can be used inside LLVM dialect types. Note that
168// currently they are _not_ printed back as this would require
169// DialectAsmPrinter to have a mechanism for querying the presence and
170// usability of an alias outside of its `printType` method.
171
172!baz = i64
173!qux = !llvm.struct<(!baz)>
174
175// CHECK: aliases
176llvm.func @aliases() {
177  // CHECK: !llvm.struct<(i32, f32, struct<(i64)>)>
178  "some.op"() : () -> !llvm.struct<(i32, f32, !qux)>
179  llvm.return
180}
181
182// -----
183
184// CHECK-LABEL: ext_target
185llvm.func @ext_target() {
186    // CHECK: !llvm.target<"target1", i32, 1>
187    %0 = "some.op"() : () -> !llvm.target<"target1", i32, 1>
188    // CHECK: !llvm.target<"target2">
189    %1 = "some.op"() : () -> !llvm.target<"target2">
190    // CHECK: !llvm.target<"target3", i32, i64, f64>
191    %2 = "some.op"() : () -> !llvm.target<"target3", i32, i64, f64>
192    // CHECK: !llvm.target<"target4", 1, 0, 42>
193    %3 = "some.op"() : () -> !llvm.target<"target4", 1, 0, 42>
194    // CHECK: !llvm.target<"target5", i32, f64, 0, 5>
195    %4 = "some.op"() : () -> !llvm.target<"target5", i32, f64, 0, 5>
196    llvm.return
197}
198