xref: /llvm-project/flang/test/Fir/pdt.fir (revision 1906188f0708eb1a517b5c093cbac43679293dda)
1// RUN: tco %s | FileCheck %s
2
3// CHECK-LINE: 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) -> index
6  %3 = call @_QTtP.f2.size(%0, %1) : (i32, i16) -> index
7  %4 = arith.addi %2, %3 : index
8  // CHECK: ret i64 8
9  return %4 : index
10}
11// CHECK-LINE: define i64 @_QTtP.f1.size(i32 %0, i16 %1)
12func.func @_QTtP.f1.size(%0 : i32, %1 : i16) -> index {
13  %2 = arith.constant 4 : index
14  // CHECK: ret i64 4
15  return %2 : index
16}
17// CHECK-LINE: define i64 @_QTtP.f2.size(i32 %0, i16 %1)
18func.func @_QTtP.f2.size(%0 : i32, %1 : i16) -> index {
19  %2 = arith.constant 4 : index
20  // CHECK: ret i64 4
21  return %2 : index
22}
23// CHECK-LINE: define i32 @_QTtP.f1.offset(i32 %0, i16 %1)
24func.func @_QTtP.f1.offset(%0 : i32, %1 : i16) -> i32 {
25  %2 = arith.constant 0 : i32
26  // CHECK: ret i32 0
27  return %2 : i32
28}
29// CHECK-LINE: define i32 @_QTtP.f2.offset(i32 %0, i16 %1)
30func.func @_QTtP.f2.offset(%0 : i32, %1 : i16) -> i32 {
31  %2 = arith.constant 4 : i32
32  // CHECK: ret i32 4
33  return %2 : i32
34}
35
36// program p
37//   type t(p1,p2)
38//      integer, len :: p1
39//      integer(kind=2), len :: p2
40//      integer f1
41//      real f2
42//   end type t
43//   type(t) var
44//   var%f1 = 4
45// end program p
46
47// CHECK-LINE: 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  %1 = fir.field_index f1, !fir.type<_QTt(p1:i32,p2:i16){f1:i32,f2:f32}>(%arg0, %arg1 : i32, i16)
53  %2 = fir.coordinate_of %0, %1 : (!fir.ref<!fir.type<_QTt(p1:i32,p2:i16){f1:i32,f2:f32}>>, !fir.field) -> !fir.ref<i32>
54  %c4_i32 = arith.constant 4 : i32
55  fir.store %c4_i32 to %2 : !fir.ref<i32>
56  return
57}
58
59// CHECK-LINE: define i64 @_QTt1P.mem.size(i32 %0, i32 %1)
60func.func @_QTt1P.mem.size(%0 : i32, %1 : i32) -> index {
61  // CHECK: call i64 @_QTt1P.f1.size
62  %2 = call @_QTt1P.f1.size(%0, %1) : (i32, i32) -> index
63  // CHECK:  call i64 @_QTt1P.f2.size
64  %3 = call @_QTt1P.f2.size(%0, %1) : (i32, i32) -> index
65  %4 = arith.addi %2, %3 : index
66  return %4 : index
67}
68// CHECK-LINE: define i64 @_QTt1P.f1.size(i32 %0, i32 %1)
69func.func @_QTt1P.f1.size(%0 : i32, %1 : i32) -> index {
70  %2 = fir.convert %0 : (i32) -> index
71  return %2 : index
72}
73// CHECK-LINE: define i64 @_QTt1P.f2.size(i32 %0, i32 %1)
74func.func @_QTt1P.f2.size(%0 : i32, %1 : i32) -> index {
75  %2 = fir.convert %1 : (i32) -> index
76  return %2 : index
77}
78// CHECK-LINE: define i32 @_QTt1P.f1.offset(i32 %0, i32 %1)
79func.func @_QTt1P.f1.offset(%0 : i32, %1 : i32) -> i32 {
80  %2 = arith.constant 0 : i32
81  return %2 : i32
82}
83// CHECK-LINE: define i32 @_QTt1P.f2.offset(i32 %0, i32 %1)
84func.func @_QTt1P.f2.offset(%0 : i32, %1 : i32) -> i32 {
85  return %0 : i32
86}
87// subroutine foo(i,j)
88//   type t(p1,p2)
89//      integer, len :: p1
90//      integer, len :: p2
91//      character(LEN=p1) :: f1
92//      character(LEN=p2) :: f2
93//   end type t
94//   type(t(i,j)) var
95//   call bar(var%f2)
96// end program p
97
98func.func private @bar(!fir.ref<!fir.char<1,?>>)
99
100// CHECK-LINE: define i8* @_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  %1 = fir.field_index f2, !fir.type<_QTt1>(%arg0, %arg1 : i32, i32)
106  //%2 = fir.coordinate_of %0, %1 : (!fir.ref<!fir.type<_QTt1>>, !fir.field) -> !fir.ref<!fir.char<1,?>>
107  %2 = fir.zero_bits !fir.ref<!fir.char<1,?>>
108  fir.call @bar(%2) : (!fir.ref<!fir.char<1,?>>) -> ()
109  return
110}
111