370 lines · plain
1// RUN: mlir-opt --test-data-layout-query --split-input-file --verify-diagnostics %s | FileCheck %s2 3module {4 // CHECK: @no_spec5 func.func @no_spec() {6 // CHECK: alignment = 87 // CHECK: alloca_memory_space = 08 // CHECK: bitsize = 649 // CHECK: default_memory_space = 010 // CHECK: endianness = ""11 // CHECK: function_pointer_alignment =12 // CHECK-SAME: #dlti.function_pointer_alignment<0, function_dependent = false>,13 // CHECK: global_memory_space = 014 // CHECK: index = 6415 // CHECK: legal_int_widths = array<i32>16 // CHECK: mangling_mode = ""17 // CHECK: preferred = 818 // CHECK: program_memory_space = 019 // CHECK: size = 820 // CHECK: stack_alignment = 021 "test.data_layout_query"() : () -> !llvm.ptr22 // CHECK: alignment = 823 // CHECK: alloca_memory_space = 024 // CHECK: bitsize = 6425 // CHECK: default_memory_space = 026 // CHECK: endianness = ""27 // CHECK: function_pointer_alignment =28 // CHECK-SAME: #dlti.function_pointer_alignment<0, function_dependent = false>,29 // CHECK: global_memory_space = 030 // CHECK: index = 6431 // CHECK: legal_int_widths = array<i32>32 // CHECK: mangling_mode = ""33 // CHECK: preferred = 834 // CHECK: program_memory_space = 035 // CHECK: size = 836 // CHECK: stack_alignment = 037 "test.data_layout_query"() : () -> !llvm.ptr<3>38 // CHECK: alignment = 839 // CHECK: alloca_memory_space = 040 // CHECK: bitsize = 6441 // CHECK: default_memory_space = 042 // CHECK: endianness = ""43 // CHECK: function_pointer_alignment =44 // CHECK-SAME: #dlti.function_pointer_alignment<0, function_dependent = false>,45 // CHECK: global_memory_space = 046 // CHECK: index = 6447 // CHECK: legal_int_widths = array<i32>48 // CHECK: mangling_mode = ""49 // CHECK: preferred = 850 // CHECK: program_memory_space = 051 // CHECK: size = 852 // CHECK: stack_alignment = 053 "test.data_layout_query"() : () -> !llvm.ptr<5>54 return55 }56}57 58// -----59 60module attributes { dlti.dl_spec = #dlti.dl_spec<61 #dlti.dl_entry<!llvm.ptr, dense<[32, 32, 64]> : vector<3xi64>>,62 #dlti.dl_entry<!llvm.ptr<5>, dense<[64, 64, 64]> : vector<3xi64>>,63 #dlti.dl_entry<!llvm.ptr<4>, dense<[32, 64, 64, 24]> : vector<4xi64>>,64 #dlti.dl_entry<"dlti.endianness", "little">,65 #dlti.dl_entry<"dlti.default_memory_space", 7 : ui64>,66 #dlti.dl_entry<"dlti.alloca_memory_space", 5 : ui64>,67 #dlti.dl_entry<"dlti.global_memory_space", 2 : ui64>,68 #dlti.dl_entry<"dlti.program_memory_space", 3 : ui64>,69 #dlti.dl_entry<"dlti.stack_alignment", 128 : i64>,70 #dlti.dl_entry<"dlti.mangling_mode", "e">,71 #dlti.dl_entry<"dlti.legal_int_widths", array<i32: 32, 64>>,72 #dlti.dl_entry<"dlti.function_pointer_alignment",73 "#dlti.function_pointer_alignment<32, function_dependent = true>">74>} {75 // CHECK: @spec76 func.func @spec() {77 // CHECK: alignment = 478 // CHECK: alloca_memory_space = 579 // CHECK: bitsize = 3280 // CHECK: default_memory_space = 781 // CHECK: endianness = "little"82 // CHECK: function_pointer_alignment =83 // CHECK-SAME: "#dlti.function_pointer_alignment<32, function_dependent = true>",84 // CHECK: global_memory_space = 285 // CHECK: index = 3286 // CHECK: legal_int_widths = array<i32: 32, 64>87 // CHECK: mangling_mode = "e"88 // CHECK: preferred = 889 // CHECK: program_memory_space = 390 // CHECK: size = 491 // CHECK: stack_alignment = 12892 "test.data_layout_query"() : () -> !llvm.ptr93 // CHECK: alignment = 494 // CHECK: alloca_memory_space = 595 // CHECK: bitsize = 3296 // CHECK: default_memory_space = 797 // CHECK: endianness = "little"98 // CHECK: function_pointer_alignment =99 // CHECK-SAME: "#dlti.function_pointer_alignment<32, function_dependent = true>",100 // CHECK: global_memory_space = 2101 // CHECK: index = 32102 // CHECK: legal_int_widths = array<i32: 32, 64>103 // CHECK: preferred = 8104 // CHECK: program_memory_space = 3105 // CHECK: size = 4106 // CHECK: stack_alignment = 128107 "test.data_layout_query"() : () -> !llvm.ptr<3>108 // CHECK: alignment = 8109 // CHECK: alloca_memory_space = 5110 // CHECK: bitsize = 64111 // CHECK: default_memory_space = 7112 // CHECK: endianness = "little"113 // CHECK: function_pointer_alignment =114 // CHECK-SAME: "#dlti.function_pointer_alignment<32, function_dependent = true>",115 // CHECK: global_memory_space = 2116 // CHECK: index = 64117 // CHECK: legal_int_widths = array<i32: 32, 64>118 // CHECK: mangling_mode = "e"119 // CHECK: preferred = 8120 // CHECK: program_memory_space = 3121 // CHECK: size = 8122 // CHECK: stack_alignment = 128123 "test.data_layout_query"() : () -> !llvm.ptr<5>124 // CHECK: alignment = 8125 // CHECK: alloca_memory_space = 5126 // CHECK: bitsize = 32127 // CHECK: default_memory_space = 7128 // CHECK: endianness = "little"129 // CHECK: function_pointer_alignment =130 // CHECK-SAME: "#dlti.function_pointer_alignment<32, function_dependent = true>",131 // CHECK: global_memory_space = 2132 // CHECK: index = 24133 // CHECK: legal_int_widths = array<i32: 32, 64>134 // CHECK: mangling_mode = "e"135 // CHECK: preferred = 8136 // CHECK: program_memory_space = 3137 // CHECK: size = 4138 // CHECK: stack_alignment = 128139 "test.data_layout_query"() : () -> !llvm.ptr<4>140 return141 }142}143 144// -----145 146// expected-error@below {{expected layout attribute for '!llvm.ptr' to be a dense integer elements attribute with 3 or 4 elements}}147module attributes { dlti.dl_spec = #dlti.dl_spec<148 #dlti.dl_entry<!llvm.ptr, dense<[64.0, 64.0, 64.0]> : vector<3xf32>>149>} {150 func.func @pointer() {151 return152 }153}154 155// -----156 157// expected-error@below {{preferred alignment is expected to be at least as large as ABI alignment}}158module attributes { dlti.dl_spec = #dlti.dl_spec<159 #dlti.dl_entry<!llvm.ptr, dense<[64, 64, 32]> : vector<3xi64>>160>} {161 func.func @pointer() {162 return163 }164}165 166// -----167 168// expected-error @below {{expected i64 parameters for '!llvm.ptr'}}169module attributes { dlti.dl_spec = #dlti.dl_spec<170 #dlti.dl_entry<!llvm.ptr, dense<[32, 32, 64]> : vector<3xi32>>171>} {172}173 174// -----175 176module {177 // CHECK: @no_spec178 func.func @no_spec() {179 // simple case180 // CHECK: alignment = 4181 // CHECK: bitsize = 32182 // CHECK: index = 0183 // CHECK: preferred = 4184 // CHECK: size = 4185 "test.data_layout_query"() : () -> !llvm.struct<(i32)>186 187 // padding inbetween188 // CHECK: alignment = 8189 // CHECK: bitsize = 128190 // CHECK: index = 0191 // CHECK: preferred = 8192 // CHECK: size = 16193 "test.data_layout_query"() : () -> !llvm.struct<(i32, f64)>194 195 // padding at end of struct196 // CHECK: alignment = 8197 // CHECK: bitsize = 128198 // CHECK: index = 0199 // CHECK: preferred = 8200 // CHECK: size = 16201 "test.data_layout_query"() : () -> !llvm.struct<(f64, i32)>202 203 // packed204 // CHECK: alignment = 1205 // CHECK: bitsize = 96206 // CHECK: index = 0207 // CHECK: preferred = 8208 // CHECK: size = 12209 "test.data_layout_query"() : () -> !llvm.struct<packed (f64, i32)>210 211 // empty212 // CHECK: alignment = 1213 // CHECK: bitsize = 0214 // CHECK: index = 0215 // CHECK: preferred = 1216 // CHECK: size = 0217 "test.data_layout_query"() : () -> !llvm.struct<()>218 return219 }220}221 222// -----223 224module attributes { dlti.dl_spec = #dlti.dl_spec<225 #dlti.dl_entry<!llvm.struct<()>, dense<[32, 32]> : vector<2xi64>>226>} {227 // CHECK: @spec228 func.func @spec() {229 // Strict alignment is applied230 // CHECK: alignment = 4231 // CHECK: bitsize = 16232 // CHECK: index = 0233 // CHECK: preferred = 4234 // CHECK: size = 2235 "test.data_layout_query"() : () -> !llvm.struct<(i16)>236 237 // No impact on structs that have stricter requirements238 // CHECK: alignment = 8239 // CHECK: bitsize = 128240 // CHECK: index = 0241 // CHECK: preferred = 8242 // CHECK: size = 16243 "test.data_layout_query"() : () -> !llvm.struct<(i32, f64)>244 245 // Only the preferred alignment of structs is affected246 // CHECK: alignment = 1247 // CHECK: bitsize = 32248 // CHECK: index = 0249 // CHECK: preferred = 4250 // CHECK: size = 4251 "test.data_layout_query"() : () -> !llvm.struct<packed (i16, i16)>252 253 // empty254 // CHECK: alignment = 4255 // CHECK: bitsize = 0256 // CHECK: index = 0257 // CHECK: preferred = 4258 // CHECK: size = 0259 "test.data_layout_query"() : () -> !llvm.struct<()>260 return261 }262}263 264// -----265 266module attributes { dlti.dl_spec = #dlti.dl_spec<267 #dlti.dl_entry<!llvm.struct<()>, dense<[32]> : vector<1xi64>>268>} {269 // CHECK: @spec_without_preferred270 func.func @spec_without_preferred() {271 // abi alignment is applied to both preferred and abi272 // CHECK: alignment = 4273 // CHECK: bitsize = 16274 // CHECK: preferred = 4275 // CHECK: size = 2276 "test.data_layout_query"() : () -> !llvm.struct<(i16)>277 return278 }279}280 281// -----282 283// expected-error@below {{unexpected layout attribute for struct '!llvm.struct<(i8)>'}}284module attributes { dlti.dl_spec = #dlti.dl_spec<285 #dlti.dl_entry<!llvm.struct<(i8)>, dense<[64, 64]> : vector<2xi64>>286>} {287 func.func @struct() {288 return289 }290}291 292// -----293 294// expected-error@below {{expected layout attribute for '!llvm.struct<()>' to be a dense integer elements attribute of 1 or 2 elements}}295module attributes { dlti.dl_spec = #dlti.dl_spec<296 #dlti.dl_entry<!llvm.struct<()>, dense<[64, 64, 64]> : vector<3xi64>>297>} {298 func.func @struct() {299 return300 }301}302 303// -----304 305// expected-error@below {{preferred alignment is expected to be at least as large as ABI alignment}}306module attributes { dlti.dl_spec = #dlti.dl_spec<307 #dlti.dl_entry<!llvm.struct<()>, dense<[64, 32]> : vector<2xi64>>308>} {309 func.func @struct() {310 return311 }312}313 314// -----315 316module {317 // CHECK: @arrays318 func.func @arrays() {319 // simple case320 // CHECK: alignment = 4321 // CHECK: bitsize = 64322 // CHECK: index = 0323 // CHECK: preferred = 4324 // CHECK: size = 8325 "test.data_layout_query"() : () -> !llvm.array<2 x i32>326 327 // size 0328 // CHECK: alignment = 8329 // CHECK: bitsize = 0330 // CHECK: index = 0331 // CHECK: preferred = 8332 // CHECK: size = 0333 "test.data_layout_query"() : () -> !llvm.array<0 x f64>334 335 // alignment info matches element type336 // CHECK: alignment = 4337 // CHECK: bitsize = 64338 // CHECK: index = 0339 // CHECK: preferred = 8340 // CHECK: size = 8341 "test.data_layout_query"() : () -> !llvm.array<1 x i64>342 return343 }344}345 346// -----347 348module attributes { dlti.dl_spec = #dlti.dl_spec<349 #dlti.dl_entry<!llvm.struct<()>, dense<[64]> : vector<1xi64>>350>} {351 // CHECK: @overaligned352 func.func @overaligned() {353 // Over aligned element types are respected354 // CHECK: alignment = 8355 // CHECK: bitsize = 128356 // CHECK: preferred = 8357 // CHECK: size = 16358 "test.data_layout_query"() : () -> !llvm.array<2 x struct<(i8)>>359 return360 }361}362 363// -----364 365// expected-error @below {{expected i64 entries for '!llvm.struct<()>'}}366module attributes { dlti.dl_spec = #dlti.dl_spec<367 #dlti.dl_entry<!llvm.struct<()>, dense<[64]> : vector<1xi32>>368>} {369}370