xref: /llvm-project/mlir/test/Target/LLVMIR/llvmir-types.mlir (revision 673604a5398dd1732d23bcd8025987dd66b10947)
1// RUN: mlir-translate -mlir-to-llvmir -split-input-file %s | FileCheck %s
2
3//
4// Primitives.
5//
6
7// CHECK: declare void @return_void()
8llvm.func @return_void() -> !llvm.void
9// CHECK: declare half @return_half()
10llvm.func @return_half() -> f16
11// CHECK: declare bfloat @return_bfloat()
12llvm.func @return_bfloat() -> bf16
13// CHECK: declare float @return_float()
14llvm.func @return_float() -> f32
15// CHECK: declare double @return_double()
16llvm.func @return_double() -> f64
17// CHECK: declare fp128 @return_fp128()
18llvm.func @return_fp128() -> f128
19// CHECK: declare x86_fp80 @return_x86_fp80()
20llvm.func @return_x86_fp80() -> f80
21// CHECK: declare ppc_fp128 @return_ppc_fp128()
22llvm.func @return_ppc_fp128() -> !llvm.ppc_fp128
23
24//
25// Functions.
26//
27
28// CHECK: declare void @f_void_i32(i32)
29llvm.func @f_void_i32(i32) -> !llvm.void
30// CHECK: declare i32 @f_i32_empty()
31llvm.func @f_i32_empty() -> i32
32// CHECK: declare i32 @f_i32_half_bfloat_float_double(half, bfloat, float, double)
33llvm.func @f_i32_half_bfloat_float_double(f16, bf16, f32, f64) -> i32
34// CHECK: declare i32 @f_i32_i32_i32(i32, i32)
35llvm.func @f_i32_i32_i32(i32, i32) -> i32
36// CHECK: declare void @f_void_variadic(...)
37llvm.func @f_void_variadic(...)
38// CHECK: declare void @f_void_i32_i32_variadic(i32, i32, ...)
39llvm.func @f_void_i32_i32_variadic(i32, i32, ...)
40// CHECK: declare ptr @f_f_i32_i32()
41llvm.func @f_f_i32_i32() -> !llvm.ptr
42
43//
44// Integers.
45//
46
47// CHECK: declare i1 @return_i1()
48llvm.func @return_i1() -> i1
49// CHECK: declare i8 @return_i8()
50llvm.func @return_i8() -> i8
51// CHECK: declare i16 @return_i16()
52llvm.func @return_i16() -> i16
53// CHECK: declare i32 @return_i32()
54llvm.func @return_i32() -> i32
55// CHECK: declare i64 @return_i64()
56llvm.func @return_i64() -> i64
57// CHECK: declare i57 @return_i57()
58llvm.func @return_i57() -> i57
59// CHECK: declare i129 @return_i129()
60llvm.func @return_i129() -> i129
61
62//
63// Pointers.
64//
65
66// CHECK: declare ptr @return_p()
67llvm.func @return_p() -> !llvm.ptr
68// CHECK: declare ptr addrspace(1) @return_p_1()
69llvm.func @return_p_1() -> !llvm.ptr<1>
70// CHECK: declare ptr addrspace(42) @return_p_42()
71llvm.func @return_p_42() -> !llvm.ptr<42>
72
73//
74// Vectors.
75//
76
77// CHECK: declare <4 x i32> @return_v4_i32()
78llvm.func @return_v4_i32() -> vector<4xi32>
79// CHECK: declare <4 x float> @return_v4_float()
80llvm.func @return_v4_float() -> vector<4xf32>
81// CHECK: declare <vscale x 4 x float> @return_vs_4_float()
82llvm.func @return_vs_4_float() -> vector<[4]xf32>
83// CHECK: declare <vscale x 4 x i32> @return_vs_4_i32()
84llvm.func @return_vs_4_i32() -> !llvm.vec<?x4 x i32>
85// CHECK: declare <vscale x 8 x half> @return_vs_8_half()
86llvm.func @return_vs_8_half() -> !llvm.vec<?x8 x f16>
87// CHECK: declare <4 x ptr> @return_v_4_pi8()
88llvm.func @return_v_4_pi8() -> !llvm.vec<4xptr>
89
90//
91// Arrays.
92//
93
94// CHECK: declare [10 x i32] @return_a10_i32()
95llvm.func @return_a10_i32() -> !llvm.array<10 x i32>
96// CHECK: declare [8 x float] @return_a8_float()
97llvm.func @return_a8_float() -> !llvm.array<8 x f32>
98// CHECK: declare [10 x ptr addrspace(4)] @return_a10_p_4()
99llvm.func @return_a10_p_4() -> !llvm.array<10 x ptr<4>>
100// CHECK: declare [10 x [4 x float]] @return_a10_a4_float()
101llvm.func @return_a10_a4_float() -> !llvm.array<10 x array<4 x f32>>
102// CHECK: declare [10 x [4 x <4 x float>]] @return_a10_a4_v4_float()
103llvm.func @return_a10_a4_v4_float() -> !llvm.array<10 x array<4 x vector<4xf32>>>
104// CHECK: declare [10 x [4 x <vscale x 4 x float>]] @return_a10_a4_sv4_float()
105llvm.func @return_a10_a4_sv4_float() -> !llvm.array<10 x array<4 x vector<[4]xf32>>>
106
107//
108// Literal structures.
109//
110
111// CHECK: declare {} @return_struct_empty()
112llvm.func @return_struct_empty() -> !llvm.struct<()>
113// CHECK: declare { i32 } @return_s_i32()
114llvm.func @return_s_i32() -> !llvm.struct<(i32)>
115// CHECK: declare { float, i32 } @return_s_float_i32()
116llvm.func @return_s_float_i32() -> !llvm.struct<(f32, i32)>
117// CHECK: declare { { i32 } } @return_s_s_i32()
118llvm.func @return_s_s_i32() -> !llvm.struct<(struct<(i32)>)>
119// CHECK: declare { i32, { i32 }, float } @return_s_i32_s_i32_float()
120llvm.func @return_s_i32_s_i32_float() -> !llvm.struct<(i32, struct<(i32)>, f32)>
121
122// CHECK: declare <{}> @return_sp_empty()
123llvm.func @return_sp_empty() -> !llvm.struct<packed ()>
124// CHECK: declare <{ i32 }> @return_sp_i32()
125llvm.func @return_sp_i32() -> !llvm.struct<packed (i32)>
126// CHECK: declare <{ float, i32 }> @return_sp_float_i32()
127llvm.func @return_sp_float_i32() -> !llvm.struct<packed (f32, i32)>
128// CHECK: declare <{ i32, { i32, i1 }, float }> @return_sp_i32_s_i31_1_float()
129llvm.func @return_sp_i32_s_i31_1_float() -> !llvm.struct<packed (i32, struct<(i32, i1)>, f32)>
130
131// CHECK: declare { <{ i32 }> } @return_s_sp_i32()
132llvm.func @return_s_sp_i32() -> !llvm.struct<(struct<packed (i32)>)>
133// CHECK: declare <{ { i32 } }> @return_sp_s_i32()
134llvm.func @return_sp_s_i32() -> !llvm.struct<packed (struct<(i32)>)>
135
136// CHECK: declare target("target-no-param") @return_target_ext_no_param()
137llvm.func @return_target_ext_no_param() -> !llvm.target<"target-no-param">
138
139// CHECK: declare target("target-type-param", i32, double) @return_target_ext_type_params()
140llvm.func @return_target_ext_type_params() -> !llvm.target<"target-type-param", i32, f64>
141
142// CHECK: declare target("target-int-param", 0, 42) @return_target_ext_int_params()
143llvm.func @return_target_ext_int_params() -> !llvm.target<"target-int-param", 0, 42>
144
145// CHECK: declare target("target-params", i32, double, 0, 5) @return_target_ext_params()
146llvm.func @return_target_ext_params() -> !llvm.target<"target-params", i32, f64, 0, 5>
147
148// -----
149// Put structs into a separate split so that we can match their declarations
150// locally.
151
152// CHECK: %empty = type {}
153// CHECK: %opaque = type opaque
154// CHECK: %long = type { i32, { i32, i1 }, float, ptr }
155// CHECK: %unpacked = type { i32 }
156// CHECK: %packed = type <{ i32 }>
157// CHECK: %"name with spaces and !^$@$#" = type <{ i32 }>
158// CHECK: %struct-of-arrays = type { [10 x i32] }
159// CHECK: %array-of-structs = type { i32 }
160
161// CHECK: declare %empty
162llvm.func @return_s_empty() -> !llvm.struct<"empty", ()>
163// CHECK: declare %opaque
164llvm.func @return_s_opaque() -> !llvm.struct<"opaque", opaque>
165// CHECK: declare %long
166llvm.func @return_s_long() -> !llvm.struct<"long", (i32, struct<(i32, i1)>, f32, ptr)>
167// CHECK: declare %unpacked
168llvm.func @return_s_unpacked() -> !llvm.struct<"unpacked", (i32)>
169// CHECK: declare %packed
170llvm.func @return_s_packed() -> !llvm.struct<"packed", packed (i32)>
171// CHECK: declare %"name with spaces and !^$@$#"
172llvm.func @return_s_symbols() -> !llvm.struct<"name with spaces and !^$@$#", packed (i32)>
173
174// CHECK: declare %struct-of-arrays
175llvm.func @return_s_struct_of_arrays() -> !llvm.struct<"struct-of-arrays", (array<10 x i32>)>
176// CHECK: declare [10 x %array-of-structs]
177llvm.func @return_s_array_of_structs() -> !llvm.array<10 x struct<"array-of-structs", (i32)>>
178