[flang-commits] [flang] [flang][openacc] Only generate acc.terminator in compute construct (PR #155504)
via flang-commits
flang-commits at lists.llvm.org
Tue Aug 26 14:42:43 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-flang-fir-hlfir
Author: Valentin Clement (バレンタイン クレメン) (clementval)
<details>
<summary>Changes</summary>
When the end of a block is inside a data region (not a compute region), generating an `acc.terminator` will lead to a mission terminator when translating to LLVM.
Only generate acc.terminator instead of fir.unreachable when nested in acc compute region.
---
Full diff: https://github.com/llvm/llvm-project/pull/155504.diff
2 Files Affected:
- (modified) flang/lib/Lower/Runtime.cpp (+1-2)
- (added) flang/test/Lower/OpenACC/acc-terminator.f90 (+53)
``````````diff
diff --git a/flang/lib/Lower/Runtime.cpp b/flang/lib/Lower/Runtime.cpp
index fc59a2414d539..494dd49e961b0 100644
--- a/flang/lib/Lower/Runtime.cpp
+++ b/flang/lib/Lower/Runtime.cpp
@@ -39,8 +39,7 @@ static void genUnreachable(fir::FirOpBuilder &builder, mlir::Location loc) {
if (parentOp->getDialect()->getNamespace() ==
mlir::omp::OpenMPDialect::getDialectNamespace())
Fortran::lower::genOpenMPTerminator(builder, parentOp, loc);
- else if (parentOp->getDialect()->getNamespace() ==
- mlir::acc::OpenACCDialect::getDialectNamespace())
+ else if (Fortran::lower::isInsideOpenACCComputeConstruct(builder))
Fortran::lower::genOpenACCTerminator(builder, parentOp, loc);
else
fir::UnreachableOp::create(builder, loc);
diff --git a/flang/test/Lower/OpenACC/acc-terminator.f90 b/flang/test/Lower/OpenACC/acc-terminator.f90
new file mode 100644
index 0000000000000..53ae1a5e54675
--- /dev/null
+++ b/flang/test/Lower/OpenACC/acc-terminator.f90
@@ -0,0 +1,53 @@
+! Check that acc.terminator is not inserted in data construct
+
+! RUN: bbc -fopenacc -emit-hlfir %s -o - | FileCheck %s
+
+program main
+ use, intrinsic :: iso_c_binding
+ implicit none
+
+ real(8), pointer :: a(:,:,:),b(:,:,:),c(:,:,:),c2(:,:,:)
+ integer, parameter :: n1 = 400, n2 = 20
+ integer*4 :: stat
+ integer :: i,j,k
+
+ stat = 0
+ do i=1,n2
+
+ !$acc data copyin(a(:,:,i),b(:,:,i),c(:,:,i)) copyout(c2(:,:,i))
+
+ !$acc host_data use_device(a(:,:,i),b(:,:,i),c(:,:,i))
+
+ !$acc end host_data
+
+ if ( stat .ne. 0 ) then
+ print *, "stat = ",stat
+ stop ! terminator here should be fir.unreachable
+ end if
+
+ !$acc parallel loop present(c(:,:,i),c2(:,:,i))
+ do j = 1,n1
+ do k = 1,n1
+ c2(k,j,i) = 1.5d0 * c(k,j,i)
+ enddo
+ enddo
+ !$acc end parallel loop
+
+ !$acc end data
+
+ enddo
+
+ !$acc wait
+
+ deallocate(a,b,c,c2)
+end program
+
+! CHECK-LABEL: func.func @_QQmain()
+! CHECK: acc.data
+! CHECK: acc.host_data
+! CHECK: acc.terminator
+! CHECK: fir.call @_FortranAStopStatement
+! CHECK: fir.unreachable
+! CHECK: acc.parallel
+! CHECK-COUNT-3: acc.yield
+! CHECK: acc.terminator
``````````
</details>
https://github.com/llvm/llvm-project/pull/155504
More information about the flang-commits
mailing list