109 lines · plain
1// RUN: tco %s | FileCheck %s2 3// CHECK-LABEL: define i64 @_QTtP.mem.size(i32 %0, i16 %1)4func.func @_QTtP.mem.size(%0 : i32, %1 : i16) -> index {5 %2 = call @_QTtP.f1.size(%0, %1) : (i32, i16) -> index6 %3 = call @_QTtP.f2.size(%0, %1) : (i32, i16) -> index7 %4 = arith.addi %2, %3 : index8 // CHECK: ret i64 89 return %4 : index10}11// CHECK-LABEL: define i64 @_QTtP.f1.size(i32 %0, i16 %1)12func.func @_QTtP.f1.size(%0 : i32, %1 : i16) -> index {13 %2 = arith.constant 4 : index14 // CHECK: ret i64 415 return %2 : index16}17// CHECK-LABEL: define i64 @_QTtP.f2.size(i32 %0, i16 %1)18func.func @_QTtP.f2.size(%0 : i32, %1 : i16) -> index {19 %2 = arith.constant 4 : index20 // CHECK: ret i64 421 return %2 : index22}23// CHECK-LABEL: define i32 @_QTtP.f1.offset(i32 %0, i16 %1)24func.func @_QTtP.f1.offset(%0 : i32, %1 : i16) -> i32 {25 %2 = arith.constant 0 : i3226 // CHECK: ret i32 027 return %2 : i3228}29// CHECK-LABEL: define i32 @_QTtP.f2.offset(i32 %0, i16 %1)30func.func @_QTtP.f2.offset(%0 : i32, %1 : i16) -> i32 {31 %2 = arith.constant 4 : i3232 // CHECK: ret i32 433 return %2 : i3234}35 36// program p37// type t(p1,p2)38// integer, len :: p139// integer(kind=2), len :: p240// integer f141// real f242// end type t43// type(t) var44// var%f1 = 445// end program p46 47// CHECK-LABEL: define void @_QQmain(i32 %0, i16 %1)48func.func @_QQmain(%arg0 : i32, %arg1 : i16) {49 // CHECK: %[[size:.*]] = call i64 @_QTtP.mem.size(i32 %0, i16 %1)50 // CHECK: %[[alloc:.*]] = alloca i8, i64 %[[size]]51 %0 = fir.alloca !fir.type<_QTt(p1:i32,p2:i16){f1:i32,f2:f32}>(%arg0, %arg1 : i32, i16) {name = "_QEvar"}52 %2 = fir.coordinate_of %0, f1 : (!fir.ref<!fir.type<_QTt(p1:i32,p2:i16){f1:i32,f2:f32}>>) -> !fir.ref<i32>53 %c4_i32 = arith.constant 4 : i3254 fir.store %c4_i32 to %2 : !fir.ref<i32>55 return56}57 58// CHECK-LABEL: define i64 @_QTt1P.mem.size(i32 %0, i32 %1)59func.func @_QTt1P.mem.size(%0 : i32, %1 : i32) -> index {60 // CHECK: call i64 @_QTt1P.f1.size61 %2 = call @_QTt1P.f1.size(%0, %1) : (i32, i32) -> index62 // CHECK: call i64 @_QTt1P.f2.size63 %3 = call @_QTt1P.f2.size(%0, %1) : (i32, i32) -> index64 %4 = arith.addi %2, %3 : index65 return %4 : index66}67// CHECK-LABEL: define i64 @_QTt1P.f1.size(i32 %0, i32 %1)68func.func @_QTt1P.f1.size(%0 : i32, %1 : i32) -> index {69 %2 = fir.convert %0 : (i32) -> index70 return %2 : index71}72// CHECK-LABEL: define i64 @_QTt1P.f2.size(i32 %0, i32 %1)73func.func @_QTt1P.f2.size(%0 : i32, %1 : i32) -> index {74 %2 = fir.convert %1 : (i32) -> index75 return %2 : index76}77// CHECK-LABEL: define i32 @_QTt1P.f1.offset(i32 %0, i32 %1)78func.func @_QTt1P.f1.offset(%0 : i32, %1 : i32) -> i32 {79 %2 = arith.constant 0 : i3280 return %2 : i3281}82// CHECK-LABEL: define i32 @_QTt1P.f2.offset(i32 %0, i32 %1)83func.func @_QTt1P.f2.offset(%0 : i32, %1 : i32) -> i32 {84 return %0 : i3285}86// subroutine foo(i,j)87// type t(p1,p2)88// integer, len :: p189// integer, len :: p290// character(LEN=p1) :: f191// character(LEN=p2) :: f292// end type t93// type(t(i,j)) var94// call bar(var%f2)95// end program p96 97func.func private @bar(!fir.ref<!fir.char<1,?>>)98func.func private @__use_t1(!fir.ref<!fir.type<_QTt1(p1:i32,p2:i32){f1:!fir.char<1,?>,f2:!fir.char<1,?>}>>) -> ()99 100// CHECK-LABEL: define void @_QPfoo(i32 %0, i32 %1)101func.func @_QPfoo(%arg0 : i32, %arg1 : i32) {102 // CHECK: %[[size:.*]] = call i64 @_QTt1P.mem.size(i32 %0, i32 %1)103 // CHECK: %[[alloc:.*]] = alloca i8, i64 %[[size]]104 %0 = fir.alloca !fir.type<_QTt1(p1:i32,p2:i32){f1:!fir.char<1,?>,f2:!fir.char<1,?>}>(%arg0, %arg1 : i32, i32)105 // Keep alloca live without creating an unsupported coordinate_of on dynamic-sized field.106 func.call @__use_t1(%0) : (!fir.ref<!fir.type<_QTt1(p1:i32,p2:i32){f1:!fir.char<1,?>,f2:!fir.char<1,?>}>>) -> ()107 return108}109