xref: /llvm-project/mlir/test/Dialect/LLVMIR/layout.mlir (revision a2acf3132334e3131ec584c2c54ec5ba2214e074)
1// RUN: mlir-opt --test-data-layout-query --split-input-file --verify-diagnostics %s | FileCheck %s
2
3module {
4  // CHECK: @no_spec
5  func.func @no_spec() {
6    // CHECK: alignment = 8
7    // CHECK: alloca_memory_space = 0
8    // CHECK: bitsize = 64
9    // CHECK: endianness = ""
10    // CHECK: global_memory_space = 0
11    // CHECK: index = 64
12    // CHECK: preferred = 8
13    // CHECK: program_memory_space = 0
14    // CHECK: size = 8
15    // CHECK: stack_alignment = 0
16    "test.data_layout_query"() : () -> !llvm.ptr
17    // CHECK: alignment = 8
18    // CHECK: alloca_memory_space = 0
19    // CHECK: bitsize = 64
20    // CHECK: endianness = ""
21    // CHECK: global_memory_space = 0
22    // CHECK: index = 64
23    // CHECK: preferred = 8
24    // CHECK: program_memory_space = 0
25    // CHECK: size = 8
26    // CHECK: stack_alignment = 0
27    "test.data_layout_query"() : () -> !llvm.ptr<3>
28    // CHECK: alignment = 8
29    // CHECK: alloca_memory_space = 0
30    // CHECK: bitsize = 64
31    // CHECK: endianness = ""
32    // CHECK: global_memory_space = 0
33    // CHECK: index = 64
34    // CHECK: preferred = 8
35    // CHECK: program_memory_space = 0
36    // CHECK: size = 8
37    // CHECK: stack_alignment = 0
38    "test.data_layout_query"() : () -> !llvm.ptr<5>
39    return
40  }
41}
42
43// -----
44
45module attributes { dlti.dl_spec = #dlti.dl_spec<
46  #dlti.dl_entry<!llvm.ptr, dense<[32, 32, 64]> : vector<3xi64>>,
47  #dlti.dl_entry<!llvm.ptr<5>, dense<[64, 64, 64]> : vector<3xi64>>,
48  #dlti.dl_entry<!llvm.ptr<4>, dense<[32, 64, 64, 24]> : vector<4xi64>>,
49  #dlti.dl_entry<"dlti.endianness", "little">,
50  #dlti.dl_entry<"dlti.alloca_memory_space", 5 : ui64>,
51  #dlti.dl_entry<"dlti.global_memory_space", 2 : ui64>,
52  #dlti.dl_entry<"dlti.program_memory_space", 3 : ui64>,
53  #dlti.dl_entry<"dlti.stack_alignment", 128 : i64>
54>} {
55  // CHECK: @spec
56  func.func @spec() {
57    // CHECK: alignment = 4
58    // CHECK: alloca_memory_space = 5
59    // CHECK: bitsize = 32
60    // CHECK: endianness = "little"
61    // CHECK: global_memory_space = 2
62    // CHECK: index = 32
63    // CHECK: preferred = 8
64    // CHECK: program_memory_space = 3
65    // CHECK: size = 4
66    // CHECK: stack_alignment = 128
67    "test.data_layout_query"() : () -> !llvm.ptr
68    // CHECK: alignment = 4
69    // CHECK: alloca_memory_space = 5
70    // CHECK: bitsize = 32
71    // CHECK: endianness = "little"
72    // CHECK: global_memory_space = 2
73    // CHECK: index = 32
74    // CHECK: preferred = 8
75    // CHECK: program_memory_space = 3
76    // CHECK: size = 4
77    // CHECK: stack_alignment = 128
78    "test.data_layout_query"() : () -> !llvm.ptr<3>
79    // CHECK: alignment = 8
80    // CHECK: alloca_memory_space = 5
81    // CHECK: bitsize = 64
82    // CHECK: endianness = "little"
83    // CHECK: global_memory_space = 2
84    // CHECK: index = 64
85    // CHECK: preferred = 8
86    // CHECK: program_memory_space = 3
87    // CHECK: size = 8
88    // CHECK: stack_alignment = 128
89    "test.data_layout_query"() : () -> !llvm.ptr<5>
90    // CHECK: alignment = 8
91    // CHECK: alloca_memory_space = 5
92    // CHECK: bitsize = 32
93    // CHECK: endianness = "little"
94    // CHECK: global_memory_space = 2
95    // CHECK: index = 24
96    // CHECK: preferred = 8
97    // CHECK: program_memory_space = 3
98    // CHECK: size = 4
99    // CHECK: stack_alignment = 128
100    "test.data_layout_query"() : () -> !llvm.ptr<4>
101    return
102  }
103}
104
105// -----
106
107// expected-error@below {{expected layout attribute for '!llvm.ptr' to be a dense integer elements attribute with 3 or 4 elements}}
108module attributes { dlti.dl_spec = #dlti.dl_spec<
109  #dlti.dl_entry<!llvm.ptr, dense<[64.0, 64.0, 64.0]> : vector<3xf32>>
110>} {
111  func.func @pointer() {
112    return
113  }
114}
115
116// -----
117
118// expected-error@below {{preferred alignment is expected to be at least as large as ABI alignment}}
119module attributes { dlti.dl_spec = #dlti.dl_spec<
120  #dlti.dl_entry<!llvm.ptr, dense<[64, 64, 32]> : vector<3xi64>>
121>} {
122  func.func @pointer() {
123    return
124  }
125}
126
127// -----
128
129// expected-error @below {{expected i64 parameters for '!llvm.ptr'}}
130module attributes { dlti.dl_spec = #dlti.dl_spec<
131  #dlti.dl_entry<!llvm.ptr, dense<[32, 32, 64]> : vector<3xi32>>
132>} {
133}
134
135// -----
136
137module {
138    // CHECK: @no_spec
139    func.func @no_spec() {
140        // simple case
141        // CHECK: alignment = 4
142        // CHECK: bitsize = 32
143        // CHECK: index = 0
144        // CHECK: preferred = 4
145        // CHECK: size = 4
146        "test.data_layout_query"() : () -> !llvm.struct<(i32)>
147
148        // padding inbetween
149        // CHECK: alignment = 8
150        // CHECK: bitsize = 128
151        // CHECK: index = 0
152        // CHECK: preferred = 8
153        // CHECK: size = 16
154        "test.data_layout_query"() : () -> !llvm.struct<(i32, f64)>
155
156        // padding at end of struct
157        // CHECK: alignment = 8
158        // CHECK: bitsize = 128
159        // CHECK: index = 0
160        // CHECK: preferred = 8
161        // CHECK: size = 16
162        "test.data_layout_query"() : () -> !llvm.struct<(f64, i32)>
163
164         // packed
165         // CHECK: alignment = 1
166         // CHECK: bitsize = 96
167         // CHECK: index = 0
168         // CHECK: preferred = 8
169         // CHECK: size = 12
170         "test.data_layout_query"() : () -> !llvm.struct<packed (f64, i32)>
171
172         // empty
173         // CHECK: alignment = 1
174         // CHECK: bitsize = 0
175         // CHECK: index = 0
176         // CHECK: preferred = 1
177         // CHECK: size = 0
178         "test.data_layout_query"() : () -> !llvm.struct<()>
179         return
180    }
181}
182
183// -----
184
185module attributes { dlti.dl_spec = #dlti.dl_spec<
186  #dlti.dl_entry<!llvm.struct<()>, dense<[32, 32]> : vector<2xi64>>
187>} {
188    // CHECK: @spec
189    func.func @spec() {
190        // Strict alignment is applied
191        // CHECK: alignment = 4
192        // CHECK: bitsize = 16
193        // CHECK: index = 0
194        // CHECK: preferred = 4
195        // CHECK: size = 2
196        "test.data_layout_query"() : () -> !llvm.struct<(i16)>
197
198        // No impact on structs that have stricter requirements
199        // CHECK: alignment = 8
200        // CHECK: bitsize = 128
201        // CHECK: index = 0
202        // CHECK: preferred = 8
203        // CHECK: size = 16
204        "test.data_layout_query"() : () -> !llvm.struct<(i32, f64)>
205
206         // Only the preferred alignment of structs is affected
207         // CHECK: alignment = 1
208         // CHECK: bitsize = 32
209         // CHECK: index = 0
210         // CHECK: preferred = 4
211         // CHECK: size = 4
212         "test.data_layout_query"() : () -> !llvm.struct<packed (i16, i16)>
213
214         // empty
215         // CHECK: alignment = 4
216         // CHECK: bitsize = 0
217         // CHECK: index = 0
218         // CHECK: preferred = 4
219         // CHECK: size = 0
220         "test.data_layout_query"() : () -> !llvm.struct<()>
221         return
222    }
223}
224
225// -----
226
227module attributes { dlti.dl_spec = #dlti.dl_spec<
228  #dlti.dl_entry<!llvm.struct<()>, dense<[32]> : vector<1xi64>>
229>} {
230    // CHECK: @spec_without_preferred
231    func.func @spec_without_preferred() {
232        // abi alignment is applied to both preferred and abi
233        // CHECK: alignment = 4
234        // CHECK: bitsize = 16
235        // CHECK: preferred = 4
236        // CHECK: size = 2
237        "test.data_layout_query"() : () -> !llvm.struct<(i16)>
238        return
239    }
240}
241
242// -----
243
244// expected-error@below {{unexpected layout attribute for struct '!llvm.struct<(i8)>'}}
245module attributes { dlti.dl_spec = #dlti.dl_spec<
246  #dlti.dl_entry<!llvm.struct<(i8)>, dense<[64, 64]> : vector<2xi64>>
247>} {
248  func.func @struct() {
249    return
250  }
251}
252
253// -----
254
255// expected-error@below {{expected layout attribute for '!llvm.struct<()>' to be a dense integer elements attribute of 1 or 2 elements}}
256module attributes { dlti.dl_spec = #dlti.dl_spec<
257  #dlti.dl_entry<!llvm.struct<()>, dense<[64, 64, 64]> : vector<3xi64>>
258>} {
259  func.func @struct() {
260    return
261  }
262}
263
264// -----
265
266// expected-error@below {{preferred alignment is expected to be at least as large as ABI alignment}}
267module attributes { dlti.dl_spec = #dlti.dl_spec<
268  #dlti.dl_entry<!llvm.struct<()>, dense<[64, 32]> : vector<2xi64>>
269>} {
270  func.func @struct() {
271    return
272  }
273}
274
275// -----
276
277module {
278    // CHECK: @arrays
279    func.func @arrays() {
280        // simple case
281        // CHECK: alignment = 4
282        // CHECK: bitsize = 64
283        // CHECK: index = 0
284        // CHECK: preferred = 4
285        // CHECK: size = 8
286        "test.data_layout_query"() : () -> !llvm.array<2 x i32>
287
288        // size 0
289        // CHECK: alignment = 8
290        // CHECK: bitsize = 0
291        // CHECK: index = 0
292        // CHECK: preferred = 8
293        // CHECK: size = 0
294        "test.data_layout_query"() : () -> !llvm.array<0 x f64>
295
296        // alignment info matches element type
297        // CHECK: alignment = 4
298        // CHECK: bitsize = 64
299        // CHECK: index = 0
300        // CHECK: preferred = 8
301        // CHECK: size = 8
302        "test.data_layout_query"() : () -> !llvm.array<1 x i64>
303        return
304    }
305}
306
307// -----
308
309module attributes { dlti.dl_spec = #dlti.dl_spec<
310  #dlti.dl_entry<!llvm.struct<()>, dense<[64]> : vector<1xi64>>
311>} {
312    // CHECK: @overaligned
313    func.func @overaligned() {
314        // Over aligned element types are respected
315        // CHECK: alignment = 8
316        // CHECK: bitsize = 128
317        // CHECK: preferred = 8
318        // CHECK: size = 16
319        "test.data_layout_query"() : () -> !llvm.array<2 x struct<(i8)>>
320         return
321    }
322}
323
324// -----
325
326// expected-error @below {{expected i64 entries for '!llvm.struct<()>'}}
327module attributes { dlti.dl_spec = #dlti.dl_spec<
328  #dlti.dl_entry<!llvm.struct<()>, dense<[64]> : vector<1xi32>>
329>} {
330}
331