This patch modifies the representation of `OpenMP_Clause` to allow definitions to incorporate both required and optional arguments while still allowing operations including them and overriding the `assemblyFormat` to take advantage of automatically-populated format strings. The proposed approach is to split the `assemblyFormat` clause property into `reqAssemblyFormat` and `optAssemblyFormat`, and remove the `isRequired` template and associated `required` property. The `OpenMP_Op` class, in turn, populates the new `clausesReqAssemblyFormat` and `clausesOptAssemblyFormat` properties in addition to `clausesAssemblyFormat`. These properties can be used by clause-based OpenMP operation definitions to reconstruct parts of the clause-inherited format string in a more flexible way when overriding it. Clause definitions are updated to follow this new approach and some operation definitions overriding the `assemblyFormat` are simplified by taking advantage of the improved flexibility, reducing code duplication. The `verify-openmp-ops` tablegen pass is updated for the new `OpenMP_Clause` representation. Some MLIR and Flang unit tests had to be updated due to changes to the default printing order of clauses on updated operations.
38 lines
1.2 KiB
Fortran
38 lines
1.2 KiB
Fortran
! This test checks lowering of OpenMP DO Directive(Worksharing) with
|
|
! simd schedule modifier.
|
|
|
|
! RUN: bbc -fopenmp -emit-hlfir %s -o - | FileCheck %s
|
|
|
|
program wsloop_dynamic
|
|
integer :: i
|
|
!CHECK-LABEL: func @_QQmain()
|
|
|
|
!$OMP PARALLEL
|
|
!CHECK: omp.parallel {
|
|
|
|
!$OMP DO SCHEDULE(simd: runtime)
|
|
!CHECK: %[[WS_LB:.*]] = arith.constant 1 : i32
|
|
!CHECK: %[[WS_UB:.*]] = arith.constant 9 : i32
|
|
!CHECK: %[[WS_STEP:.*]] = arith.constant 1 : i32
|
|
!CHECK: omp.wsloop nowait schedule(runtime, simd) {
|
|
!CHECK-NEXT: omp.loop_nest (%[[I:.*]]) : i32 = (%[[WS_LB]]) to (%[[WS_UB]]) inclusive step (%[[WS_STEP]]) {
|
|
!CHECK: fir.store %[[I]] to %[[STORE:.*]]#1 : !fir.ref<i32>
|
|
|
|
do i=1, 9
|
|
print*, i
|
|
!CHECK: %[[RTBEGIN:.*]] = fir.call @_FortranAioBeginExternalListOutput
|
|
!CHECK: %[[LOAD:.*]] = fir.load %[[STORE]]#0 : !fir.ref<i32>
|
|
!CHECK: fir.call @_FortranAioOutputInteger32(%[[RTBEGIN]], %[[LOAD]]) {{.*}}: (!fir.ref<i8>, i32) -> i1
|
|
!CHECK: fir.call @_FortranAioEndIoStatement(%[[RTBEGIN]]) {{.*}}: (!fir.ref<i8>) -> i32
|
|
end do
|
|
!CHECK: omp.yield
|
|
!CHECK: }
|
|
!CHECK: omp.terminator
|
|
!CHECK: }
|
|
!CHECK: omp.terminator
|
|
!CHECK: }
|
|
|
|
!$OMP END DO NOWAIT
|
|
!$OMP END PARALLEL
|
|
end
|