Skip to content

Commit

Permalink
[flang][OpenMP] Handle unstructured CF in compound loop constructs (#…
Browse files Browse the repository at this point in the history
…111111)

Fixes a bug in handling unstructured control-flow in compound loop
constructs. The fix makes sure that unstructured CF does not get lowered
until we reach the last item of the compound construct. This way, we
avoid moving block of unstructured loops in-between the middle items of
the construct and messing (i.e. adding operations) to these block while
doing so.
  • Loading branch information
ergawy authored Oct 4, 2024
1 parent 208f42f commit 2f24587
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 3 deletions.
7 changes: 5 additions & 2 deletions flang/lib/Lower/OpenMP/OpenMP.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -590,9 +590,11 @@ static void createBodyOfOp(mlir::Operation &op, const OpWithBodyGenInfo &info,
mlir::Operation *marker = insertMarker(firOpBuilder);

// If it is an unstructured region, create empty blocks for all evaluations.
if (info.eval.lowerAsUnstructured())
if (lower::omp::isLastItemInQueue(item, queue) &&
info.eval.lowerAsUnstructured()) {
lower::createEmptyRegionBlocks<mlir::omp::TerminatorOp, mlir::omp::YieldOp>(
firOpBuilder, info.eval.getNestedEvaluations());
}

// Start with privatization, so that the lowering of the nested
// code will use the right symbols.
Expand Down Expand Up @@ -966,7 +968,8 @@ static void genBodyOfTargetOp(

// Create blocks for unstructured regions. This has to be done since
// blocks are initially allocated with the function as the parent region.
if (eval.lowerAsUnstructured()) {
if (lower::omp::isLastItemInQueue(item, queue) &&
eval.lowerAsUnstructured()) {
lower::createEmptyRegionBlocks<mlir::omp::TerminatorOp, mlir::omp::YieldOp>(
firOpBuilder, eval.getNestedEvaluations());
}
Expand Down
36 changes: 35 additions & 1 deletion flang/test/Lower/OpenMP/loop-compound.f90
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
! RUN: %flang_fc1 -fopenmp -emit-hlfir %s -o - | FileCheck %s

program main
integer :: i
integer :: i,j

! TODO When composite constructs are supported add:
! - TASKLOOP SIMD
Expand Down Expand Up @@ -231,4 +231,38 @@ program main
do i = 1, 10
end do
!$omp end teams distribute simd

! ----------------------------------------------------------------------------
! Unstructured control-flow in loop
! ----------------------------------------------------------------------------
! CHECK: omp.target
! CHECK: omp.teams
! CHECK: omp.parallel
! CHECK: omp.distribute
! CHECK-NEXT: omp.wsloop
! CHECK-NEXT: omp.loop_nest
!
! Verify the conrol-flow of the unstructured inner loop.
! CHECK: cf.br ^[[BB1:.*]]
! CHECK: ^[[BB1]]:
! CHECK: cf.br ^[[BB2:.*]]
! CHECK: ^[[BB2]]:
! CHECK: cf.cond_br %{{.*}}, ^[[BB3:.*]], ^[[BB6:.*]]
! CHECK: ^[[BB3]]:
! CHECK: cf.cond_br %{{.*}}, ^[[BB4:.*]], ^[[BB5:.*]]
! CHECK: ^[[BB4]]:
! CHECK: cf.br ^[[BB6]]
! CHECK: ^[[BB5]]:
! CHECK: cf.br ^[[BB2]]
! CHECK: ^[[BB6]]:
! CHECK-NEXT: omp.yield
!$omp target teams distribute parallel do
do i = 1, 10
outerloop: do j = i-1, i+i
if (j == i) then
exit outerloop
end if
end do outerloop
end do
!$omp end target teams distribute parallel do
end program main

0 comments on commit 2f24587

Please sign in to comment.