Skip to content

Commit 18b0621

Browse files
authored
Merge pull request #791 from Leporacanthicus/modifiers
[OpenMP][Flang]Add support for modifiers monotonic and non-monotonic
2 parents 776a3da + cba7222 commit 18b0621

File tree

14 files changed

+626
-28
lines changed

14 files changed

+626
-28
lines changed

flang/lib/Lower/OpenMP.cpp

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,67 @@ genOMP(Fortran::lower::AbstractConverter &converter,
336336
}
337337
}
338338

339+
static mlir::omp::ScheduleModifier
340+
translateModifier(const Fortran::parser::OmpScheduleModifierType &m) {
341+
switch (m.v) {
342+
case Fortran::parser::OmpScheduleModifierType::ModType::Monotonic:
343+
return mlir::omp::ScheduleModifier::monotonic;
344+
case Fortran::parser::OmpScheduleModifierType::ModType::Nonmonotonic:
345+
return mlir::omp::ScheduleModifier::nonmonotonic;
346+
case Fortran::parser::OmpScheduleModifierType::ModType::Simd:
347+
return mlir::omp::ScheduleModifier::simd;
348+
}
349+
return mlir::omp::ScheduleModifier::none;
350+
}
351+
352+
static mlir::omp::ScheduleModifier
353+
getScheduleModifiers(const Fortran::parser::OmpScheduleClause &x) {
354+
const auto &modifier =
355+
std::get<std::optional<Fortran::parser::OmpScheduleModifier>>(x.t);
356+
// The input may have the modifier any order, so we look for one that isn't
357+
// SIMD. If modifier is not set at all, fall down to the bottom and return
358+
// "none".
359+
if (modifier) {
360+
const auto &modType1 =
361+
std::get<Fortran::parser::OmpScheduleModifier::Modifier1>(modifier->t);
362+
if (modType1.v.v ==
363+
Fortran::parser::OmpScheduleModifierType::ModType::Simd) {
364+
const auto &modType2 = std::get<
365+
std::optional<Fortran::parser::OmpScheduleModifier::Modifier2>>(
366+
modifier->t);
367+
if (modType2->v.v !=
368+
Fortran::parser::OmpScheduleModifierType::ModType::Simd)
369+
return translateModifier(modType2->v);
370+
}
371+
372+
return translateModifier(modType1.v);
373+
}
374+
return mlir::omp::ScheduleModifier::none;
375+
}
376+
377+
static mlir::omp::ScheduleModifier
378+
getSIMDModifier(const Fortran::parser::OmpScheduleClause &x) {
379+
const auto &modifier =
380+
std::get<std::optional<Fortran::parser::OmpScheduleModifier>>(x.t);
381+
// Either of the two possible modifiers in the input can be the SIMD modifier,
382+
// so look in either one, and return simd if we find one. Not found = return
383+
// "none".
384+
if (modifier) {
385+
const auto &modType1 =
386+
std::get<Fortran::parser::OmpScheduleModifier::Modifier1>(modifier->t);
387+
if (modType1.v.v == Fortran::parser::OmpScheduleModifierType::ModType::Simd)
388+
return mlir::omp::ScheduleModifier::simd;
389+
390+
const auto &modType2 = std::get<
391+
std::optional<Fortran::parser::OmpScheduleModifier::Modifier2>>(
392+
modifier->t);
393+
if (modType2->v.v ==
394+
Fortran::parser::OmpScheduleModifierType::ModType::Simd)
395+
return mlir::omp::ScheduleModifier::simd;
396+
}
397+
return mlir::omp::ScheduleModifier::none;
398+
}
399+
339400
static void genOMP(Fortran::lower::AbstractConverter &converter,
340401
Fortran::lower::pft::Evaluation &eval,
341402
const Fortran::parser::OpenMPLoopConstruct &loopConstruct) {
@@ -479,6 +540,11 @@ static void genOMP(Fortran::lower::AbstractConverter &converter,
479540
omp::ClauseScheduleKind::Runtime)));
480541
break;
481542
}
543+
wsLoopOp.schedule_modifiersAttr(
544+
firOpBuilder.getStringAttr(omp::stringifyScheduleModifier(
545+
getScheduleModifiers(scheduleClause->v))));
546+
wsLoopOp.simd_modifierAttr(firOpBuilder.getStringAttr(
547+
omp::stringifyScheduleModifier(getSIMDModifier(scheduleClause->v))));
482548
}
483549
}
484550
// In FORTRAN `nowait` clause occur at the end of `omp do` directive.
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
! This test checks lowering of OpenMP DO Directive(Worksharing).
2+
3+
! RUN: bbc -fopenmp -emit-fir %s -o - | \
4+
! RUN: FileCheck %s --check-prefix=FIRDialect
5+
! RUN: bbc -fopenmp -emit-fir %s -o - | \
6+
! RUN: tco --disable-llvm --print-ir-after=fir-to-llvm-ir 2>&1 | \
7+
! RUN: FileCheck %s --check-prefix=LLVMIRDialect
8+
! RUN: bbc -fopenmp -emit-fir %s -o - | \
9+
! RUN: tco | FileCheck %s --check-prefix=LLVMIR
10+
11+
program wsloop_dynamic
12+
integer :: i
13+
!FIRDialect: func @_QQmain()
14+
!LLVMIRDialect: func @_QQmain()
15+
16+
!LLVMIR: define void @_QQmain()
17+
!LLVMIR:call i32 @__kmpc_global_thread_num{{.*}}
18+
!LLVMIR: br label %omp_parallel
19+
20+
!$OMP PARALLEL
21+
!FIRDialect-LABLEL: omp.parallel {
22+
!LLVMIRDialect-LABLEL: omp.parallel {
23+
24+
!LLVMIR: omp_parallel: ; preds = %0
25+
!LLVMIR: @__kmpc_fork_call
26+
!$OMP DO SCHEDULE(dynamic)
27+
!FIRDialect: %[[WS_LB:.*]] = constant 1 : i32
28+
!FIRDialect: %[[WS_UB:.*]] = constant 9 : i32
29+
!FIRDialect: %[[WS_STEP:.*]] = constant 1 : i32
30+
!FIRDialect: omp.wsloop (%[[I:.*]]) : i32 = (%[[WS_LB]]) to (%[[WS_UB]]) step (%[[WS_STEP]]) schedule(dynamic, none) nowait inclusive
31+
32+
!LLVMIRDialect: %[[WS_UB:.*]] = llvm.mlir.constant(9 : i32) : i32
33+
!LLVMIRDialect: %[[WS_LB_STEP:.*]] = llvm.mlir.constant(1 : i32) : i32
34+
!LLVMIRDialect: omp.wsloop (%[[I:.*]]) : i32 = (%[[WS_LB_STEP]]) to (%[[WS_UB]]) step (%[[WS_LB_STEP]]) schedule(dynamic, none) nowait inclusive
35+
36+
!LLVMIR: define internal void @_QQmain..omp_par
37+
!LLVMIR: omp.par.entry:
38+
!LLVMIR: br label %omp.par.region
39+
!LLVMIR: omp.par.outlined.exit.exitStub: ; preds = %omp.par.pre_finalize
40+
!LLVMIR: ret void
41+
!LLVMIR: omp.par.region: ; preds = %omp.par.entry
42+
!LLVMIR: br label %omp.par.region1
43+
!LLVMIR: omp.par.region1: ; preds = %omp.par.region
44+
!LLVMIR: br label %omp_loop.preheader
45+
!LLVMIR: omp_loop.preheader: ; preds = %omp.par.region1
46+
!LLVMIR: @__kmpc_global_thread_num
47+
!LLVMIR: @__kmpc_dispatch_init_4u(%struct.ident_t* @{{.*}}, i32 %omp_global_thread_num{{.*}}, i32 35, i32 {{.*}}, i32 {{.*}}, i32 {{.*}}, i32 {{.*}})
48+
!LLVMIR: br label %omp_loop.preheader.outer.cond
49+
!LLVMIR: omp_loop.preheader.outer.cond:
50+
!LLVMIR: @__kmpc_dispatch_next_4u
51+
!LLVMIR: %{{.*}} = icmp ne i32 %{{.*}}, 0
52+
!LLVMIR: %{{.*}} = load i32, i32* %p.lowerbound, align 4
53+
!LLVMIR: %{{.*}} = sub i32 %{{.*}}, 1
54+
!LLVMIR: br i1 %{{.*}}, label %omp_loop.header, label %omp_loop.exit
55+
!LLVMIR: omp_loop.exit: ; preds = %omp_loop.preheader.outer.cond
56+
!LLVMIR: br label %omp_loop.after
57+
!LLVMIR: omp_loop.header: ; preds = %omp_loop.preheader.outer.cond, %omp_loop.inc
58+
!LLVMIR: %omp_loop.iv = phi i32 [ %lb, %omp_loop.preheader.outer.cond ], [ %omp_loop.next, %omp_loop.inc ]
59+
60+
do i=1, 9
61+
print*, i
62+
!FIRDialect: %[[RTBEGIN:.*]] = fir.call @_FortranAioBeginExternalListOutput
63+
!FIRDialect: %[[CONVERTED:.*]] = fir.convert %[[I]] : (i32) -> i64
64+
!FIRDialect: fir.call @_FortranAioOutputInteger64(%[[RTBEGIN]], %[[CONVERTED]]) : (!fir.ref<i8>, i64) -> i1
65+
!FIRDialect: fir.call @_FortranAioEndIoStatement(%[[RTBEGIN]]) : (!fir.ref<i8>) -> i32
66+
67+
68+
!LLVMIRDialect: llvm.call @_FortranAioBeginExternalListOutput(%{{.*}}, %{{.*}}, %{{.*}}) : (i32, !llvm.ptr<i8>, i32) -> !llvm.ptr<i8>
69+
!LLVMIRDialect: %{{.*}} = llvm.sext %arg0 : i32 to i64
70+
!LLVMIRDialect: llvm.call @_FortranAioOutputInteger64(%{{.*}}, %{{.*}}) : (!llvm.ptr<i8>, i64) -> i1
71+
!LLVMIRDialect: llvm.call @_FortranAioEndIoStatement(%{{.*}}) : (!llvm.ptr<i8>) -> i32
72+
73+
!LLVMIR: br label %omp_loop.cond
74+
!LLVMIR: omp_loop.cond: ; preds = %omp_loop.header
75+
!LLVMIR %{{.*}} = load i32, i32* %{{.*}}, aling {{.*}}
76+
!LLVMIR: %omp_loop.cmp = icmp ult i32 %{{.*}}, %{{.*}}
77+
!LLVMIR: br i1 %omp_loop.cmp, label %omp_loop.body, label %omp_loop.preheader.outer.cond
78+
!LLVMIR: omp_loop.body: ; preds = %omp_loop.cond
79+
!LLVMIR: %{{.*}} = mul i32 %{{.*}}, 1
80+
!LLVMIR: %{{.*}} = add i32 %{{.*}}, 1
81+
!LLVMIR: br label %omp.wsloop.region
82+
!LLVMIR: omp.wsloop.region: ; preds = %omp_loop.body
83+
!LLVMIR: %{{.*}} = call i8* @_FortranAioBeginExternalListOutput
84+
!LLVMIR: %{{.*}} = sext i32 %{{.*}} to i64
85+
!LLVMIR: %{{.*}} = call i1 @_FortranAioOutputInteger64
86+
!LLVMIR: %{{.*}} = call i32 @_FortranAioEndIoStatement
87+
88+
end do
89+
!FIRDialect: omp.yield
90+
!FIRDialect: }
91+
!FIRDialect: omp.terminator
92+
!FIRDialect: }
93+
94+
!LLVMIRDialect: omp.yield
95+
!LLVMIRDialect: }
96+
!LLVMIRDialect: omp.terminator
97+
!LLVMIRDialect: }
98+
!LLVMIRDialect: llvm.return
99+
!LLVMIRDialect: }
100+
!$OMP END DO NOWAIT
101+
!$OMP END PARALLEL
102+
end
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
! This test checks lowering of OpenMP DO Directive(Worksharing).
2+
3+
! RUN: bbc -fopenmp -emit-fir %s -o - | \
4+
! RUN: FileCheck %s --check-prefix=FIRDialect
5+
! RUN: bbc -fopenmp -emit-fir %s -o - | \
6+
! RUN: tco --disable-llvm --print-ir-after=fir-to-llvm-ir 2>&1 | \
7+
! RUN: FileCheck %s --check-prefix=LLVMIRDialect
8+
! RUN: bbc -fopenmp -emit-fir %s -o - | \
9+
! RUN: tco | FileCheck %s --check-prefix=LLVMIR
10+
11+
program wsloop_dynamic
12+
integer :: i
13+
!FIRDialect: func @_QQmain()
14+
!LLVMIRDialect: func @_QQmain()
15+
16+
!LLVMIR: define void @_QQmain()
17+
!LLVMIR:call i32 @__kmpc_global_thread_num{{.*}}
18+
!LLVMIR: br label %omp_parallel
19+
20+
!$OMP PARALLEL
21+
!FIRDialect-LABLEL: omp.parallel {
22+
!LLVMIRDialect-LABLEL: omp.parallel {
23+
24+
!LLVMIR: omp_parallel: ; preds = %0
25+
!LLVMIR: @__kmpc_fork_call
26+
!$OMP DO SCHEDULE(monotonic:dynamic)
27+
!FIRDialect: %[[WS_LB:.*]] = constant 1 : i32
28+
!FIRDialect: %[[WS_UB:.*]] = constant 9 : i32
29+
!FIRDialect: %[[WS_STEP:.*]] = constant 1 : i32
30+
!FIRDialect: omp.wsloop (%[[I:.*]]) : i32 = (%[[WS_LB]]) to (%[[WS_UB]]) step (%[[WS_STEP]]) schedule(dynamic, monotonic) nowait inclusive
31+
32+
!LLVMIRDialect: %[[WS_UB:.*]] = llvm.mlir.constant(9 : i32) : i32
33+
!LLVMIRDialect: %[[WS_LB_STEP:.*]] = llvm.mlir.constant(1 : i32) : i32
34+
!LLVMIRDialect: omp.wsloop (%[[I:.*]]) : i32 = (%[[WS_LB_STEP]]) to (%[[WS_UB]]) step (%[[WS_LB_STEP]]) schedule(dynamic, monotonic) nowait inclusive
35+
36+
!LLVMIR: define internal void @_QQmain..omp_par
37+
!LLVMIR: omp.par.entry:
38+
!LLVMIR: br label %omp.par.region
39+
!LLVMIR: omp.par.outlined.exit.exitStub: ; preds = %omp.par.pre_finalize
40+
!LLVMIR: ret void
41+
!LLVMIR: omp.par.region: ; preds = %omp.par.entry
42+
!LLVMIR: br label %omp.par.region1
43+
!LLVMIR: omp.par.region1: ; preds = %omp.par.region
44+
!LLVMIR: br label %omp_loop.preheader
45+
!LLVMIR: omp_loop.preheader: ; preds = %omp.par.region1
46+
!LLVMIR: @__kmpc_global_thread_num
47+
!LLVMIR: @__kmpc_dispatch_init_4u(%struct.ident_t* @{{.*}}, i32 %omp_global_thread_num{{.*}}, i32 536870947, i32 {{.*}}, i32 {{.*}}, i32 {{.*}}, i32 {{.*}})
48+
!LLVMIR: br label %omp_loop.preheader.outer.cond
49+
!LLVMIR: omp_loop.preheader.outer.cond:
50+
!LLVMIR: @__kmpc_dispatch_next_4u
51+
!LLVMIR: %{{.*}} = icmp ne i32 %{{.*}}, 0
52+
!LLVMIR: %{{.*}} = load i32, i32* %p.lowerbound, align 4
53+
!LLVMIR: %{{.*}} = sub i32 %{{.*}}, 1
54+
!LLVMIR: br i1 %{{.*}}, label %omp_loop.header, label %omp_loop.exit
55+
!LLVMIR: omp_loop.exit: ; preds = %omp_loop.preheader.outer.cond
56+
!LLVMIR: br label %omp_loop.after
57+
!LLVMIR: omp_loop.header: ; preds = %omp_loop.preheader.outer.cond, %omp_loop.inc
58+
!LLVMIR: %omp_loop.iv = phi i32 [ %lb, %omp_loop.preheader.outer.cond ], [ %omp_loop.next, %omp_loop.inc ]
59+
60+
do i=1, 9
61+
print*, i
62+
!FIRDialect: %[[RTBEGIN:.*]] = fir.call @_FortranAioBeginExternalListOutput
63+
!FIRDialect: %[[CONVERTED:.*]] = fir.convert %[[I]] : (i32) -> i64
64+
!FIRDialect: fir.call @_FortranAioOutputInteger64(%[[RTBEGIN]], %[[CONVERTED]]) : (!fir.ref<i8>, i64) -> i1
65+
!FIRDialect: fir.call @_FortranAioEndIoStatement(%[[RTBEGIN]]) : (!fir.ref<i8>) -> i32
66+
67+
68+
!LLVMIRDialect: llvm.call @_FortranAioBeginExternalListOutput(%{{.*}}, %{{.*}}, %{{.*}}) : (i32, !llvm.ptr<i8>, i32) -> !llvm.ptr<i8>
69+
!LLVMIRDialect: %{{.*}} = llvm.sext %[[I]] : i32 to i64
70+
!LLVMIRDialect: llvm.call @_FortranAioOutputInteger64(%{{.*}}, %{{.*}}) : (!llvm.ptr<i8>, i64) -> i1
71+
!LLVMIRDialect: llvm.call @_FortranAioEndIoStatement(%{{.*}}) : (!llvm.ptr<i8>) -> i32
72+
73+
!LLVMIR: br label %omp_loop.cond
74+
!LLVMIR: omp_loop.cond: ; preds = %omp_loop.header
75+
!LLVMIR %{{.*}} = load i32, i32* %{{.*}}, aling {{.*}}
76+
!LLVMIR: %omp_loop.cmp = icmp ult i32 %{{.*}}, %{{.*}}
77+
!LLVMIR: br i1 %omp_loop.cmp, label %omp_loop.body, label %omp_loop.preheader.outer.cond
78+
!LLVMIR: omp_loop.body: ; preds = %omp_loop.cond
79+
!LLVMIR: %{{.*}} = mul i32 %{{.*}}, 1
80+
!LLVMIR: %{{.*}} = add i32 %{{.*}}, 1
81+
!LLVMIR: br label %omp.wsloop.region
82+
!LLVMIR: omp.wsloop.region: ; preds = %omp_loop.body
83+
!LLVMIR: %{{.*}} = call i8* @_FortranAioBeginExternalListOutput
84+
!LLVMIR: %{{.*}} = sext i32 %{{.*}} to i64
85+
!LLVMIR: %{{.*}} = call i1 @_FortranAioOutputInteger64
86+
!LLVMIR: %{{.*}} = call i32 @_FortranAioEndIoStatement
87+
88+
end do
89+
!FIRDialect: omp.yield
90+
!FIRDialect: omp.terminator
91+
!FIRDialect: }
92+
93+
!LLVMIRDialect: omp.yield
94+
!LLVMIRDialect: omp.terminator
95+
!LLVMIRDialect: }
96+
!LLVMIRDialect: llvm.return
97+
!LLVMIRDialect: }
98+
!$OMP END DO NOWAIT
99+
!$OMP END PARALLEL
100+
end
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
! This test checks lowering of OpenMP DO Directive(Worksharing).
2+
3+
! RUN: bbc -fopenmp -emit-fir %s -o - | \
4+
! RUN: FileCheck %s --check-prefix=FIRDialect
5+
! RUN: bbc -fopenmp -emit-fir %s -o - | \
6+
! RUN: tco --disable-llvm --print-ir-after=fir-to-llvm-ir 2>&1 | \
7+
! RUN: FileCheck %s --check-prefix=LLVMIRDialect
8+
! RUN: bbc -fopenmp -emit-fir %s -o - | \
9+
! RUN: tco | FileCheck %s --check-prefix=LLVMIR
10+
11+
program wsloop_dynamic
12+
integer :: i
13+
!FIRDialect: func @_QQmain()
14+
!LLVMIRDialect: func @_QQmain()
15+
16+
!LLVMIR: define void @_QQmain()
17+
!LLVMIR:call i32 @__kmpc_global_thread_num{{.*}}
18+
!LLVMIR: br label %omp_parallel
19+
20+
!$OMP PARALLEL
21+
!FIRDialect-LABLEL: omp.parallel {
22+
!LLVMIRDialect-LABLEL: omp.parallel {
23+
24+
!LLVMIR: omp_parallel: ; preds = %0
25+
!LLVMIR: @__kmpc_fork_call
26+
!$OMP DO SCHEDULE(nonmonotonic:dynamic)
27+
!FIRDialect: %[[WS_LB:.*]] = constant 1 : i32
28+
!FIRDialect: %[[WS_UB:.*]] = constant 9 : i32
29+
!FIRDialect: %[[WS_STEP:.*]] = constant 1 : i32
30+
!FIRDialect: omp.wsloop (%[[I:.*]]) : i32 = (%[[WS_LB]]) to (%[[WS_UB]]) step (%[[WS_STEP]]) schedule(dynamic, nonmonotonic) nowait inclusive
31+
32+
!LLVMIRDialect: %[[WS_UB:.*]] = llvm.mlir.constant(9 : i32) : i32
33+
!LLVMIRDialect: %[[WS_LB_STEP:.*]] = llvm.mlir.constant(1 : i32) : i32
34+
!LLVMIRDialect: omp.wsloop (%[[I:.*]]) : i32 = (%[[WS_LB_STEP]]) to (%[[WS_UB]]) step (%[[WS_LB_STEP]]) schedule(dynamic, nonmonotonic) nowait inclusive
35+
36+
!LLVMIR: define internal void @_QQmain..omp_par
37+
!LLVMIR: omp.par.entry:
38+
!LLVMIR: br label %omp.par.region
39+
!LLVMIR: omp.par.outlined.exit.exitStub: ; preds = %omp.par.pre_finalize
40+
!LLVMIR: ret void
41+
!LLVMIR: omp.par.region: ; preds = %omp.par.entry
42+
!LLVMIR: br label %omp.par.region1
43+
!LLVMIR: omp.par.region1: ; preds = %omp.par.region
44+
!LLVMIR: br label %omp_loop.preheader
45+
!LLVMIR: omp_loop.preheader: ; preds = %omp.par.region1
46+
!LLVMIR: @__kmpc_global_thread_num
47+
!LLVMIR: @__kmpc_dispatch_init_4u(%struct.ident_t* @{{.*}}, i32 %omp_global_thread_num{{.*}}, i32 1073741859, i32 {{.*}}, i32 {{.*}}, i32 {{.*}}, i32 {{.*}})
48+
!LLVMIR: br label %omp_loop.preheader.outer.cond
49+
!LLVMIR: omp_loop.preheader.outer.cond:
50+
!LLVMIR: @__kmpc_dispatch_next_4u
51+
!LLVMIR: %{{.*}} = icmp ne i32 %{{.*}}, 0
52+
!LLVMIR: %{{.*}} = load i32, i32* %p.lowerbound, align 4
53+
!LLVMIR: %{{.*}} = sub i32 %{{.*}}, 1
54+
!LLVMIR: br i1 %{{.*}}, label %omp_loop.header, label %omp_loop.exit
55+
!LLVMIR: omp_loop.exit: ; preds = %omp_loop.preheader.outer.cond
56+
!LLVMIR: br label %omp_loop.after
57+
!LLVMIR: omp_loop.header: ; preds = %omp_loop.preheader.outer.cond, %omp_loop.inc
58+
!LLVMIR: %omp_loop.iv = phi i32 [ %lb, %omp_loop.preheader.outer.cond ], [ %omp_loop.next, %omp_loop.inc ]
59+
60+
do i=1, 9
61+
print*, i
62+
!FIRDialect: %[[RTBEGIN:.*]] = fir.call @_FortranAioBeginExternalListOutput
63+
!FIRDialect: %[[CONVERTED:.*]] = fir.convert %[[I]] : (i32) -> i64
64+
!FIRDialect: fir.call @_FortranAioOutputInteger64(%[[RTBEGIN]], %[[CONVERTED]]) : (!fir.ref<i8>, i64) -> i1
65+
!FIRDialect: fir.call @_FortranAioEndIoStatement(%[[RTBEGIN]]) : (!fir.ref<i8>) -> i32
66+
67+
68+
!LLVMIRDialect: llvm.call @_FortranAioBeginExternalListOutput(%{{.*}}, %{{.*}}, %{{.*}}) : (i32, !llvm.ptr<i8>, i32) -> !llvm.ptr<i8>
69+
!LLVMIRDialect: %{{.*}} = llvm.sext %arg0 : i32 to i64
70+
!LLVMIRDialect: llvm.call @_FortranAioOutputInteger64(%{{.*}}, %{{.*}}) : (!llvm.ptr<i8>, i64) -> i1
71+
!LLVMIRDialect: llvm.call @_FortranAioEndIoStatement(%{{.*}}) : (!llvm.ptr<i8>) -> i32
72+
73+
!LLVMIR: br label %omp_loop.cond
74+
!LLVMIR: omp_loop.cond: ; preds = %omp_loop.header
75+
!LLVMIR %{{.*}} = load i32, i32* %{{.*}}, aling {{.*}}
76+
!LLVMIR: %omp_loop.cmp = icmp ult i32 %{{.*}}, %{{.*}}
77+
!LLVMIR: br i1 %omp_loop.cmp, label %omp_loop.body, label %omp_loop.preheader.outer.cond
78+
!LLVMIR: omp_loop.body: ; preds = %omp_loop.cond
79+
!LLVMIR: %{{.*}} = mul i32 %{{.*}}, 1
80+
!LLVMIR: %{{.*}} = add i32 %{{.*}}, 1
81+
!LLVMIR: br label %omp.wsloop.region
82+
!LLVMIR: omp.wsloop.region: ; preds = %omp_loop.body
83+
!LLVMIR: %{{.*}} = call i8* @_FortranAioBeginExternalListOutput
84+
!LLVMIR: %{{.*}} = sext i32 %{{.*}} to i64
85+
!LLVMIR: %{{.*}} = call i1 @_FortranAioOutputInteger64
86+
!LLVMIR: %{{.*}} = call i32 @_FortranAioEndIoStatement
87+
88+
end do
89+
!FIRDialect: omp.yield
90+
!FIRDialect: }
91+
!FIRDialect: omp.terminator
92+
!FIRDialect: }
93+
94+
!LLVMIRDialect: omp.yield
95+
!LLVMIRDialect: }
96+
!LLVMIRDialect: omp.terminator
97+
!LLVMIRDialect: }
98+
!LLVMIRDialect: llvm.return
99+
!LLVMIRDialect: }
100+
!$OMP END DO NOWAIT
101+
!$OMP END PARALLEL
102+
end

0 commit comments

Comments
 (0)