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