brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.7 KiB · 04f48e7 Raw
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