Skip to content

Commit 215712d

Browse files
kiranchandramohanjeanPerier
authored andcommitted
Add support for characters and more tests
1 parent 7a3609c commit 215712d

File tree

4 files changed

+269
-38
lines changed

4 files changed

+269
-38
lines changed

flang/lib/Lower/Bridge.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,8 @@ class FirConverter : public Fortran::lower::AbstractConverter {
394394
Fortran::lower::StatementContext stmtCtx;
395395
createSomeArrayAssignment(*this, exv, hexv, localSymbols, stmtCtx);
396396
stmtCtx.finalize();
397+
} else if (hexv.getBoxOf<fir::CharBoxValue>()) {
398+
fir::factory::CharacterExprHelper{*builder, loc}.createAssign(exv, hexv);
397399
} else if (hsb.toExtendedValue().getBoxOf<fir::MutableBoxValue>()) {
398400
TODO(loc, "firstprivatisation of allocatable variables");
399401
} else {
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
! This test checks lowering of OpenMP `FIRSTPRIVATE` clause for arrays.
2+
3+
! RUN: bbc -fopenmp -emit-fir %s -o - | \
4+
! RUN: FileCheck %s --check-prefix=FIRDialect
5+
6+
!FIRDialect: func @_QPfirstprivate_arrays(%[[ARG1:.*]]: !fir.boxchar<1>, %[[ARG2:.*]]: !fir.ref<!fir.array<10xi32>>) {
7+
!FIRDialect-DAG: %[[ARG1_UNBOX:.*]]:2 = fir.unboxchar %[[ARG1]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index)
8+
!FIRDialect-DAG: %[[FIVE:.*]] = arith.constant 5 : index
9+
!FIRDialect-DAG: omp.parallel {
10+
!FIRDialect-DAG: %[[ARG1_PVT:.*]] = fir.alloca !fir.array<5x!fir.char<1>> {bindc_name = "arg1", pinned, uniq_name = "_QFfirstprivate_arraysEarg1"}
11+
!FIRDialect-DAG %[[SHAPE1:.*]] = fir.shape %c5 : (index) -> !fir.shape<1>
12+
!FIRDialect-DAG %[[ARG1_INIT_VAL:.*]] = fir.array_load %[[ARG1_PVT]](%[[SHAPE1]]) : (!fir.ref<!fir.array<5x!fir.char<1>>>, !fir.shape<1>) -> !fir.array<5x!fir.char<1>>
13+
!FIRDialect-DAG %[[ARG1_PVT_UPDATES:.*]] = fir.do_loop %arg2 = %c0 to %7 step %c1 unordered iter_args(%arg3 = %4) -> (!fir.array<5x!fir.char<1>>) {
14+
!FIRDialect-DAG {{.*}}fir.array_fetch{{.*}}
15+
!FIRDialect-DAG {{.*}}fir.array_update{{.*}}
16+
!FIRDialect-DAG fir.result{{.*}}
17+
!FIRDialect-DAG }
18+
!FIRDialect-DAG fir.array_merge_store %[[ARG1_INIT_VAL]], %[[ARG1_PVT_UPDATES]] to %[[ARG1_PVT]] : !fir.array<5x!fir.char<1>>, !fir.array<5x!fir.char<1>>, !fir.ref<!fir.array<5x!fir.char<1>>>
19+
20+
!FIRDialect: %[[ARG2_PVT:.*]] = fir.alloca !fir.array<10xi32> {bindc_name = "arg2", pinned, uniq_name = "{{.*}}Earg2"}
21+
!FIRDialect-DAG: %[[SHAPE2:.*]] = fir.shape %c10 : (index) -> !fir.shape<1>
22+
!FIRDialect-DAG: %[[ARG2_INIT_VAL:.*]] = fir.array_load %[[ARG2_PVT:.*]](%[[SHAPE2]]) : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>) -> !fir.array<10xi32>
23+
!FIRDialect-DAG: %[[ARG2_PVT_UPDATES:.*]] = fir.do_loop {{.*}} unordered
24+
!FIRDialect-DAG: {{.*}}fir.array_fetch{{.*}}
25+
!FIRDialect-DAG: {{.*}}fir.array_update{{.*}}
26+
!FIRDialect-DAG: fir.result{{.*}}
27+
!FIRDialect-DAG: }
28+
!FIRDialect-DAG: fir.array_merge_store %[[ARG2_INIT_VAL]], %[[ARG2_PVT_UPDATES]] to %[[ARG2_PVT]] : !fir.array<10xi32>, !fir.array<10xi32>, !fir.ref<!fir.array<10xi32>>
29+
!FIRDialect-DAG: omp.terminator
30+
!FIRDialect-DAG: }
31+
32+
subroutine firstprivate_arrays(arg1, arg2)
33+
character :: arg1(5)
34+
integer :: arg2(10)
35+
36+
!$OMP PARALLEL FIRSTPRIVATE(arg1, arg2)
37+
print *, arg1, arg2
38+
!$OMP END PARALLEL
39+
40+
end subroutine
Lines changed: 227 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,227 @@
1+
! This test checks lowering of `FIRSTPRIVATE` clause for scalar types.
2+
3+
! RUN: bbc -fopenmp -emit-fir %s -o - | FileCheck %s --check-prefix=FIRDialect
4+
5+
!FIRDialect: func @_QPfirstprivate_character(%[[ARG1:.*]]: !fir.boxchar<1>) {
6+
!FIRDialect-DAG: %[[ARG1_UNBOX:.*]]:2 = fir.unboxchar %[[ARG1]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index)
7+
!FIRDialect-DAG: %[[FIVE:.*]] = arith.constant 5 : index
8+
!FIRDialect-DAG: omp.parallel {
9+
!FIRDialect-DAG: %[[ARG1_PVT:.*]] = fir.alloca !fir.char<1,5> {bindc_name = "arg1", pinned, uniq_name = "_QFfirstprivate_characterEarg1"}
10+
!FIRDialect-DAG: %[[CMP:.*]] = arith.cmpi slt, %[[FIVE]], %[[FIVE]] : index
11+
!FIRDialect-DAG: %[[START:.*]] = select %[[CMP]], %[[FIVE]], %[[FIVE]] : index
12+
!FIRDialect-DAG: %[[ONE:.*]] = arith.constant 1 : i64
13+
!FIRDialect-DAG: %[[START_CVT:.*]] = fir.convert %[[START]] : (index) -> i64
14+
!FIRDialect-DAG: %[[COUNT:.*]] = arith.muli %[[ONE]], %[[START_CVT]] : i64
15+
!FIRDialect-DAG: %[[FALSE:.*]] = arith.constant false
16+
!FIRDialect-DAG: %[[ARG1_PVT_REF:.*]] = fir.convert %[[ARG1_PVT]] : (!fir.ref<!fir.char<1,5>>) -> !fir.ref<i8>
17+
!FIRDialect-DAG: %[[ARG1_REF:.*]] = fir.convert %[[ARG1_UNBOX]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<i8>
18+
!FIRDialect-DAG: fir.call @llvm.memmove.p0i8.p0i8.i64(%[[ARG1_PVT_REF]], %[[ARG1_REF]], %[[COUNT]], %[[FALSE]]) : (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> ()
19+
!FIRDialect-DAG: %[[ONE_1:.*]] = arith.constant 1 : index
20+
!FIRDialect-DAG: %[[END:.*]] = arith.subi %[[FIVE]], %c1 : index
21+
!FIRDialect-DAG: %[[SPACE:.*]] = arith.constant 32 : i8
22+
!FIRDialect: %[[UNDEF:.*]] = fir.undefined !fir.char<1>
23+
!FIRDialect: %[[SPACE_INSERT:.*]] = fir.insert_value %[[UNDEF]], %[[SPACE]], [0 : index] : (!fir.char<1>, i8) -> !fir.char<1>
24+
!FIRDialect: %[[ONE_2:.*]] = arith.constant 1 : index
25+
!FIRDialect: fir.do_loop %[[INDX:.*]] = %[[START]] to %[[END]] step %c1_0 {
26+
!FIRDialect-DAG: %[[ARG1_PVT_REF:.*]] = fir.convert %[[ARG1_PVT]] : (!fir.ref<!fir.char<1,5>>) -> !fir.ref<!fir.array<5x!fir.char<1>>>
27+
!FIRDialect-DAG: %[[ARG1_PVT_I_REF:.*]] = fir.coordinate_of %[[ARG1_PVT_REF]], %[[INDX]] : (!fir.ref<!fir.array<5x!fir.char<1>>>, index) -> !fir.ref<!fir.char<1>>
28+
!FIRDialect-DAG: fir.store %[[SPACE_INSERT]] to %[[ARG1_PVT_I_REF]] : !fir.ref<!fir.char<1>>
29+
!FIRDialect-DAG: }
30+
!FIRDialect-DAG: omp.terminator
31+
!FIRDialect-DAG: }
32+
33+
subroutine firstprivate_character(arg1)
34+
character(5) :: arg1
35+
36+
!$OMP PARALLEL FIRSTPRIVATE(arg1)
37+
print *, arg1
38+
!$OMP END PARALLEL
39+
40+
end subroutine
41+
42+
!FIRDialect: func @_QPfirstprivate_complex(%[[ARG1:.*]]: !fir.ref<!fir.complex<4>>, %[[ARG2:.*]]: !fir.ref<!fir.complex<8>>) {
43+
!FIRDialect-DAG: omp.parallel {
44+
!FIRDialect-DAG: %[[ARG1_PVT:.*]] = fir.alloca !fir.complex<4> {bindc_name = "arg1", pinned, uniq_name = "_QFfirstprivate_complexEarg1"}
45+
!FIRDialect-DAG: %[[ARG1_VAL:.*]] = fir.load %arg0 : !fir.ref<!fir.complex<4>>
46+
!FIRDialect-DAG: fir.store %[[ARG1_VAL]] to %[[ARG1_PVT]] : !fir.ref<!fir.complex<4>>
47+
!FIRDialect-DAG: %[[ARG2_PVT:.*]] = fir.alloca !fir.complex<8> {bindc_name = "arg2", pinned, uniq_name = "_QFfirstprivate_complexEarg2"}
48+
!FIRDialect-DAG: %[[ARG2_VAL:.*]] = fir.load %[[ARG2]] : !fir.ref<!fir.complex<8>>
49+
!FIRDialect-DAG: fir.store %[[ARG2_VAL]] to %[[ARG2_PVT]] : !fir.ref<!fir.complex<8>>
50+
!FIRDialect-DAG: %[[LIST_IO:.*]] = fir.call @_FortranAioBeginExternalListOutput
51+
!FIRDialect-DAG: %[[ARG1_PVT_VAL:.*]] = fir.load %[[ARG1_PVT]] : !fir.ref<!fir.complex<4>>
52+
!FIRDialect-DAG: %[[ARG1_PVT_REAL:.*]] = fir.extract_value %[[ARG1_PVT_VAL]], [0 : index] : (!fir.complex<4>) -> f32
53+
!FIRDialect-DAG: %[[ARG1_PVT_IMAG:.*]] = fir.extract_value %[[ARG1_PVT_VAL]], [1 : index] : (!fir.complex<4>) -> f32
54+
!FIRDialect-DAG: %{{.*}} = fir.call @_FortranAioOutputComplex32(%[[LIST_IO]], %[[ARG1_PVT_REAL]], %[[ARG1_PVT_IMAG]]) : (!fir.ref<i8>, f32, f32) -> i1
55+
!FIRDialect-DAG: %[[ARG2_PVT_VAL:.*]] = fir.load %[[ARG2_PVT]] : !fir.ref<!fir.complex<8>>
56+
!FIRDialect-DAG: %[[ARG2_PVT_REAL:.*]] = fir.extract_value %[[ARG2_PVT_VAL]], [0 : index] : (!fir.complex<8>) -> f64
57+
!FIRDialect-DAG: %[[ARG2_PVT_IMAG:.*]] = fir.extract_value %[[ARG2_PVT_VAL]], [1 : index] : (!fir.complex<8>) -> f64
58+
!FIRDialect-DAG: %{{.*}} = fir.call @_FortranAioOutputComplex64(%[[LIST_IO]], %[[ARG2_PVT_REAL]], %[[ARG2_PVT_IMAG]]) : (!fir.ref<i8>, f64, f64) -> i1
59+
!FIRDialect-DAG: omp.terminator
60+
!FIRDialect-DAG: }
61+
62+
subroutine firstprivate_complex(arg1, arg2)
63+
complex(4) :: arg1
64+
complex(8) :: arg2
65+
66+
!$OMP PARALLEL FIRSTPRIVATE(arg1, arg2)
67+
print *, arg1, arg2
68+
!$OMP END PARALLEL
69+
70+
end subroutine
71+
72+
!FIRDialect: func @_QPfirstprivate_integer(%[[ARG1:.*]]: !fir.ref<i32>, %[[ARG2:.*]]: !fir.ref<i8>, %[[ARG3:.*]]: !fir.ref<i16>, %[[ARG4:.*]]: !fir.ref<i32>, %[[ARG5:.*]]: !fir.ref<i64>, %[[ARG6:.*]]: !fir.ref<i128>) {
73+
!FIRDialect-DAG: omp.parallel {
74+
!FIRDialect-DAG: %[[ARG1_PVT:.*]] = fir.alloca i32 {bindc_name = "arg1", pinned, uniq_name = "_QFfirstprivate_integerEarg1"}
75+
!FIRDialect-DAG: %[[ARG1_VAL:.*]] = fir.load %[[ARG1]] : !fir.ref<i32>
76+
!FIRDialect-DAG: fir.store %[[ARG1_VAL]] to %[[ARG1_PVT]] : !fir.ref<i32>
77+
!FIRDialect-DAG: %[[ARG2_PVT:.*]] = fir.alloca i8 {bindc_name = "arg2", pinned, uniq_name = "_QFfirstprivate_integerEarg2"}
78+
!FIRDialect-DAG: %[[ARG2_VAL:.*]] = fir.load %[[ARG2]] : !fir.ref<i8>
79+
!FIRDialect-DAG: fir.store %[[ARG2_VAL]] to %[[ARG2_PVT]] : !fir.ref<i8>
80+
!FIRDialect-DAG: %[[ARG3_PVT:.*]] = fir.alloca i16 {bindc_name = "arg3", pinned, uniq_name = "_QFfirstprivate_integerEarg3"}
81+
!FIRDialect-DAG: %[[ARG3_VAL:.*]] = fir.load %[[ARG3]] : !fir.ref<i16>
82+
!FIRDialect-DAG: fir.store %[[ARG3_VAL]] to %[[ARG3_PVT]] : !fir.ref<i16>
83+
!FIRDialect-DAG: %[[ARG4_PVT:.*]] = fir.alloca i32 {bindc_name = "arg4", pinned, uniq_name = "_QFfirstprivate_integerEarg4"}
84+
!FIRDialect-DAG: %[[ARG4_VAL:.*]] = fir.load %[[ARG4]] : !fir.ref<i32>
85+
!FIRDialect-DAG: fir.store %[[ARG4_VAL]] to %[[ARG4_PVT]] : !fir.ref<i32>
86+
!FIRDialect-DAG: %[[ARG5_PVT:.*]] = fir.alloca i64 {bindc_name = "arg5", pinned, uniq_name = "_QFfirstprivate_integerEarg5"}
87+
!FIRDialect-DAG: %[[ARG5_VAL:.*]] = fir.load %[[ARG5]] : !fir.ref<i64>
88+
!FIRDialect-DAG: fir.store %[[ARG5_VAL]] to %[[ARG5_PVT]] : !fir.ref<i64>
89+
!FIRDialect-DAG: %[[ARG6_PVT:.*]] = fir.alloca i128 {bindc_name = "arg6", pinned, uniq_name = "_QFfirstprivate_integerEarg6"}
90+
!FIRDialect-DAG: %[[ARG6_VAL:.*]] = fir.load %[[ARG6]] : !fir.ref<i128>
91+
!FIRDialect-DAG: fir.store %[[ARG6_VAL]] to %[[ARG6_PVT]] : !fir.ref<i128>
92+
!FIRDialect-DAG: %[[LIST_IO:.*]] = fir.call @_FortranAioBeginExternalListOutput
93+
!FIRDialect-DAG: %[[ARG1_PVT_VAL:.*]] = fir.load %[[ARG1_PVT]] : !fir.ref<i32>
94+
!FIRDialect-DAG: %[[ARG1_PVT_CVT:.*]] = fir.convert %[[ARG1_PVT_VAL]] : (i32) -> i64
95+
!FIRDialect-DAG: %{{.*}} = fir.call @_FortranAioOutputInteger64(%[[LIST_IO]], %[[ARG1_PVT_CVT]]) : (!fir.ref<i8>, i64) -> i1
96+
!FIRDialect-DAG: %[[ARG2_PVT_VAL:.*]] = fir.load %[[ARG2_PVT]] : !fir.ref<i8>
97+
!FIRDialect-DAG: %[[ARG2_PVT_CVT:.*]] = fir.convert %[[ARG2_PVT_VAL]] : (i8) -> i64
98+
!FIRDialect-DAG: %{{.*}} = fir.call @_FortranAioOutputInteger64(%[[LIST_IO]], %[[ARG2_PVT_CVT]]) : (!fir.ref<i8>, i64) -> i1
99+
!FIRDialect-DAG: %[[ARG3_PVT_VAL:.*]] = fir.load %[[ARG3_PVT]] : !fir.ref<i16>
100+
!FIRDialect-DAG: %[[ARG3_PVT_CVT:.*]] = fir.convert %[[ARG3_PVT_VAL]] : (i16) -> i64
101+
!FIRDialect-DAG: %{{.*}} = fir.call @_FortranAioOutputInteger64(%[[LIST_IO]], %[[ARG3_PVT_CVT]]) : (!fir.ref<i8>, i64) -> i1
102+
!FIRDialect-DAG: %[[ARG4_PVT_VAL:.*]] = fir.load %[[ARG4_PVT]] : !fir.ref<i32>
103+
!FIRDialect-DAG: %[[ARG4_PVT_CVT:.*]] = fir.convert %[[ARG4_PVT_VAL]] : (i32) -> i64
104+
!FIRDialect-DAG: %{{.*}} = fir.call @_FortranAioOutputInteger64(%[[LIST_IO]], %[[ARG4_PVT_CVT]]) : (!fir.ref<i8>, i64) -> i1
105+
!FIRDialect-DAG: %[[ARG5_PVT_VAL:.*]] = fir.load %[[ARG5_PVT]] : !fir.ref<i64>
106+
!FIRDialect-DAG: %{{.*}} = fir.call @_FortranAioOutputInteger64(%[[LIST_IO]], %[[ARG5_PVT_VAL]]) : (!fir.ref<i8>, i64) -> i1
107+
!FIRDialect-DAG: %[[ARG6_PVT_VAL:.*]] = fir.load %[[ARG6_PVT]] : !fir.ref<i128>
108+
!FIRDialect-DAG: %[[ARG6_PVT_CVT:.*]] = fir.convert %[[ARG6_PVT_VAL]] : (i128) -> i64
109+
!FIRDialect-DAG: %{{.*}} = fir.call @_FortranAioOutputInteger64(%[[LIST_IO]], %[[ARG6_PVT_CVT]]) : (!fir.ref<i8>, i64) -> i1
110+
!FIRDialect-DAG: omp.terminator
111+
!FIRDialect-DAG: }
112+
113+
subroutine firstprivate_integer(arg1, arg2, arg3, arg4, arg5, arg6)
114+
integer :: arg1
115+
integer(kind=1) :: arg2
116+
integer(kind=2) :: arg3
117+
integer(kind=4) :: arg4
118+
integer(kind=8) :: arg5
119+
integer(kind=16) :: arg6
120+
121+
!$OMP PARALLEL FIRSTPRIVATE(arg1, arg2, arg3, arg4, arg5, arg6)
122+
print *, arg1, arg2, arg3, arg4, arg5, arg6
123+
!$OMP END PARALLEL
124+
125+
end subroutine
126+
127+
!FIRDialect: func @_QPfirstprivate_logical(%[[ARG1:.*]]: !fir.ref<!fir.logical<4>>, %[[ARG2:.*]]: !fir.ref<!fir.logical<1>>, %[[ARG3:.*]]: !fir.ref<!fir.logical<2>>, %[[ARG4:.*]]: !fir.ref<!fir.logical<4>>, %[[ARG5:.*]]: !fir.ref<!fir.logical<8>>) {
128+
!FIRDialect-DAG: omp.parallel {
129+
!FIRDialect-DAG: %[[ARG1_PVT:.*]] = fir.alloca !fir.logical<4> {bindc_name = "arg1", pinned, uniq_name = "_QFfirstprivate_logicalEarg1"}
130+
!FIRDialect-DAG: %[[ARG1_VAL:.*]] = fir.load %[[ARG1]] : !fir.ref<!fir.logical<4>>
131+
!FIRDialect-DAG: fir.store %[[ARG1_VAL]] to %[[ARG1_PVT]] : !fir.ref<!fir.logical<4>>
132+
!FIRDialect-DAG: %[[ARG2_PVT:.*]] = fir.alloca !fir.logical<1> {bindc_name = "arg2", pinned, uniq_name = "_QFfirstprivate_logicalEarg2"}
133+
!FIRDialect-DAG: %[[ARG2_VAL:.*]] = fir.load %[[ARG2]] : !fir.ref<!fir.logical<1>>
134+
!FIRDialect-DAG: fir.store %[[ARG2_VAL]] to %[[ARG2_PVT]] : !fir.ref<!fir.logical<1>>
135+
!FIRDialect-DAG: %[[ARG3_PVT:.*]] = fir.alloca !fir.logical<2> {bindc_name = "arg3", pinned, uniq_name = "_QFfirstprivate_logicalEarg3"}
136+
!FIRDialect-DAG: %[[ARG3_VAL:.*]] = fir.load %[[ARG3]] : !fir.ref<!fir.logical<2>>
137+
!FIRDialect-DAG: fir.store %[[ARG3_VAL]] to %[[ARG3_PVT]] : !fir.ref<!fir.logical<2>>
138+
!FIRDialect-DAG: %[[ARG4_PVT:.*]] = fir.alloca !fir.logical<4> {bindc_name = "arg4", pinned, uniq_name = "_QFfirstprivate_logicalEarg4"}
139+
!FIRDialect-DAG: %[[ARG4_VAL:.*]] = fir.load %[[ARG4]] : !fir.ref<!fir.logical<4>>
140+
!FIRDialect-DAG: fir.store %[[ARG4_VAL]] to %[[ARG4_PVT]] : !fir.ref<!fir.logical<4>>
141+
!FIRDialect-DAG: %[[ARG5_PVT:.*]] = fir.alloca !fir.logical<8> {bindc_name = "arg5", pinned, uniq_name = "_QFfirstprivate_logicalEarg5"}
142+
!FIRDialect-DAG: %[[ARG5_VAL:.*]] = fir.load %[[ARG5]] : !fir.ref<!fir.logical<8>>
143+
!FIRDialect-DAG: fir.store %[[ARG5_VAL]] to %[[ARG5_PVT]] : !fir.ref<!fir.logical<8>>
144+
!FIRDialect-DAG: %[[LIST_IO:.*]] = fir.call @_FortranAioBeginExternalListOutput
145+
!FIRDialect-DAG: %[[ARG1_PVT_VAL:.*]] = fir.load %[[ARG1_PVT]] : !fir.ref<!fir.logical<4>>
146+
!FIRDialect-DAG: %[[ARG1_PVT_CVT:.*]] = fir.convert %[[ARG1_PVT_VAL]] : (!fir.logical<4>) -> i1
147+
!FIRDialect-DAG: %{{.*}} = fir.call @_FortranAioOutputLogical(%[[LIST_IO]], %[[ARG1_PVT_CVT]]) : (!fir.ref<i8>, i1) -> i1
148+
!FIRDialect-DAG: %[[ARG2_PVT_VAL:.*]] = fir.load %[[ARG2_PVT]] : !fir.ref<!fir.logical<1>>
149+
!FIRDialect-DAG: %[[ARG2_PVT_CVT:.*]] = fir.convert %[[ARG2_PVT_VAL]] : (!fir.logical<1>) -> i1
150+
!FIRDialect-DAG: %{{.*}} = fir.call @_FortranAioOutputLogical(%[[LIST_IO]], %[[ARG2_PVT_CVT]]) : (!fir.ref<i8>, i1) -> i1
151+
!FIRDialect-DAG: %[[ARG3_PVT_VAL:.*]] = fir.load %[[ARG3_PVT]] : !fir.ref<!fir.logical<2>>
152+
!FIRDialect-DAG: %[[ARG3_PVT_CVT:.*]] = fir.convert %[[ARG3_PVT_VAL]] : (!fir.logical<2>) -> i1
153+
!FIRDialect-DAG: %{{.*}} = fir.call @_FortranAioOutputLogical(%[[LIST_IO]], %[[ARG3_PVT_CVT]]) : (!fir.ref<i8>, i1) -> i1
154+
!FIRDialect-DAG: %[[ARG4_PVT_VAL:.*]] = fir.load %[[ARG4_PVT]] : !fir.ref<!fir.logical<4>>
155+
!FIRDialect-DAG: %[[ARG4_PVT_CVT:.*]] = fir.convert %[[ARG4_PVT_VAL]] : (!fir.logical<4>) -> i1
156+
!FIRDialect-DAG: %{{.*}} = fir.call @_FortranAioOutputLogical(%[[LIST_IO]], %[[ARG4_PVT_CVT]]) : (!fir.ref<i8>, i1) -> i1
157+
!FIRDialect-DAG: %[[ARG5_PVT_VAL:.*]] = fir.load %[[ARG5_PVT]] : !fir.ref<!fir.logical<8>>
158+
!FIRDialect-DAG: %[[ARG5_PVT_CVT:.*]] = fir.convert %[[ARG5_PVT_VAL]] : (!fir.logical<8>) -> i1
159+
!FIRDialect-DAG: %{{.*}} = fir.call @_FortranAioOutputLogical(%[[LIST_IO]], %[[ARG5_PVT_CVT]]) : (!fir.ref<i8>, i1) -> i1
160+
!FIRDialect-DAG: omp.terminator
161+
!FIRDialect-DAG: }
162+
163+
subroutine firstprivate_logical(arg1, arg2, arg3, arg4, arg5)
164+
logical :: arg1
165+
logical(kind=1) :: arg2
166+
logical(kind=2) :: arg3
167+
logical(kind=4) :: arg4
168+
logical(kind=8) :: arg5
169+
170+
!$OMP PARALLEL FIRSTPRIVATE(arg1, arg2, arg3, arg4, arg5)
171+
print *, arg1, arg2, arg3, arg4, arg5
172+
!$OMP END PARALLEL
173+
174+
end subroutine
175+
176+
!FIRDialect-DAG: func @_QPfirstprivate_real(%[[ARG1:.*]]: !fir.ref<f32>, %[[ARG2:.*]]: !fir.ref<f16>, %[[ARG3:.*]]: !fir.ref<f32>, %[[ARG4:.*]]: !fir.ref<f64>, %[[ARG5:.*]]: !fir.ref<f80>, %[[ARG6:.*]]: !fir.ref<f128>) {
177+
!FIRDialect-DAG: omp.parallel {
178+
!FIRDialect-DAG: %[[ARG1_PVT:.*]] = fir.alloca f32 {bindc_name = "arg1", pinned, uniq_name = "_QFfirstprivate_realEarg1"}
179+
!FIRDialect-DAG: %[[ARG1_VAL:.*]] = fir.load %[[ARG1]] : !fir.ref<f32>
180+
!FIRDialect-DAG: fir.store %[[ARG1_VAL]] to %[[ARG1_PVT]] : !fir.ref<f32>
181+
!FIRDialect-DAG: %[[ARG2_PVT:.*]] = fir.alloca f16 {bindc_name = "arg2", pinned, uniq_name = "_QFfirstprivate_realEarg2"}
182+
!FIRDialect-DAG: %[[ARG2_VAL:.*]] = fir.load %[[ARG2]] : !fir.ref<f16>
183+
!FIRDialect-DAG: fir.store %[[ARG2_VAL]] to %[[ARG2_PVT]] : !fir.ref<f16>
184+
!FIRDialect-DAG: %[[ARG3_PVT:.*]] = fir.alloca f32 {bindc_name = "arg3", pinned, uniq_name = "_QFfirstprivate_realEarg3"}
185+
!FIRDialect-DAG: %[[ARG3_VAL:.*]] = fir.load %[[ARG3]] : !fir.ref<f32>
186+
!FIRDialect-DAG: fir.store %[[ARG3_VAL]] to %[[ARG3_PVT]] : !fir.ref<f32>
187+
!FIRDialect-DAG: %[[ARG4_PVT:.*]] = fir.alloca f64 {bindc_name = "arg4", pinned, uniq_name = "_QFfirstprivate_realEarg4"}
188+
!FIRDialect-DAG: %[[ARG4_VAL:.*]] = fir.load %[[ARG4]] : !fir.ref<f64>
189+
!FIRDialect-DAG: fir.store %[[ARG4_VAL]] to %[[ARG4_PVT]] : !fir.ref<f64>
190+
!FIRDialect-DAG: %[[ARG5_PVT:.*]] = fir.alloca f80 {bindc_name = "arg5", pinned, uniq_name = "_QFfirstprivate_realEarg5"}
191+
!FIRDialect-DAG: %[[ARG5_VAL:.*]] = fir.load %[[ARG5]] : !fir.ref<f80>
192+
!FIRDialect-DAG: fir.store %[[ARG5_VAL]] to %[[ARG5_PVT]] : !fir.ref<f80>
193+
!FIRDialect-DAG: %[[ARG6_PVT:.*]] = fir.alloca f128 {bindc_name = "arg6", pinned, uniq_name = "_QFfirstprivate_realEarg6"}
194+
!FIRDialect-DAG: %[[ARG6_VAL:.*]] = fir.load %[[ARG6]] : !fir.ref<f128>
195+
!FIRDialect-DAG: fir.store %[[ARG6_VAL]] to %[[ARG6_PVT]] : !fir.ref<f128>
196+
!FIRDialect-DAG: %[[LIST_IO:.*]] = fir.call @_FortranAioBeginExternalListOutput
197+
!FIRDialect-DAG: %[[ARG1_PVT_VAL:.*]] = fir.load %[[ARG1_PVT]] : !fir.ref<f32>
198+
!FIRDialect-DAG: %{{.*}} = fir.call @_FortranAioOutputReal32(%[[LIST_IO]], %[[ARG1_PVT_VAL]]) : (!fir.ref<i8>, f32) -> i1
199+
!FIRDialect-DAG: %[[ARG2_PVT_VAL:.*]] = fir.load %[[ARG2_PVT]] : !fir.ref<f16>
200+
!FIRDialect-DAG: %[[ARG2_PVT_CVT:.*]] = fir.convert %[[ARG2_PVT_VAL]] : (f16) -> f32
201+
!FIRDialect-DAG: %{{.*}} = fir.call @_FortranAioOutputReal32(%[[LIST_IO]], %[[ARG2_PVT_CVT]]) : (!fir.ref<i8>, f32) -> i1
202+
!FIRDialect-DAG: %[[ARG3_PVT_VAL:.*]] = fir.load %[[ARG3_PVT]] : !fir.ref<f32>
203+
!FIRDialect-DAG: %{{.*}} = fir.call @_FortranAioOutputReal32(%[[LIST_IO]], %[[ARG3_PVT_VAL]]) : (!fir.ref<i8>, f32) -> i1
204+
!FIRDialect-DAG: %[[ARG4_PVT_VAL:.*]] = fir.load %[[ARG4_PVT]] : !fir.ref<f64>
205+
!FIRDialect-DAG: %{{.*}} = fir.call @_FortranAioOutputReal64(%[[LIST_IO]], %[[ARG4_PVT_VAL]]) : (!fir.ref<i8>, f64) -> i1
206+
!FIRDialect-DAG: %[[ARG5_PVT_VAL:.*]] = fir.load %[[ARG5_PVT]] : !fir.ref<f80>
207+
!FIRDialect-DAG: %[[ARG5_PVT_CVT:.*]] = fir.convert %[[ARG5_PVT_VAL]] : (f80) -> f64
208+
!FIRDialect-DAG: %{{.*}} = fir.call @_FortranAioOutputReal64(%[[LIST_IO]], %[[ARG5_PVT_CVT]]) : (!fir.ref<i8>, f64) -> i1
209+
!FIRDialect-DAG: %[[ARG6_PVT_VAL:.*]] = fir.load %[[ARG6_PVT]] : !fir.ref<f128>
210+
!FIRDialect-DAG: %[[ARG6_PVT_CVT:.*]] = fir.convert %[[ARG6_PVT_VAL]] : (f128) -> f64
211+
!FIRDialect-DAG: %{{.*}} = fir.call @_FortranAioOutputReal64(%[[LIST_IO]], %[[ARG6_PVT_CVT]]) : (!fir.ref<i8>, f64) -> i1
212+
!FIRDialect-DAG: omp.terminator
213+
!FIRDialect-DAG: }
214+
215+
subroutine firstprivate_real(arg1, arg2, arg3, arg4, arg5, arg6)
216+
real :: arg1
217+
real(kind=2) :: arg2
218+
real(kind=4) :: arg3
219+
real(kind=8) :: arg4
220+
real(kind=10) :: arg5
221+
real(kind=16) :: arg6
222+
223+
!$OMP PARALLEL FIRSTPRIVATE(arg1, arg2, arg3, arg4, arg5, arg6)
224+
print *, arg1, arg2, arg3, arg4, arg5, arg6
225+
!$OMP END PARALLEL
226+
227+
end subroutine

0 commit comments

Comments
 (0)