Patch 2/3 of the transition step 1 described in https://discourse.llvm.org/t/rfc-enabling-the-hlfir-lowering-by-default/72778/7. All the modified tests are still here since coverage for the direct lowering to FIR was still needed while it was default. Some already have an HLFIR version, some have not and will need to be ported in step 2 described in the RFC. Note that another 147 lit tests use -emit-fir/-emit-llvm outputs but do not need a flag since the HLFIR/no HLFIR output is the same for what is being tested.
282 lines
13 KiB
Fortran
282 lines
13 KiB
Fortran
! This test checks lowering of OpenMP parallel directive
|
|
! with `DEFAULT` clause present.
|
|
|
|
! RUN: %flang_fc1 -emit-fir -flang-deprecated-no-hlfir -fopenmp %s -o - | FileCheck %s
|
|
! RUN: bbc -fopenmp -emit-fir -hlfir=false %s -o - | FileCheck %s
|
|
|
|
|
|
!CHECK: func @_QQmain() attributes {fir.bindc_name = "default_clause_lowering"} {
|
|
!CHECK: %[[W:.*]] = fir.alloca i32 {bindc_name = "w", uniq_name = "_QFEw"}
|
|
!CHECK: %[[X:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFEx"}
|
|
!CHECK: %[[Y:.*]] = fir.alloca i32 {bindc_name = "y", uniq_name = "_QFEy"}
|
|
!CHECK: %[[Z:.*]] = fir.alloca i32 {bindc_name = "z", uniq_name = "_QFEz"}
|
|
!CHECK: omp.parallel {
|
|
!CHECK: %[[PRIVATE_X:.*]] = fir.alloca i32 {bindc_name = "x", pinned, uniq_name = "_QFEx"}
|
|
!CHECK: %[[const:.*]] = fir.load %[[X]] : !fir.ref<i32>
|
|
!CHECK: fir.store %[[const]] to %[[PRIVATE_X]] : !fir.ref<i32>
|
|
!CHECK: %[[PRIVATE_Y:.*]] = fir.alloca i32 {bindc_name = "y", pinned, uniq_name = "_QFEy"}
|
|
!CHECK: %[[PRIVATE_W:.*]] = fir.alloca i32 {bindc_name = "w", pinned, uniq_name = "_QFEw"}
|
|
!CHECK: %[[const:.*]] = arith.constant 2 : i32
|
|
!CHECK: %[[temp:.*]] = fir.load %[[PRIVATE_Y]] : !fir.ref<i32>
|
|
!CHECK: %[[result:.*]] = arith.muli %[[const]], %[[temp]] : i32
|
|
!CHECK: fir.store %[[result]] to %[[PRIVATE_X]] : !fir.ref<i32>
|
|
!CHECK: %[[temp:.*]] = fir.load %[[PRIVATE_W]] : !fir.ref<i32>
|
|
!CHECK: %[[const:.*]] = arith.constant 45 : i32
|
|
!CHECK: %[[result:.*]] = arith.addi %[[temp]], %[[const]] : i32
|
|
!CHECK: fir.store %[[result]] to %[[Z]] : !fir.ref<i32>
|
|
!CHECK: omp.terminator
|
|
!CHECK: }
|
|
|
|
program default_clause_lowering
|
|
integer :: x, y, z, w
|
|
|
|
!$omp parallel default(private) firstprivate(x) shared(z)
|
|
x = y * 2
|
|
z = w + 45
|
|
!$omp end parallel
|
|
|
|
!CHECK: omp.parallel {
|
|
!CHECK: %[[temp:.*]] = fir.load %[[Y]] : !fir.ref<i32>
|
|
!CHECK: fir.store %[[temp]] to %[[X]] : !fir.ref<i32>
|
|
!CHECK: omp.terminator
|
|
!CHECK: }
|
|
|
|
!$omp parallel default(shared)
|
|
x = y
|
|
!$omp end parallel
|
|
|
|
!CHECK: omp.parallel {
|
|
!CHECK: %[[PRIVATE_X:.*]] = fir.alloca i32 {bindc_name = "x", pinned, uniq_name = "_QFEx"}
|
|
!CHECK: %[[PRIVATE_Y:.*]] = fir.alloca i32 {bindc_name = "y", pinned, uniq_name = "_QFEy"}
|
|
!CHECK: %[[temp:.*]] = fir.load %[[PRIVATE_Y]] : !fir.ref<i32>
|
|
!CHECK: fir.store %[[temp]] to %[[PRIVATE_X]] : !fir.ref<i32>
|
|
!CHECK: omp.terminator
|
|
!CHECK: }
|
|
|
|
!$omp parallel default(none) private(x, y)
|
|
x = y
|
|
!$omp end parallel
|
|
|
|
!CHECK: omp.parallel {
|
|
!CHECK: %[[PRIVATE_Y:.*]] = fir.alloca i32 {bindc_name = "y", pinned, uniq_name = "_QFEy"}
|
|
!CHECK: %[[temp:.*]] = fir.load %[[Y]] : !fir.ref<i32>
|
|
!CHECK: fir.store %[[temp]] to %[[PRIVATE_Y]] : !fir.ref<i32>
|
|
!CHECK: %[[PRIVATE_X:.*]] = fir.alloca i32 {bindc_name = "x", pinned, uniq_name = "_QFEx"}
|
|
!CHECK: %[[temp:.*]] = fir.load %[[X]] : !fir.ref<i32>
|
|
!CHECK: fir.store %[[temp]] to %[[PRIVATE_X]] : !fir.ref<i32>
|
|
!CHECK: %[[temp:.*]] = fir.load %[[PRIVATE_Y]] : !fir.ref<i32>
|
|
!CHECK: fir.store %[[temp]] to %[[PRIVATE_X]] : !fir.ref<i32>
|
|
!CHECK: omp.terminator
|
|
!CHECK: }
|
|
|
|
!$omp parallel default(firstprivate) firstprivate(y)
|
|
x = y
|
|
!$omp end parallel
|
|
|
|
!CHECK: omp.parallel {
|
|
!CHECK: %[[PRIVATE_X:.*]] = fir.alloca i32 {bindc_name = "x", pinned, uniq_name = "_QFEx"}
|
|
!CHECK: %[[PRIVATE_Y:.*]] = fir.alloca i32 {bindc_name = "y", pinned, uniq_name = "_QFEy"}
|
|
!CHECK: %[[temp:.*]] = fir.load %[[Y]] : !fir.ref<i32>
|
|
!CHECK: fir.store %[[temp]] to %[[PRIVATE_Y]] : !fir.ref<i32>
|
|
!CHECK: %[[PRIVATE_W:.*]] = fir.alloca i32 {bindc_name = "w", pinned, uniq_name = "_QFEw"}
|
|
!CHECK: %[[temp:.*]] = fir.load %[[W]] : !fir.ref<i32>
|
|
!CHECK: fir.store %[[temp]] to %[[PRIVATE_W]] : !fir.ref<i32>
|
|
!CHECK: %[[const:.*]] = arith.constant 2 : i32
|
|
!CHECK: %[[temp:.*]] = fir.load %[[PRIVATE_Y]] : !fir.ref<i32>
|
|
!CHECK: %[[result:.*]] = arith.muli %[[const]], %[[temp]] : i32
|
|
!CHECK: fir.store %[[result]] to %[[PRIVATE_X]] : !fir.ref<i32>
|
|
!CHECK: %[[temp:.*]] = fir.load %[[PRIVATE_W]] : !fir.ref<i32>
|
|
!CHECK: %[[const:.*]] = arith.constant 45 : i32
|
|
!CHECK: %[[result:.*]] = arith.addi %[[temp]], %[[const]] : i32
|
|
!CHECK: fir.store %[[result]] to %[[Z]] : !fir.ref<i32>
|
|
!CHECK: omp.terminator
|
|
!CHECK: }
|
|
|
|
!$omp parallel default(firstprivate) private(x) shared(z)
|
|
x = y * 2
|
|
z = w + 45
|
|
!$omp end parallel
|
|
|
|
!CHECK: omp.parallel {
|
|
!CHECK: omp.parallel {
|
|
!CHECK: %[[PRIVATE_X:.*]] = fir.alloca i32 {bindc_name = "x", pinned, uniq_name = "_QFEx"}
|
|
!CHECK: %[[PRIVATE_Y:.*]] = fir.alloca i32 {bindc_name = "y", pinned, uniq_name = "_QFEy"}
|
|
!CHECK: %[[temp:.*]] = fir.load %[[PRIVATE_Y]] : !fir.ref<i32>
|
|
!CHECK: fir.store %[[temp]] to %[[PRIVATE_X]] : !fir.ref<i32>
|
|
!CHECK: omp.terminator
|
|
!CHECK: }
|
|
!CHECK: omp.parallel {
|
|
!CHECK: %[[PRIVATE_W:.*]] = fir.alloca i32 {bindc_name = "w", pinned, uniq_name = "_QFEw"}
|
|
!CHECK: %[[temp:.*]] = fir.load %[[W]] : !fir.ref<i32>
|
|
!CHECK: fir.store %[[temp]] to %[[PRIVATE_W]] : !fir.ref<i32>
|
|
!CHECK: %[[PRIVATE_X:.*]] = fir.alloca i32 {bindc_name = "x", pinned, uniq_name = "_QFEx"}
|
|
!CHECK: %[[temp:.*]] = fir.load %[[X]] : !fir.ref<i32>
|
|
!CHECK: fir.store %[[temp]] to %[[PRIVATE_X]] : !fir.ref<i32>
|
|
!CHECK: %[[temp:.*]] = fir.load %[[PRIVATE_X]] : !fir.ref<i32>
|
|
!CHECK: fir.store %[[temp]] to %[[PRIVATE_W]] : !fir.ref<i32>
|
|
!CHECK: omp.terminator
|
|
!CHECK: }
|
|
!CHECK: omp.terminator
|
|
!CHECK: }
|
|
!$omp parallel
|
|
!$omp parallel default(private)
|
|
x = y
|
|
!$omp end parallel
|
|
|
|
!$omp parallel default(firstprivate)
|
|
w = x
|
|
!$omp end parallel
|
|
!$omp end parallel
|
|
|
|
end program default_clause_lowering
|
|
|
|
subroutine nested_default_clause_tests
|
|
integer :: x, y, z, w, k, a
|
|
|
|
!CHECK: %[[K:.*]] = fir.alloca i32 {bindc_name = "k", uniq_name = "_QFnested_default_clause_testsEk"}
|
|
!CHECK: %[[W:.*]] = fir.alloca i32 {bindc_name = "w", uniq_name = "_QFnested_default_clause_testsEw"}
|
|
!CHECK: %[[X:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFnested_default_clause_testsEx"}
|
|
!CHECK: %[[Y:.*]] = fir.alloca i32 {bindc_name = "y", uniq_name = "_QFnested_default_clause_testsEy"}
|
|
!CHECK: %[[Z:.*]] = fir.alloca i32 {bindc_name = "z", uniq_name = "_QFnested_default_clause_testsEz"}
|
|
!CHECK: omp.parallel {
|
|
!CHECK: %[[PRIVATE_X:.*]] = fir.alloca i32 {bindc_name = "x", pinned, uniq_name = "_QFnested_default_clause_testsEx"}
|
|
!CHECK: %[[temp:.*]] = fir.load %[[X]] : !fir.ref<i32>
|
|
!CHECK: fir.store %[[temp]] to %[[PRIVATE_X]] : !fir.ref<i32>
|
|
!CHECK: %[[PRIVATE_Y:.*]] = fir.alloca i32 {bindc_name = "y", pinned, uniq_name = "_QFnested_default_clause_testsEy"}
|
|
!CHECK: %[[PRIVATE_Z:.*]] = fir.alloca i32 {bindc_name = "z", pinned, uniq_name = "_QFnested_default_clause_testsEz"}
|
|
!CHECK: %[[PRIVATE_K:.*]] = fir.alloca i32 {bindc_name = "k", pinned, uniq_name = "_QFnested_default_clause_testsEk"}
|
|
!CHECK: omp.parallel {
|
|
!CHECK: %[[INNER_PRIVATE_Y:.*]] = fir.alloca i32 {bindc_name = "y", pinned, uniq_name = "_QFnested_default_clause_testsEy"}
|
|
!CHECK: %[[INNER_PRIVATE_X:.*]] = fir.alloca i32 {bindc_name = "x", pinned, uniq_name = "_QFnested_default_clause_testsEx"}
|
|
!CHECK: %[[const:.*]] = arith.constant 20 : i32
|
|
!CHECK: fir.store %[[const]] to %[[INNER_PRIVATE_Y]] : !fir.ref<i32>
|
|
!CHECK: %[[const:.*]] = arith.constant 10 : i32
|
|
!CHECK: fir.store %[[const]] to %[[INNER_PRIVATE_X]] : !fir.ref<i32>
|
|
!CHECK: omp.terminator
|
|
!CHECK: }
|
|
!CHECK: omp.parallel {
|
|
!CHECK: %[[INNER_PRIVATE_W:.*]] = fir.alloca i32 {bindc_name = "w", pinned, uniq_name = "_QFnested_default_clause_testsEw"}
|
|
!CHECK: %[[INNER_PRIVATE_Z:.*]] = fir.alloca i32 {bindc_name = "z", pinned, uniq_name = "_QFnested_default_clause_testsEz"}
|
|
!CHECK: %[[temp:.*]] = fir.load %[[PRIVATE_Z]]
|
|
!CHECK: fir.store %[[temp]] to %[[INNER_PRIVATE_Z]] : !fir.ref<i32>
|
|
!CHECK: %[[INNER_PRIVATE_K:.*]] = fir.alloca i32 {bindc_name = "k", pinned, uniq_name = "_QFnested_default_clause_testsEk"}
|
|
!CHECK: %[[temp:.*]] = fir.load %[[PRIVATE_K]] : !fir.ref<i32>
|
|
!CHECK: fir.store %[[temp]] to %[[INNER_PRIVATE_K]] : !fir.ref<i32>
|
|
!CHECK: %[[const:.*]] = arith.constant 30 : i32
|
|
!CHECK: fir.store %[[const]] to %[[PRIVATE_Y]] : !fir.ref<i32>
|
|
!CHECK: %[[const:.*]] = arith.constant 40 : i32
|
|
!CHECK: fir.store %[[const]] to %[[INNER_PRIVATE_W]] : !fir.ref<i32>
|
|
!CHECK: %[[const:.*]] = arith.constant 50 : i32
|
|
!CHECK: fir.store %[[const]] to %[[INNER_PRIVATE_Z]] : !fir.ref<i32>
|
|
!CHECK: %[[const:.*]] = arith.constant 40 : i32
|
|
!CHECK: fir.store %[[const]] to %[[INNER_PRIVATE_K]] : !fir.ref<i32>
|
|
!CHECK: omp.terminator
|
|
!CHECK: }
|
|
!CHECK: omp.terminator
|
|
!CHECK: }
|
|
!$omp parallel firstprivate(x) private(y) shared(w) default(private)
|
|
!$omp parallel default(private)
|
|
y = 20
|
|
x = 10
|
|
!$omp end parallel
|
|
|
|
!$omp parallel default(firstprivate) shared(y) private(w)
|
|
y = 30
|
|
w = 40
|
|
z = 50
|
|
k = 40
|
|
!$omp end parallel
|
|
!$omp end parallel
|
|
|
|
|
|
!CHECK: omp.parallel {
|
|
!CHECK: %[[PRIVATE_X:.*]] = fir.alloca i32 {bindc_name = "x", pinned, uniq_name = "_QFnested_default_clause_testsEx"}
|
|
!CHECK: %[[PRIVATE_Y:.*]] = fir.alloca i32 {bindc_name = "y", pinned, uniq_name = "_QFnested_default_clause_testsEy"}
|
|
!CHECK: %[[PRIVATE_Z:.*]] = fir.alloca i32 {bindc_name = "z", pinned, uniq_name = "_QFnested_default_clause_testsEz"}
|
|
!CHECK: %[[PRIVATE_W:.*]] = fir.alloca i32 {bindc_name = "w", pinned, uniq_name = "_QFnested_default_clause_testsEw"}
|
|
!CHECK: omp.parallel {
|
|
!CHECK: %[[PRIVATE_INNER_X:.*]] = fir.alloca i32 {bindc_name = "x", pinned, uniq_name = "_QFnested_default_clause_testsEx"}
|
|
!CHECK: %[[temp:.*]] = fir.load %[[PRIVATE_X]] : !fir.ref<i32>
|
|
!CHECK: fir.store %[[temp]] to %[[PRIVATE_INNER_X]] : !fir.ref<i32>
|
|
!CHECK: %[[INNER_PRIVATE_Y:.*]] = fir.alloca i32 {bindc_name = "y", pinned, uniq_name = "_QFnested_default_clause_testsEy"}
|
|
!CHECK: %[[temp:.*]] = fir.load %[[PRIVATE_Y]] : !fir.ref<i32>
|
|
!CHECK: fir.store %[[temp]] to %[[INNER_PRIVATE_Y]] : !fir.ref<i32>
|
|
!CHECK: %[[temp:.*]] = fir.load %[[INNER_PRIVATE_Y]] : !fir.ref<i32>
|
|
!CHECK: fir.store %[[temp]] to %[[PRIVATE_INNER_X]] : !fir.ref<i32>
|
|
!CHECK: omp.terminator
|
|
!CHECK: }
|
|
!CHECK: omp.parallel {
|
|
!CHECK: %[[PRIVATE_INNER_W:.*]] = fir.alloca i32 {bindc_name = "w", pinned, uniq_name = "_QFnested_default_clause_testsEw"}
|
|
!CHECK: %[[PRIVATE_INNER_X:.*]] = fir.alloca i32 {bindc_name = "x", pinned, uniq_name = "_QFnested_default_clause_testsEx"}
|
|
!CHECK: %[[temp_1:.*]] = fir.load %[[PRIVATE_INNER_X]] : !fir.ref<i32>
|
|
!CHECK: %[[temp_2:.*]] = fir.load %[[PRIVATE_Z]] : !fir.ref<i32>
|
|
!CHECK: %[[result:.*]] = arith.addi %{{.*}}, %{{.*}} : i32
|
|
!CHECK: fir.store %[[result]] to %[[PRIVATE_INNER_W]] : !fir.ref<i32>
|
|
!CHECK: omp.terminator
|
|
!CHECK: }
|
|
!$omp parallel default(private)
|
|
!$omp parallel default(firstprivate)
|
|
x = y
|
|
!$omp end parallel
|
|
|
|
!$omp parallel default(private) shared(z)
|
|
w = x + z
|
|
!$omp end parallel
|
|
!$omp end parallel
|
|
|
|
!CHECK: omp.parallel {
|
|
!CHECK: %[[PRIVATE_X:.*]] = fir.alloca i32 {bindc_name = "x", pinned, uniq_name = "_QFnested_default_clause_testsEx"}
|
|
!CHECK: %[[PRIVATE_Y:.*]] = fir.alloca i32 {bindc_name = "y", pinned, uniq_name = "_QFnested_default_clause_testsEy"}
|
|
!CHECK: %[[PRIVATE_W:.*]] = fir.alloca i32 {bindc_name = "w", pinned, uniq_name = "_QFnested_default_clause_testsEw"}
|
|
!CHECK: %[[PRIVATE_Z:.*]] = fir.alloca i32 {bindc_name = "z", pinned, uniq_name = "_QFnested_default_clause_testsEz"}
|
|
!CHECK: omp.parallel {
|
|
!CHECK: %[[INNER_PRIVATE_X:.*]] = fir.alloca i32 {bindc_name = "x", pinned, uniq_name = "_QFnested_default_clause_testsEx"}
|
|
!CHECK: %[[temp:.*]] = fir.load %[[PRIVATE_X]] : !fir.ref<i32>
|
|
!CHECK: fir.store %[[temp]] to %[[INNER_PRIVATE_X]] : !fir.ref<i32>
|
|
!CHECK: %[[INNER_PRIVATE_Y:.*]] = fir.alloca i32 {bindc_name = "y", pinned, uniq_name = "_QFnested_default_clause_testsEy"}
|
|
!CHECK: %[[temp:.*]] = fir.load %[[PRIVATE_Y]] : !fir.ref<i32>
|
|
!CHECK: fir.store %[[temp]] to %[[INNER_PRIVATE_Y]] : !fir.ref<i32>
|
|
!CHECK: %[[temp:.*]] = fir.load %[[INNER_PRIVATE_Y]] : !fir.ref<i32>
|
|
!CHECK: fir.store %[[temp]] to %[[INNER_PRIVATE_X]] : !fir.ref<i32>
|
|
!CHECK: omp.terminator
|
|
!CHECK: }
|
|
!CHECK: omp.parallel {
|
|
!CHECK: %[[temp_1:.*]] = fir.load %[[PRIVATE_X]] : !fir.ref<i32>
|
|
!CHECK: %[[temp_2:.*]] = fir.load %[[PRIVATE_Z]] : !fir.ref<i32>
|
|
!CHECK: %[[temp_3:.*]] = arith.addi %[[temp_1]], %[[temp_2]] : i32
|
|
!CHECK: fir.store %[[temp_3]] to %[[PRIVATE_W]] : !fir.ref<i32>
|
|
!CHECK: omp.terminator
|
|
!CHECK: }
|
|
!CHECK: }
|
|
!$omp parallel default(private)
|
|
!$omp parallel default(firstprivate)
|
|
x = y
|
|
!$omp end parallel
|
|
|
|
!$omp parallel default(shared)
|
|
w = x + z
|
|
!$omp end parallel
|
|
!$omp end parallel
|
|
|
|
!CHECK: omp.parallel {
|
|
!CHECK: %[[PRIVATE_X:.*]] = fir.alloca i32 {bindc_name = "x", pinned, uniq_name = "_QFnested_default_clause_testsEx"}
|
|
!CHECK: %[[temp:.*]] = fir.load %[[X]] : !fir.ref<i32>
|
|
!CHECK: fir.store %[[temp]] to %[[PRIVATE_X]] : !fir.ref<i32>
|
|
!CHECK: %[[PRIVATE_Y:.*]] = fir.alloca i32 {bindc_name = "y", pinned, uniq_name = "_QFnested_default_clause_testsEy"}
|
|
!CHECK: %[[temp:.*]] = fir.load %[[Y]] : !fir.ref<i32>
|
|
!CHECK: fir.store %[[temp]] to %[[PRIVATE_Y]] : !fir.ref<i32>
|
|
!CHECK: omp.single {
|
|
!CHECK: %[[temp:.*]] = fir.load %[[PRIVATE_Y]] : !fir.ref<i32>
|
|
!CHECK: fir.store %[[temp]] to %[[PRIVATE_X]] : !fir.ref<i32>
|
|
!CHECK: omp.terminator
|
|
!CHECK: }
|
|
!CHECK: omp.terminator
|
|
!CHECK: }
|
|
!CHECK: }
|
|
!$omp parallel default(firstprivate)
|
|
!$omp single
|
|
x = y
|
|
!$omp end single
|
|
!$omp end parallel
|
|
end subroutine
|