405 lines · plain
1// Test FIR types conversion.2 3// RUN: fir-opt --split-input-file --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" %s | FileCheck %s4 5 6// Test sequence types `!fir.array`7// Note that we're switching from column-major to row-major here.8 9func.func private @foo0(%arg0: !fir.array<10x12xi64>)10// CHECK-LABEL: foo011// CHECK-SAME: !llvm.array<12 x array<10 x i64>>12func.func private @foo1(%arg0: !fir.array<?xf32>)13// CHECK-LABEL: foo114// CHECK-SAME: f3215func.func private @foo2(%arg0: !fir.array<?x?xf128>)16// CHECK-LABEL: foo217// CHECK-SAME: f12818func.func private @foo3(%arg0: !fir.array<*:i32>)19// CHECK-LABEL: foo320// CHECK-SAME: i3221func.func private @foo4(%arg0: !fir.array<3x?xi32>)22// CHECK-LABEL: foo423// CHECK-SAME: i3224func.func private @foo5(%arg0: !fir.array<?x6xi32>)25// CHECK-LABEL: foo526// CHECK-SAME: i3227func.func private @foo6(%arg0: !fir.array<2x?x3x?x4xi32>)28// CHECK-LABEL: foo629// CHECK-SAME: !llvm.array<2 x i32>30func.func private @foo7(%arg0: !fir.array<6x?x!fir.char<1,?>>)31// CHECK-LABEL: foo732// CHECK-SAME: i833func.func private @foo8(%arg0: !fir.array<6x?x!fir.char<1,3>>)34// CHECK-LABEL: foo835// CHECK-SAME: !llvm.array<6 x array<3 x i8>>36 37// -----38 39// Test reference types `!fir.ref`40 41func.func private @foo0(%arg0: !fir.ref<i32>)42// CHECK-LABEL: foo043// CHECK-SAME: !llvm.ptr44func.func private @foo1(%arg0: !fir.ref<!fir.array<10xf32>>)45// CHECK-LABEL: foo146// CHECK-SAME: !llvm.ptr47func.func private @foo2(%arg0: !fir.ref<!fir.box<!fir.heap<!fir.type<_QMs1Ta1{x:i32,y:f32}>>>>)48// CHECK-LABEL: foo249// CHECK-SAME: !llvm.ptr50func.func private @foo3(%arg0: !fir.ref<!fir.array<10x?x11xf32>>)51// CHECK-LABEL: foo352// CHECK-SAME: !llvm.ptr53func.func private @foo4(%arg0: !fir.ref<!fir.array<10x11x?x?xf32>>)54// CHECK-LABEL: foo455// CHECK-SAME: !llvm.ptr56func.func private @foo5(%arg0: !fir.ref<!fir.array<10x!fir.char<1,?>>>)57// CHECK-LABEL: foo558// CHECK-SAME: !llvm.ptr59func.func private @foo6(%arg0: !fir.ref<!fir.array<10x!fir.char<2,8>>>)60// CHECK-LABEL: foo661// CHECK-SAME: !llvm.ptr62func.func private @foo7(%arg0: !fir.ref<!fir.box<!fir.array<?xf32>>>)63// CHECK-LABEL: foo764// CHECK-SAME: !llvm.ptr65 66// -----67 68// Test pointer types `!fir.ptr`69 70func.func private @foo0(%arg0: !fir.ptr<i32>)71// CHECK-LABEL: foo072// CHECK-SAME: !llvm.ptr73 74func.func private @foo1(%arg0: !fir.ptr<!fir.array<10xf32>>)75// CHECK-LABEL: foo176// CHECK-SAME: !llvm.ptr77 78// -----79 80// Test box types `!fir.box`81 82func.func private @foo0(%arg0: !fir.box<!fir.array<?xf32>>)83// CHECK-LABEL: foo084// CHECK-SAME: !llvm.ptr85 86func.func private @foo1(%arg0: !fir.box<!fir.array<10xf32>>)87// CHECK-LABEL: foo188// CHECK-SAME: !llvm.ptr89 90func.func private @foo2(%arg0: !fir.box<!fir.ref<i64>>)91// CHECK-LABEL: foo292// CHECK-SAME: !llvm.ptr93 94func.func private @foo3(%arg0: !fir.box<!fir.type<derived{f:f32}>>)95// CHECK-LABEL: foo396// CHECK-SAME: !llvm.ptr97 98func.func private @foo4(%arg0: !fir.box<!fir.heap<!fir.type<_QMs1Ta1{x:i32,y:f32}>>>)99// CHECK-LABEL: foo4100// CHECK-SAME: !llvm.ptr101 102// -----103 104// Test char types `!fir.char<k, n>`105 106func.func private @foo0(%arg0: !fir.char<1, 4>, %arg1: !fir.char<1, ?>)107// CHECK-LABEL: foo0108// CHECK-SAME: !llvm.array<4 x i8>109// CHECK-SAME: i8110 111func.func private @foo1(%arg0: !fir.char<2, 12>, %arg1: !fir.char<2, ?>)112// CHECK-LABEL: foo1113// CHECK-SAME: !llvm.array<12 x i16>114// CHECK-SAME: i16115 116func.func private @foo2(%arg0: !fir.char<4, 8>, %arg1: !fir.char<4, ?>)117// CHECK-LABEL: foo2118// CHECK-SAME: !llvm.array<8 x i32>119// CHECK-SAME: i32120 121// -----122 123// Test `!fir.heap<>` conversion.124func.func private @foo0(%arg0: !fir.heap<i32>)125// CHECK-LABEL: foo0126// CHECK-SAME: !llvm.ptr127 128func.func private @foo1(%arg0: !fir.heap<!fir.array<4xf32>>)129// CHECK-LABEL: foo1130// CHECK-SAME: !llvm.ptr131 132func.func private @foo2(%arg0: !fir.heap<!fir.array<?xf32>>)133// CHECK-LABEL: foo2134// CHECK-SAME: !llvm.ptr135 136func.func private @foo3(%arg0: !fir.heap<!fir.char<1,10>>)137// CHECK-LABEL: foo3138// CHECK-SAME: !llvm.ptr139 140func.func private @foo4(%arg0: !fir.heap<!fir.char<1,?>>)141// CHECK-LABEL: foo4142// CHECK-SAME: !llvm.ptr143 144func.func private @foo5(%arg0: !fir.heap<!fir.array<2xf32>>)145// CHECK-LABEL: foo5146// CHECK-SAME: !llvm.ptr147 148func.func private @foo6(%arg0: !fir.heap<!fir.array<?x?xf32>>)149// CHECK-LABEL: foo6150// CHECK-SAME: !llvm.ptr151 152func.func private @foo7(%arg0: !fir.heap<!fir.type<ZT>>)153// CHECK-LABEL: foo7154// CHECK-SAME: !llvm.ptr155 156func.func private @foo8(%arg0: !fir.heap<!fir.type<_QMalloc_assignTt{i:i32}>>)157// CHECK-LABEL: foo8158// CHECK-SAME: !llvm.ptr159 160// -----161 162// Test `!fir.integer<KIND>` conversion.163 164func.func private @foo0(%arg0: !fir.int<1>)165// CHECK-LABEL: foo0166// CHECK-SAME: i8167 168func.func private @foo1(%arg0: !fir.int<2>)169// CHECK-LABEL: foo1170// CHECK-SAME: i16171 172func.func private @foo2(%arg0: !fir.int<4>)173// CHECK-LABEL: foo2174// CHECK-SAME: i32175 176func.func private @foo3(%arg0: !fir.int<8>)177// CHECK-LABEL: foo3178// CHECK-SAME: i64179 180func.func private @foo4(%arg0: !fir.int<16>)181// CHECK-LABEL: foo4182// CHECK-SAME: i128183 184// -----185 186// Test `!fir.logical<KIND>` conversion.187 188func.func private @foo0(%arg0: !fir.logical<1>)189// CHECK-LABEL: foo0190// CHECK-SAME: i8191 192func.func private @foo1(%arg0: !fir.logical<2>)193// CHECK-LABEL: foo1194// CHECK-SAME: i16195 196func.func private @foo2(%arg0: !fir.logical<4>)197// CHECK-LABEL: foo2198// CHECK-SAME: i32199 200func.func private @foo3(%arg0: !fir.logical<8>)201// CHECK-LABEL: foo3202// CHECK-SAME: i64203 204func.func private @foo4(%arg0: !fir.logical<16>)205// CHECK-LABEL: foo4206// CHECK-SAME: i128207 208// -----209 210// Test `!fir.llvm_ptr` conversion.211 212func.func private @foo0(%arg0: !fir.llvm_ptr<i8>)213// CHECK-LABEL: foo0214// CHECK-SAME: !llvm.ptr215 216func.func private @foo1(%arg0: !fir.llvm_ptr<!fir.ref<f32>>)217// CHECK-LABEL: foo1218// CHECK-SAME: !llvm.ptr219 220func.func private @foo2(%arg0: !fir.llvm_ptr<!fir.ref<!fir.box<!fir.ptr<i32>>>>)221// CHECK-LABEL: foo2222// CHECK-SAME: !llvm.ptr223 224func.func private @foo3(%arg0: !fir.llvm_ptr<!fir.ptr<f32>>)225// CHECK-LABEL: foo3226// CHECK-SAME: !llvm.ptr227 228// -----229 230// Test MLIR `complex<KIND>` conversion.231 232func.func private @foo0(%arg0: complex<f16>)233// CHECK-LABEL: foo0234// CHECK-SAME: !llvm.struct<(f16, f16)>)235 236func.func private @foo1(%arg0: complex<bf16>)237// CHECK-LABEL: foo1238// CHECK-SAME: !llvm.struct<(bf16, bf16)>)239 240func.func private @foo2(%arg0: complex<f32>)241// CHECK-LABEL: foo2242// CHECK-SAME: !llvm.struct<(f32, f32)>)243 244func.func private @foo3(%arg0: complex<f64>)245// CHECK-LABEL: foo3246// CHECK-SAME: !llvm.struct<(f64, f64)>)247 248func.func private @foo4(%arg0: complex<f80>)249// CHECK-LABEL: foo4250// CHECK-SAME: !llvm.struct<(f80, f80)>)251 252func.func private @foo5(%arg0: complex<f128>)253// CHECK-LABEL: foo5254// CHECK-SAME: !llvm.struct<(f128, f128)>)255 256// -----257 258// Test `!fir.complex<KIND>` conversion.259 260func.func private @foo0(%arg0: complex<f16>)261// CHECK-LABEL: foo0262// CHECK-SAME: !llvm.struct<(f16, f16)>)263 264func.func private @foo1(%arg0: complex<bf16>)265// CHECK-LABEL: foo1266// CHECK-SAME: !llvm.struct<(bf16, bf16)>)267 268func.func private @foo2(%arg0: complex<f32>)269// CHECK-LABEL: foo2270// CHECK-SAME: !llvm.struct<(f32, f32)>)271 272func.func private @foo3(%arg0: complex<f64>)273// CHECK-LABEL: foo3274// CHECK-SAME: !llvm.struct<(f64, f64)>)275 276func.func private @foo4(%arg0: complex<f80>)277// CHECK-LABEL: foo4278// CHECK-SAME: !llvm.struct<(f80, f80)>)279 280func.func private @foo5(%arg0: complex<f128>)281// CHECK-LABEL: foo5282// CHECK-SAME: !llvm.struct<(f128, f128)>)283 284// -----285 286// Test `!fir.vector<>` conversion.287 288func.func private @foo0(%arg0: !fir.vector<2:f16>)289// CHECK-LABEL: foo0290// CHECK-SAME: vector<2xf16>291 292func.func private @foo1(%arg0: !fir.vector<20:bf16>)293// CHECK-LABEL: foo1294// CHECK-SAME: vector<20xbf16>295 296func.func private @foo2(%arg0: !fir.vector<30:f32>)297// CHECK-LABEL: foo2298// CHECK-SAME: vector<30xf32>299 300func.func private @foo3(%arg0: !fir.vector<55:f64>)301// CHECK-LABEL: foo3302// CHECK-SAME: vector<55xf64>303 304func.func private @foo4(%arg0: !fir.vector<15:f80>)305// CHECK-LABEL: foo4306// CHECK-SAME: vector<15xf80>307 308func.func private @foo5(%arg0: !fir.vector<28:f128>)309// CHECK-LABEL: foo5310// CHECK-SAME: vector<28xf128>311 312func.func private @foo6(%arg0: !fir.vector<100:i1>)313// CHECK-LABEL: foo6314// CHECK-SAME: vector<100xi1>315 316func.func private @foo7(%arg0: !fir.vector<10:i8>)317// CHECK-LABEL: foo7318// CHECK-SAME: vector<10xi8>319 320func.func private @foo8(%arg0: !fir.vector<12:i16>)321// CHECK-LABEL: foo8322// CHECK-SAME: vector<12xi16>323 324func.func private @foo9(%arg0: !fir.vector<20:i32>)325// CHECK-LABEL: foo9326// CHECK-SAME: vector<20xi32>327 328func.func private @foo10(%arg0: !fir.vector<30:i64>)329// CHECK-LABEL: foo10330// CHECK-SAME: vector<30xi64>331 332// -----333 334// Test `!fir.boxchar<n>` conversion335 336func.func private @foo0(%arg0: !fir.boxchar<1>)337// CHECK-LABEL: foo0338// CHECK-SAME: !llvm.struct<(ptr, i64)>339 340func.func private @foo1(%arg0: !fir.boxchar<2>)341// CHECK-LABEL: foo1342// CHECK-SAME: !llvm.struct<(ptr, i64)>343 344// -----345 346// Test `!fir.field` conversion347 348func.func private @foo0(%arg0: !fir.field)349// CHECK-LABEL: foo0350// CHECK-SAME: i32351 352// -----353 354// Test `!fir.len` conversion.355 356func.func private @foo0(%arg0: !fir.len)357// CHECK-LABEL: foo0358// CHECK-SAME: i64359 360// -----361 362// Test `!fir.tdesc` conversion.363 364func.func private @foo0(%arg0: !fir.tdesc<!fir.type<x>>)365// CHECK-LABEL: foo0366// CHECK-SAME: !llvm.ptr367 368func.func private @foo1(%arg : !fir.tdesc<!fir.array<100xf32>>)369// CHECK-LABEL: foo1370// CHECK-SAME: !llvm.ptr371 372func.func private @foo2(%arg : !fir.tdesc<f32>)373// CHECK-LABEL: foo2374// CHECK-SAME: !llvm.ptr375 376func.func private @foo3(%arg : !fir.tdesc<!fir.type<derived7{f1:f32,f2:f32}>>)377// CHECK-LABEL: foo3378// CHECK-SAME: !llvm.ptr379 380// -----381 382// Test nested tuple types383func.func private @foo0(%arg0: tuple<i64, tuple<f32, i64>>)384// CHECK-LABEL: foo0385// CHECK-SAME: !llvm.struct<(i64, struct<(f32, i64)>)>386 387// -----388 389// Test that fir.box inside tuple and derived type are lowered to struct type.390func.func private @foo0(%arg0: tuple<i64, !fir.box<i32>>)391// CHECK-LABEL: foo0392// CHECK-SAME: !llvm.struct<(i64, struct<(ptr, i{{.*}})>)>393 394func.func private @foo1(%arg0: !fir.type<derived8{a:i64,b:!fir.box<i32>}>)395// CHECK-LABEL: foo1396// CHECK-SAME: !llvm.struct<"derived8", (i64, struct<(ptr, i{{.*}})>)>397 398// -----399 400// Test fir.box<none> translation.401// `none` is used for polymorphic type.402func.func private @foo0(%arg0: !fir.box<none>)403// CHECK-LABEL: foo0404// CHECK-SAME: !llvm.ptr)405