The stop statement is allowed in OpenMP/OpenACC block region.
Details
Details
Diff Detail
Diff Detail
Event Timeline
Comment Actions
@kiranchandramohan left one comment here (https://reviews.llvm.org/D88655#2470610) more than one year ago, but there is no further update. Take up this.
I checked OpenACC 3.0, and there is no explicit description for the stop statement in a region. Then I checked gfortran, and this is OK for gfortran.
$ cat test.f90 program m integer :: i, N=10, a(10) !$acc serial do i = 1, N a(i) = 3.14 if(i == N-1) THEN stop 999 ! no error end if end do !$acc end serial end $ gfortran test.f90 -fopenacc ! no error
Comment Actions
For semantic analysis, this patch is OK. Branching out of a OpenMP region has wrong semantics such as the slave thread GOTO the non-parallel region. For STOP statement, it aborts the program, which is expected.
For lowering, it hasn't handle this case. I will fix it later.
program m use omp_lib !$omp parallel num_threads(4) stop omp_get_thread_num() !$omp end parallel end
$ bbc -emit-fir -fopenmp test.f90 && cat test.mlir func.func @_QQmain() { %c4_i32 = arith.constant 4 : i32 omp.parallel num_threads(%c4_i32 : i32) { %0 = fir.call @omp_get_thread_num() : () -> i32 %false = arith.constant false %false_0 = arith.constant false %1 = fir.call @_FortranAStopStatement(%0, %false, %false_0) : (i32, i1, i1) -> none fir.unreachable } return }
Change it by-hand:
func.func @_QQmain() { %c4_i32 = arith.constant 4 : i32 omp.parallel num_threads(%c4_i32 : i32) { %0 = fir.call @omp_get_thread_num() : () -> i32 %false = arith.constant false %false_0 = arith.constant false %1 = fir.call @_FortranAStopStatement(%0, %false, %false_0) : (i32, i1, i1) -> none omp.terminator } return }
tco test.mlir -o test.ll $ clang++ -L/path-to-lib -lFortran_main -lFortranRuntime -lFortranDecimal -lomp test.ll $ ./a.out Fortran STOP: code 1 Fortran STOP: code 3 IEEE arithmetic exceptions signaled: INEXACT IEEE arithmetic exceptions signaled: INEXACT Fortran STOP: code 2 IEEE arithmetic exceptions signaled: INEXACT Fortran STOP IEEE arithmetic exceptions signaled:
$ gfortran test.f90 -fopenmp && ./a.out STOP 0 STOP 3 STOP 2
I will fix the lowering later.