xref: /llvm-project/flang/test/Lower/OpenMP/parallel-reduction-mixed.f90 (revision 6f9e688203097b1fbeeb1ad498a9bae6c78231ab)
1!! Make sure that mixture of by-ref and by-val reductions work all the way
2!! to LLVM-IR code.
3
4! RUN: %flang_fc1 -emit-llvm -fopenmp -o - %s 2>&1 \
5! RUN: | FileCheck %s
6
7subroutine proc
8  implicit none
9  real(8),allocatable :: F(:)
10  real(8),allocatable :: A(:)
11
12  integer :: I
13
14!$omp parallel private(A) reduction(+:F,I)
15  allocate(A(10))
16!$omp end parallel
17end subroutine proc
18
19!CHECK-LABEL: define void @proc_()
20!CHECK: call void (ptr, i32, ptr, ...)
21!CHECK-SAME: @__kmpc_fork_call(ptr {{.*}}, i32 1, ptr @[[OMP_PAR:.*]], {{.*}})
22
23!CHECK: define internal void @[[OMP_PAR]](ptr {{.*}} %[[TID_ADDR:.*]], ptr noalias
24!CHECK:  %[[TID_LOCAL:.*]] = alloca i32
25!CHECK:  %[[TID:.*]] = load i32, ptr %[[TID_ADDR]]
26!CHECK:  store i32 %[[TID]], ptr %[[TID_LOCAL]]
27!CHECK:  %[[F_priv:.*]] = alloca ptr
28!CHECK:  %[[I_priv:.*]] = alloca i32
29
30!CHECK: omp.par.region:
31
32!CHECK: omp.reduction.init:
33!CHECK:  store ptr %{{.*}}, ptr %[[F_priv]]
34!CHECK:  store i32 0, ptr %[[I_priv]]
35!CHECK:  br label %[[MALLOC_BB:.*]]
36
37!CHECK: [[MALLOC_BB]]:
38!CHECK-NOT: omp.par.{{.*}}:
39!CHECK: call ptr @malloc
40!CHECK-SAME: i64 10
41
42!CHECK: %[[RED_ARR_0:.*]] = getelementptr inbounds [2 x ptr], ptr %red.array, i64 0, i64 0
43!CHECK: store ptr %[[F_priv]], ptr %[[RED_ARR_0:.*]]
44!CHECK: %[[RED_ARR_1:.*]] = getelementptr inbounds [2 x ptr], ptr %red.array, i64 0, i64 1
45!CHECK: store ptr %[[I_priv]], ptr %[[RED_ARR_1]]
46
47!CHECK: omp.par.pre_finalize:                             ; preds = %reduce.finalize
48!CHECK:  %{{.*}} = load ptr, ptr %[[F_priv]]
49!CHECK:  br label %omp.reduction.cleanup
50
51!CHECK: omp.reduction.cleanup:
52!CHECK:  br i1 %{{.*}}, label %[[OMP_FREE:.*]], label %{{.*}}
53
54!CHECK: [[OMP_FREE]]:
55!CHECK: call void @free
56