Skip to content

Commit 1cfecb9

Browse files
authored
[Flang][OpenMP] Update DO CONCURRENT conversion for the device (llvm#136)
This patch makes changes to the `DoConcurrentConversion` pass to follow the "hoisted omp.parallel" representation when converting `do concurrent` constructs into `target teams distribute parallel do`.
1 parent 13ae6e0 commit 1cfecb9

File tree

5 files changed

+17
-22
lines changed

5 files changed

+17
-22
lines changed

flang/lib/Optimizer/Transforms/DoConcurrentConversion.cpp

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -599,9 +599,7 @@ class DoConcurrentConversion : public mlir::OpConversionPattern<fir::DoLoopOp> {
599599

600600
targetOp = genTargetOp(doLoop.getLoc(), rewriter, mapper,
601601
outermostLoopLives, targetClauseOps);
602-
genTeamsOp(doLoop.getLoc(), rewriter, loopNest, mapper,
603-
loopNestClauseOps);
604-
genDistributeOp(doLoop.getLoc(), rewriter);
602+
genTeamsOp(doLoop.getLoc(), rewriter);
605603
}
606604

607605
mlir::omp::ParallelOp parallelOp = genParallelOp(
@@ -611,6 +609,9 @@ class DoConcurrentConversion : public mlir::OpConversionPattern<fir::DoLoopOp> {
611609
looputils::localizeLoopLocalValue(local, parallelOp.getRegion(),
612610
rewriter);
613611

612+
if (mapToDevice)
613+
genDistributeOp(doLoop.getLoc(), rewriter);
614+
614615
mlir::omp::LoopNestOp ompLoopNest =
615616
genWsLoopOp(rewriter, loopNest.back().first, mapper, loopNestClauseOps);
616617

@@ -800,18 +801,14 @@ class DoConcurrentConversion : public mlir::OpConversionPattern<fir::DoLoopOp> {
800801
}
801802

802803
mlir::omp::TeamsOp
803-
genTeamsOp(mlir::Location loc, mlir::ConversionPatternRewriter &rewriter,
804-
looputils::LoopNestToIndVarMap &loopNest, mlir::IRMapping &mapper,
805-
mlir::omp::LoopNestOperands &loopNestClauseOps) const {
804+
genTeamsOp(mlir::Location loc,
805+
mlir::ConversionPatternRewriter &rewriter) const {
806806
auto teamsOp = rewriter.create<mlir::omp::TeamsOp>(
807807
loc, /*clauses=*/mlir::omp::TeamsOperands{});
808808

809809
rewriter.createBlock(&teamsOp.getRegion());
810810
rewriter.setInsertionPoint(rewriter.create<mlir::omp::TerminatorOp>(loc));
811811

812-
genLoopNestIndVarAllocs(rewriter, loopNest, mapper);
813-
genLoopNestClauseOps(loc, rewriter, loopNest, mapper, loopNestClauseOps);
814-
815812
return teamsOp;
816813
}
817814

@@ -905,12 +902,8 @@ class DoConcurrentConversion : public mlir::OpConversionPattern<fir::DoLoopOp> {
905902
rewriter.createBlock(&parallelOp.getRegion());
906903
rewriter.setInsertionPoint(rewriter.create<mlir::omp::TerminatorOp>(loc));
907904

908-
// If mapping to host, the local induction variable and loop bounds need to
909-
// be emitted as part of the `omp.parallel` op.
910-
if (!mapToDevice) {
911-
genLoopNestIndVarAllocs(rewriter, loopNest, mapper);
912-
genLoopNestClauseOps(loc, rewriter, loopNest, mapper, loopNestClauseOps);
913-
}
905+
genLoopNestIndVarAllocs(rewriter, loopNest, mapper);
906+
genLoopNestClauseOps(loc, rewriter, loopNest, mapper, loopNestClauseOps);
914907

915908
return parallelOp;
916909
}

flang/test/Transforms/DoConcurrent/basic_device.f90

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ program do_concurrent_basic
4343

4444
! CHECK: %[[A_DEV_DECL:.*]]:2 = hlfir.declare %[[A_ARG]]
4545
! CHECK: omp.teams {
46+
! CHECK-NEXT: omp.parallel {
4647

4748
! CHECK-NEXT: %[[ITER_VAR:.*]] = fir.alloca i32 {bindc_name = "i"}
4849
! CHECK-NEXT: %[[BINDING:.*]]:2 = hlfir.declare %[[ITER_VAR]] {uniq_name = "_QFEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
@@ -54,8 +55,6 @@ program do_concurrent_basic
5455
! CHECK: %[[STEP:.*]] = arith.constant 1 : index
5556

5657
! CHECK-NEXT: omp.distribute {
57-
! CHECK-NEXT: omp.parallel {
58-
5958
! CHECK-NEXT: omp.wsloop {
6059

6160
! CHECK-NEXT: omp.loop_nest (%[[ARG0:.*]]) : index = (%[[LB]]) to (%[[UB]]) inclusive step (%[[STEP]]) {

flang/test/Transforms/DoConcurrent/multiple_iteration_ranges.f90

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ program main
6565
! DEVICE: omp.target
6666
! DEVICE: omp.teams
6767

68-
! HOST: omp.parallel {
68+
! COMMON: omp.parallel {
6969

7070
! COMMON-NEXT: %[[ITER_VAR_I:.*]] = fir.alloca i32 {bindc_name = "i"}
7171
! COMMON-NEXT: %[[BINDING_I:.*]]:2 = hlfir.declare %[[ITER_VAR_I]] {uniq_name = "_QFEi"}
@@ -94,8 +94,7 @@ program main
9494
! COMMON: %[[UB_K:.*]] = fir.convert %[[C30]] : (i32) -> index
9595
! COMMON: %[[STEP_K:.*]] = arith.constant 1 : index
9696

97-
! DEVICE: omp.distribute
98-
! DEVICE-NEXT: omp.parallel
97+
! DEVICE: omp.distribute
9998

10099
! COMMON: omp.wsloop {
101100
! COMMON-NEXT: omp.loop_nest

flang/test/Transforms/DoConcurrent/not_perfectly_nested.f90

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,11 @@ program main
3939
! DEVICE: %[[TARGET_K_DECL:.*]]:2 = hlfir.declare %[[K_ARG]] {uniq_name = "_QFEk"}
4040

4141
! DEVICE: omp.teams
42-
! DEVICE: omp.distribute
4342

4443
! COMMON: omp.parallel {
44+
45+
! DEVICE: omp.distribute
46+
4547
! COMMON: omp.wsloop {
4648
! COMMON: omp.loop_nest ({{[^[:space:]]+}}) {{.*}} {
4749
! COMMON: fir.do_loop %[[J_IV:.*]] = {{.*}} {

flang/test/Transforms/DoConcurrent/skip_all_nested_loops.f90

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,11 @@ program main
3939
! DEVICE: %[[TARGET_K_DECL:.*]]:2 = hlfir.declare %[[K_ARG]] {uniq_name = "_QFEk"}
4040

4141
! DEVICE: omp.teams
42-
! DEVICE: omp.distribute
4342

4443
! COMMON: omp.parallel {
44+
45+
! DEVICE: omp.distribute
46+
4547
! COMMON: omp.wsloop {
4648
! COMMON: omp.loop_nest ({{[^[:space:]]+}}) {{.*}} {
4749
! COMMON: fir.do_loop {{.*}} iter_args(%[[J_IV:.*]] = {{.*}}) -> {{.*}} {

0 commit comments

Comments
 (0)