Skip to content

Commit 09f96c2

Browse files
authored
Merge pull request llvm#605 from AMD-Lightning-Internal/amd/dev/macurtis/fix-slow-weather
[flang][Lower][OpenMP] Allocate private boxed vars on stack
2 parents 7cb5a82 + 238c27b commit 09f96c2

14 files changed

+69
-158
lines changed

flang/lib/Lower/OpenMP/PrivateReductionUtils.cpp

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -451,14 +451,23 @@ void PopulateInitAndCleanupRegionsHelper::initAndCleanupBoxedArray(
451451
return;
452452
}
453453

454-
// Allocating on the heap in case the whole reduction/privatization is nested
454+
// TODO: Allocate on the heap if the whole reduction/privatization is nested
455455
// inside of a loop
456-
auto [temp, needsDealloc] = createTempFromMold(loc, builder, source);
456+
mlir::Value tempValue;
457+
std::optional<int64_t> cstNeedsDealloc;
458+
if (isAllocatableOrPointer) {
459+
auto [heapTemp, needsDealloc] = createTempFromMold(loc, builder, source);
460+
tempValue = heapTemp;
461+
cstNeedsDealloc = fir::getIntIfConstant(needsDealloc);
462+
} else {
463+
tempValue = hlfir::createStackTempFromMold(loc, builder, source);
464+
cstNeedsDealloc = false;
465+
}
466+
hlfir::Entity temp{tempValue};
467+
457468
// if needsDealloc isn't statically false, add cleanup region. Always
458469
// do this for allocatable boxes because they might have been re-allocated
459470
// in the body of the loop/parallel region
460-
461-
std::optional<int64_t> cstNeedsDealloc = fir::getIntIfConstant(needsDealloc);
462471
assert(cstNeedsDealloc.has_value() &&
463472
"createTempFromMold decides this statically");
464473
if (cstNeedsDealloc.has_value() && *cstNeedsDealloc != false) {
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
! RUN: %flang_fc1 -emit-llvm -fopenmp -o - -x f95 %s | FileCheck %s
2+
3+
subroutine foo(state,ilast,jlast,vals)
4+
real, intent(in) :: state(:,:)
5+
integer, intent(in) :: ilast, jlast
6+
real, intent( out) :: vals(:,:)
7+
8+
real :: bar(4)
9+
integer :: i,k,ll,s
10+
11+
!$omp target teams distribute parallel do private(bar)
12+
do i = 1, ilast
13+
do j = 1, jlast
14+
do s = 1, 4
15+
bar(s) = state(i,j+s)
16+
enddo
17+
vals(i,j) = -bar(1)/12 + 7*bar(2)/12 + 7*bar(3)/12 - bar(4)/12
18+
enddo
19+
enddo
20+
!$omp end target teams distribute parallel do
21+
end subroutine foo
22+
23+
! Ensure that we do not generate a call to malloc
24+
!CHECK-LABEL: omp.private.init:
25+
!CHECK-NOT: call {{.*}} @malloc
26+
!CHECK: br label
27+

flang/test/Lower/OpenMP/DelayedPrivatization/target-private-multiple-variables.f90

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,7 @@ end subroutine target_allocatable
6363
! CHECK-NEXT: %[[C0:.*]] = arith.constant 0 : index
6464
! CHECK-NEXT: %[[BOX_DIMS:.*]]:3 = fir.box_dims %[[MOLD]], %[[C0]]
6565
! CHECK-NEXT: %[[SHAPE:.*]] = fir.shape %[[BOX_DIMS]]#1
66-
! CHECK-NEXT: %[[DATA_ALLOC:.*]] = fir.allocmem !fir.array<?xf32>, %[[BOX_DIMS]]#1
67-
! CHECK-NEXT: %[[TRUE:.*]] = arith.constant true
66+
! CHECK-NEXT: %[[DATA_ALLOC:.*]] = fir.alloca !fir.array<?xf32>, %[[BOX_DIMS]]#1
6867
! CHECK-NEXT: %[[DECL:.*]]:2 = hlfir.declare %[[DATA_ALLOC:.*]](%[[SHAPE]])
6968
! CHECK-NEXT: %[[C0_2:.*]] = arith.constant 0 : index
7069
! CHECK-NEXT: %[[BOX_DIMS_2:.*]]:3 = fir.box_dims %[[MOLD]], %[[C0_2]]

flang/test/Lower/OpenMP/delayed-privatization-array.f90

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,7 @@ subroutine delayed_privatization_private_1d(var1, l1, u1)
3636
! ONE_DIM-NEXT: %[[C0:.*]] = arith.constant 0 : index
3737
! ONE_DIM-NEXT: %[[DIMS:.*]]:3 = fir.box_dims %[[PRIV_ARG_VAL]], %[[C0]]
3838
! ONE_DIM-NEXT: %[[SHAPE:.*]] = fir.shape %[[DIMS]]#1
39-
! ONE_DIM-NEXT: %[[ARRAY_ALLOC:.*]] = fir.allocmem !fir.array<?xi32>, %[[DIMS]]#1
40-
! ONE_DIM-NEXT: %[[TRUE:.*]] = arith.constant true
39+
! ONE_DIM-NEXT: %[[ARRAY_ALLOC:.*]] = fir.alloca !fir.array<?xi32>, %[[DIMS]]#1
4140
! ONE_DIM-NEXT: %[[DECL:.*]]:2 = hlfir.declare %[[ARRAY_ALLOC]](%[[SHAPE]])
4241
! ONE_DIM-NEXT: %[[C0_0:.*]] = arith.constant 0
4342
! ONE_DIM-NEXT: %[[DIMS2:.*]]:3 = fir.box_dims %[[PRIV_ARG_VAL]], %[[C0_0]]
@@ -74,8 +73,7 @@ subroutine delayed_privatization_private_2d(var1, l1, u1, l2, u2)
7473
! TWO_DIM-NEXT: %[[C1:.*]] = arith.constant 1 : index
7574
! TWO_DIM-NEXT: %[[DIMS_1:.*]]:3 = fir.box_dims %[[PRIV_ARG_VAL]], %[[C1]]
7675
! TWO_DIM-NEXT: %[[SHAPE:.*]] = fir.shape %[[DIMS_0]]#1, %[[DIMS_1]]#1
77-
! TWO_DIM-NEXT: %[[ARRAY_ALLOC:.*]] = fir.allocmem !fir.array<?x?xi32>, %[[DIMS_0]]#1, %[[DIMS_1]]#1
78-
! TWO_DIM-NEXT: %[[TRUE:.*]] = arith.constant true
76+
! TWO_DIM-NEXT: %[[ARRAY_ALLOC:.*]] = fir.alloca !fir.array<?x?xi32>, %[[DIMS_0]]#1, %[[DIMS_1]]#1
7977
! TWO_DIM-NEXT: %[[DECL:.*]]:2 = hlfir.declare %[[ARRAY_ALLOC]](%[[SHAPE]])
8078
! TWO_DIM-NEXT: %[[C0_0:.*]] = arith.constant 0
8179
! TWO_DIM-NEXT: %[[DIMS2_0:.*]]:3 = fir.box_dims %[[PRIV_ARG_VAL]], %[[C0_0]]
@@ -107,11 +105,10 @@ program main
107105
! ONE_DIM_DEFAULT_LB-SAME: @[[PRIVATIZER_SYM:.*]] : [[BOX_TYPE:!fir.box<!fir.array<10xi32>>]] init {
108106

109107
! ONE_DIM_DEFAULT_LB-NEXT: ^bb0(%[[PRIV_ARG:.*]]: [[TYPE:!fir.ref<!fir.box<!fir.array<10xi32>>>]], %[[PRIV_BOX_ALLOC:.*]]: [[TYPE]]):
108+
! ONE_DIM_DEFAULT_LB-NEXT: %[[ARRAY_ALLOC:.*]] = fir.alloca !fir.array<10xi32>
110109
! ONE_DIM_DEFAULT_LB-NEXT: %[[PRIV_ARG_VAL:.*]] = fir.load %[[PRIV_ARG]]
111110
! ONE_DIM_DEFAULT_LB-NEXT: %[[C10:.*]] = arith.constant 10 : index
112111
! ONE_DIM_DEFAULT_LB-NEXT: %[[SHAPE:.*]] = fir.shape %[[C10]]
113-
! ONE_DIM_DEFAULT_LB-NEXT: %[[ARRAY_ALLOC:.*]] = fir.allocmem !fir.array<10xi32>
114-
! ONE_DIM_DEFAULT_LB-NEXT: %[[TRUE:.*]] = arith.constant true
115112
! ONE_DIM_DEFAULT_LB-NEXT: %[[DECL:.*]]:2 = hlfir.declare %[[ARRAY_ALLOC]](%[[SHAPE]])
116113
! ONE_DIM_DEFAULT_LB-NEXT: %[[C0_0:.*]] = arith.constant 0
117114
! ONE_DIM_DEFAULT_LB-NEXT: %[[DIMS2:.*]]:3 = fir.box_dims %[[PRIV_ARG_VAL]], %[[C0_0]]

flang/test/Lower/OpenMP/parallel-reduction-array-lb.f90

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,19 @@ program reduce
1717
! CHECK: omp.yield(%[[VAL_15]] : !fir.ref<!fir.box<!fir.array<3x2xi32>>>)
1818
! CHECK-LABEL: } init {
1919
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.array<3x2xi32>>>, %[[ALLOC:.*]]: !fir.ref<!fir.box<!fir.array<3x2xi32>>>):
20+
! CHECK: %[[VAL_6:.*]] = fir.alloca !fir.array<3x2xi32> {bindc_name = ".tmp"}
2021
! CHECK: %[[VAL_1:.*]] = arith.constant 0 : i32
2122
! CHECK: %[[VAL_2:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.array<3x2xi32>>>
2223
! CHECK: %[[VAL_3:.*]] = arith.constant 3 : index
2324
! CHECK: %[[VAL_4:.*]] = arith.constant 2 : index
2425
! CHECK: %[[VAL_5:.*]] = fir.shape %[[VAL_3]], %[[VAL_4]] : (index, index) -> !fir.shape<2>
25-
! CHECK: %[[VAL_6:.*]] = fir.allocmem !fir.array<3x2xi32> {bindc_name = ".tmp", uniq_name = ""}
26-
! CHECK: %[[VAL_7:.*]] = arith.constant true
27-
! CHECK: %[[VAL_8:.*]]:2 = hlfir.declare %[[VAL_6]](%[[VAL_5]]) {uniq_name = ".tmp"} : (!fir.heap<!fir.array<3x2xi32>>, !fir.shape<2>) -> (!fir.heap<!fir.array<3x2xi32>>, !fir.heap<!fir.array<3x2xi32>>)
26+
! CHECK: %[[VAL_8:.*]]:2 = hlfir.declare %[[VAL_6]](%[[VAL_5]]) {uniq_name = ".tmp"} : (!fir.ref<!fir.array<3x2xi32>>, !fir.shape<2>) -> (!fir.ref<!fir.array<3x2xi32>>, !fir.ref<!fir.array<3x2xi32>>)
2827
! CHECK: %[[VAL_9:.*]] = arith.constant 0 : index
2928
! CHECK: %[[VAL_10:.*]]:3 = fir.box_dims %[[VAL_2]], %[[VAL_9]] : (!fir.box<!fir.array<3x2xi32>>, index) -> (index, index, index)
3029
! CHECK: %[[VAL_11:.*]] = arith.constant 1 : index
3130
! CHECK: %[[VAL_12:.*]]:3 = fir.box_dims %[[VAL_2]], %[[VAL_11]] : (!fir.box<!fir.array<3x2xi32>>, index) -> (index, index, index)
3231
! CHECK: %[[VAL_13:.*]] = fir.shape_shift %[[VAL_10]]#0, %[[VAL_10]]#1, %[[VAL_12]]#0, %[[VAL_12]]#1 : (index, index, index, index) -> !fir.shapeshift<2>
33-
! CHECK: %[[VAL_14:.*]] = fir.embox %[[VAL_8]]#0(%[[VAL_13]]) : (!fir.heap<!fir.array<3x2xi32>>, !fir.shapeshift<2>) -> !fir.box<!fir.array<3x2xi32>>
32+
! CHECK: %[[VAL_14:.*]] = fir.embox %[[VAL_8]]#0(%[[VAL_13]]) : (!fir.ref<!fir.array<3x2xi32>>, !fir.shapeshift<2>) -> !fir.box<!fir.array<3x2xi32>>
3433
! CHECK: hlfir.assign %[[VAL_1]] to %[[VAL_14]] : i32, !fir.box<!fir.array<3x2xi32>>
3534
! CHECK: fir.store %[[VAL_14]] to %[[ALLOC]] : !fir.ref<!fir.box<!fir.array<3x2xi32>>>
3635
! CHECK: omp.yield(%[[ALLOC]] : !fir.ref<!fir.box<!fir.array<3x2xi32>>>)
@@ -55,18 +54,6 @@ program reduce
5554
! CHECK: }
5655
! CHECK: }
5756
! CHECK: omp.yield(%[[VAL_0]] : !fir.ref<!fir.box<!fir.array<3x2xi32>>>)
58-
! CHECK: } cleanup {
59-
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.array<3x2xi32>>>):
60-
! CHECK: %[[VAL_1:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.array<3x2xi32>>>
61-
! CHECK: %[[VAL_2:.*]] = fir.box_addr %[[VAL_1]] : (!fir.box<!fir.array<3x2xi32>>) -> !fir.ref<!fir.array<3x2xi32>>
62-
! CHECK: %[[VAL_3:.*]] = fir.convert %[[VAL_2]] : (!fir.ref<!fir.array<3x2xi32>>) -> i64
63-
! CHECK: %[[VAL_4:.*]] = arith.constant 0 : i64
64-
! CHECK: %[[VAL_5:.*]] = arith.cmpi ne, %[[VAL_3]], %[[VAL_4]] : i64
65-
! CHECK: fir.if %[[VAL_5]] {
66-
! CHECK: %[[VAL_6:.*]] = fir.convert %[[VAL_2]] : (!fir.ref<!fir.array<3x2xi32>>) -> !fir.heap<!fir.array<3x2xi32>>
67-
! CHECK: fir.freemem %[[VAL_6]] : !fir.heap<!fir.array<3x2xi32>>
68-
! CHECK: }
69-
! CHECK: omp.yield
7057
! CHECK: }
7158

7259
! CHECK-LABEL: func.func @_QQmain() attributes {fir.bindc_name = "reduce"} {

flang/test/Lower/OpenMP/parallel-reduction-array.f90

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,17 @@ program reduce
1818
! CHECK: omp.yield(%[[VAL_8]] : !fir.ref<!fir.box<!fir.array<3xi32>>>)
1919
! CHECK-LABEL: } init {
2020
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.array<3xi32>>>, %[[ALLOC:.*]]: !fir.ref<!fir.box<!fir.array<3xi32>>>):
21+
! CHECK: %[[VAL_1:.*]] = fir.alloca !fir.array<3xi32> {bindc_name = ".tmp"}
2122
! CHECK: %[[VAL_2:.*]] = arith.constant 0 : i32
2223
! CHECK: %[[VAL_3:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.array<3xi32>>>
2324
! CHECK: %[[VAL_4:.*]] = arith.constant 3 : index
2425
! CHECK: %[[VAL_5:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1>
25-
! CHECK: %[[VAL_1:.*]] = fir.allocmem !fir.array<3xi32> {bindc_name = ".tmp", uniq_name = ""}
26-
! CHECK: %[[TRUE:.*]] = arith.constant true
27-
! CHECK: %[[VAL_6:.*]]:2 = hlfir.declare %[[VAL_1]](%[[VAL_5]]) {uniq_name = ".tmp"} : (!fir.heap<!fir.array<3xi32>>,
28-
!fir.shape<1>) -> (!fir.heap<!fir.array<3xi32>>, !fir.heap<!fir.array<3xi32>>)
26+
! CHECK: %[[VAL_6:.*]]:2 = hlfir.declare %[[VAL_1]](%[[VAL_5]]) {uniq_name = ".tmp"} : (!fir.ref<!fir.array<3xi32>>,
27+
!fir.shape<1>) -> (!fir.ref<!fir.array<3xi32>>, !fir.ref<!fir.array<3xi32>>)
2928
! CHECK: %[[C0:.*]] = arith.constant 0 : index
3029
! CHECK: %[[DIMS:.*]]:3 = fir.box_dims %[[VAL_3]], %[[C0]] : (!fir.box<!fir.array<3xi32>>, index) -> (index, index, index)
3130
! CHECK: %[[SHIFT:.*]] = fir.shape_shift %[[DIMS]]#0, %[[DIMS]]#1 : (index, index) -> !fir.shapeshift<1>
32-
! CHECK: %[[VAL_7:.*]] = fir.embox %[[VAL_6]]#0(%[[SHIFT]]) : (!fir.heap<!fir.array<3xi32>>, !fir.shapeshift<1>) -> !fir.box<!fir.array<3xi32>>
31+
! CHECK: %[[VAL_7:.*]] = fir.embox %[[VAL_6]]#0(%[[SHIFT]]) : (!fir.ref<!fir.array<3xi32>>, !fir.shapeshift<1>) -> !fir.box<!fir.array<3xi32>>
3332
! CHECK: hlfir.assign %[[VAL_2]] to %[[VAL_7]] : i32, !fir.box<!fir.array<3xi32>>
3433
! CHECK: fir.store %[[VAL_7]] to %[[ALLOC]] : !fir.ref<!fir.box<!fir.array<3xi32>>>
3534
! CHECK: omp.yield(%[[ALLOC]] : !fir.ref<!fir.box<!fir.array<3xi32>>>)
@@ -50,18 +49,6 @@ program reduce
5049
! CHECK: fir.store %[[VAL_13]] to %[[VAL_9]] : !fir.ref<i32>
5150
! CHECK: }
5251
! CHECK: omp.yield(%[[VAL_0]] : !fir.ref<!fir.box<!fir.array<3xi32>>>)
53-
! CHECK: } cleanup {
54-
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.array<3xi32>>>):
55-
! CHECK: %[[VAL_1:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.array<3xi32>>>
56-
! CHECK: %[[VAL_2:.*]] = fir.box_addr %[[VAL_1]] : (!fir.box<!fir.array<3xi32>>) -> !fir.ref<!fir.array<3xi32>>
57-
! CHECK: %[[VAL_3:.*]] = fir.convert %[[VAL_2]] : (!fir.ref<!fir.array<3xi32>>) -> i64
58-
! CHECK: %[[VAL_4:.*]] = arith.constant 0 : i64
59-
! CHECK: %[[VAL_5:.*]] = arith.cmpi ne, %[[VAL_3]], %[[VAL_4]] : i64
60-
! CHECK: fir.if %[[VAL_5]] {
61-
! CHECK: %[[VAL_6:.*]] = fir.convert %[[VAL_2]] : (!fir.ref<!fir.array<3xi32>>) -> !fir.heap<!fir.array<3xi32>>
62-
! CHECK: fir.freemem %[[VAL_6]] : !fir.heap<!fir.array<3xi32>>
63-
! CHECK: }
64-
! CHECK: omp.yield
6552
! CHECK: }
6653

6754
! CHECK-LABEL: func.func @_QQmain()

flang/test/Lower/OpenMP/parallel-reduction-array2.f90

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,16 @@ program reduce
1818
! CHECK: omp.yield(%[[VAL_8]] : !fir.ref<!fir.box<!fir.array<3xi32>>>)
1919
! CHECK-LABEL: } init {
2020
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.array<3xi32>>>, %[[ALLOC:.*]]: !fir.ref<!fir.box<!fir.array<3xi32>>>):
21+
! CHECK: %[[VAL_1:.*]] = fir.alloca !fir.array<3xi32>
2122
! CHECK: %[[VAL_2:.*]] = arith.constant 0 : i32
2223
! CHECK: %[[VAL_3:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.array<3xi32>>>
2324
! CHECK: %[[VAL_4:.*]] = arith.constant 3 : index
2425
! CHECK: %[[VAL_5:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1>
25-
! CHECK: %[[VAL_1:.*]] = fir.allocmem !fir.array<3xi32>
26-
! CHECK: %[[TRUE:.*]] = arith.constant true
27-
! CHECK: %[[VAL_6:.*]]:2 = hlfir.declare %[[VAL_1]](%[[VAL_5]]) {uniq_name = ".tmp"} : (!fir.heap<!fir.array<3xi32>>, !fir.shape<1>) -> (!fir.heap<!fir.array<3xi32>>, !fir.heap<!fir.array<3xi32>>)
26+
! CHECK: %[[VAL_6:.*]]:2 = hlfir.declare %[[VAL_1]](%[[VAL_5]]) {uniq_name = ".tmp"} : (!fir.ref<!fir.array<3xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<3xi32>>, !fir.ref<!fir.array<3xi32>>)
2827
! CHECK: %[[C0:.*]] = arith.constant 0 : index
2928
! CHECK: %[[DIMS:.*]]:3 = fir.box_dims %[[VAL_3]], %[[C0]] : (!fir.box<!fir.array<3xi32>>, index) -> (index, index, index)
3029
! CHECK: %[[SHIFT:.*]] = fir.shape_shift %[[DIMS]]#0, %[[DIMS]]#1 : (index, index) -> !fir.shapeshift<1>
31-
! CHECK: %[[VAL_7:.*]] = fir.embox %[[VAL_6]]#0(%[[SHIFT]]) : (!fir.heap<!fir.array<3xi32>>, !fir.shapeshift<1>) -> !fir.box<!fir.array<3xi32>>
30+
! CHECK: %[[VAL_7:.*]] = fir.embox %[[VAL_6]]#0(%[[SHIFT]]) : (!fir.ref<!fir.array<3xi32>>, !fir.shapeshift<1>) -> !fir.box<!fir.array<3xi32>>
3231
! CHECK: hlfir.assign %[[VAL_2]] to %[[VAL_7]] : i32, !fir.box<!fir.array<3xi32>>
3332
! CHECK: fir.store %[[VAL_7]] to %[[ALLOC]] : !fir.ref<!fir.box<!fir.array<3xi32>>>
3433
! CHECK: omp.yield(%[[ALLOC]] : !fir.ref<!fir.box<!fir.array<3xi32>>>)
@@ -49,18 +48,6 @@ program reduce
4948
! CHECK: fir.store %[[VAL_13]] to %[[VAL_9]] : !fir.ref<i32>
5049
! CHECK: }
5150
! CHECK: omp.yield(%[[VAL_0]] : !fir.ref<!fir.box<!fir.array<3xi32>>>)
52-
! CHECK: } cleanup {
53-
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.array<3xi32>>>):
54-
! CHECK: %[[VAL_1:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.array<3xi32>>>
55-
! CHECK: %[[VAL_2:.*]] = fir.box_addr %[[VAL_1]] : (!fir.box<!fir.array<3xi32>>) -> !fir.ref<!fir.array<3xi32>>
56-
! CHECK: %[[VAL_3:.*]] = fir.convert %[[VAL_2]] : (!fir.ref<!fir.array<3xi32>>) -> i64
57-
! CHECK: %[[VAL_4:.*]] = arith.constant 0 : i64
58-
! CHECK: %[[VAL_5:.*]] = arith.cmpi ne, %[[VAL_3]], %[[VAL_4]] : i64
59-
! CHECK: fir.if %[[VAL_5]] {
60-
! CHECK: %[[VAL_6:.*]] = fir.convert %[[VAL_2]] : (!fir.ref<!fir.array<3xi32>>) -> !fir.heap<!fir.array<3xi32>>
61-
! CHECK: fir.freemem %[[VAL_6]] : !fir.heap<!fir.array<3xi32>>
62-
! CHECK: }
63-
! CHECK: omp.yield
6451
! CHECK: }
6552

6653
! CHECK-LABEL: func.func @_QQmain() attributes {fir.bindc_name = "reduce"} {

flang/test/Lower/OpenMP/parallel-reduction3.f90

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,8 @@
1111
! CHECK: %[[VAL_3:.*]] = arith.constant 0 : index
1212
! CHECK: %[[VAL_4:.*]]:3 = fir.box_dims %[[VAL_2]], %[[VAL_3]] : (!fir.box<!fir.array<?xi32>>, index) -> (index, index, index)
1313
! CHECK: %[[VAL_5:.*]] = fir.shape %[[VAL_4]]#1 : (index) -> !fir.shape<1>
14-
! CHECK: %[[VAL_6:.*]] = fir.allocmem !fir.array<?xi32>, %[[VAL_4]]#1 {bindc_name = ".tmp", uniq_name = ""}
15-
! CHECK: %[[TRUE:.*]] = arith.constant true
16-
! CHECK: %[[VAL_7:.*]]:2 = hlfir.declare %[[VAL_6]](%[[VAL_5]]) {uniq_name = ".tmp"} : (!fir.heap<!fir.array<?xi32>>, !fir.shape<1>) -> (!fir.box<!fir.array<?xi32>>, !fir.heap<!fir.array<?xi32>>)
14+
! CHECK: %[[VAL_6:.*]] = fir.alloca !fir.array<?xi32>, %[[VAL_4]]#1 {bindc_name = ".tmp"}
15+
! CHECK: %[[VAL_7:.*]]:2 = hlfir.declare %[[VAL_6]](%[[VAL_5]]) {uniq_name = ".tmp"} : (!fir.ref<!fir.array<?xi32>>, !fir.shape<1>) -> (!fir.box<!fir.array<?xi32>>, !fir.ref<!fir.array<?xi32>>)
1716
! CHECK: %[[C0:.*]] = arith.constant 0 : index
1817
! CHECK: %[[DIMS:.*]]:3 = fir.box_dims %[[VAL_2]], %[[C0]] : (!fir.box<!fir.array<?xi32>>, index) -> (index, index, index)
1918
! CHECK: %[[SHIFT:.*]] = fir.shape_shift %[[DIMS]]#0, %[[DIMS]]#1 : (index, index) -> !fir.shapeshift<1>
@@ -38,18 +37,6 @@
3837
! CHECK: fir.store %[[VAL_13]] to %[[VAL_9]] : !fir.ref<i32>
3938
! CHECK: }
4039
! CHECK: omp.yield(%[[VAL_0]] : !fir.ref<!fir.box<!fir.array<?xi32>>>)
41-
! CHECK: } cleanup {
42-
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.array<?xi32>>>):
43-
! CHECK: %[[VAL_1:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.array<?xi32>>>
44-
! CHECK: %[[VAL_2:.*]] = fir.box_addr %[[VAL_1]] : (!fir.box<!fir.array<?xi32>>) -> !fir.ref<!fir.array<?xi32>>
45-
! CHECK: %[[VAL_3:.*]] = fir.convert %[[VAL_2]] : (!fir.ref<!fir.array<?xi32>>) -> i64
46-
! CHECK: %[[VAL_4:.*]] = arith.constant 0 : i64
47-
! CHECK: %[[VAL_5:.*]] = arith.cmpi ne, %[[VAL_3]], %[[VAL_4]] : i64
48-
! CHECK: fir.if %[[VAL_5]] {
49-
! CHECK: %[[VAL_6:.*]] = fir.convert %[[VAL_2]] : (!fir.ref<!fir.array<?xi32>>) -> !fir.heap<!fir.array<?xi32>>
50-
! CHECK: fir.freemem %[[VAL_6]] : !fir.heap<!fir.array<?xi32>>
51-
! CHECK: }
52-
! CHECK: omp.yield
5340
! CHECK: }
5441

5542
! CHECK-LABEL: func.func @_QPs(

flang/test/Lower/OpenMP/reduction-array-intrinsic.f90

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,8 @@ subroutine max_array_reduction(l, r)
1919
! CHECK: %[[VAL_4:.*]] = arith.constant 0 : index
2020
! CHECK: %[[VAL_5:.*]]:3 = fir.box_dims %[[VAL_2]], %[[VAL_4]] : (!fir.box<!fir.array<?xi32>>, index) -> (index, index, index)
2121
! CHECK: %[[VAL_6:.*]] = fir.shape %[[VAL_5]]#1 : (index) -> !fir.shape<1>
22-
! CHECK: %[[VAL_7:.*]] = fir.allocmem !fir.array<?xi32>, %[[VAL_5]]#1 {bindc_name = ".tmp", uniq_name = ""}
23-
! CHECK: %[[VAL_8:.*]] = arith.constant true
24-
! CHECK: %[[VAL_9:.*]]:2 = hlfir.declare %[[VAL_7]](%[[VAL_6]]) {uniq_name = ".tmp"} : (!fir.heap<!fir.array<?xi32>>, !fir.shape<1>) -> (!fir.box<!fir.array<?xi32>>, !fir.heap<!fir.array<?xi32>>)
22+
! CHECK: %[[VAL_7:.*]] = fir.alloca !fir.array<?xi32>, %[[VAL_5]]#1 {bindc_name = ".tmp"}
23+
! CHECK: %[[VAL_9:.*]]:2 = hlfir.declare %[[VAL_7]](%[[VAL_6]]) {uniq_name = ".tmp"} : (!fir.ref<!fir.array<?xi32>>, !fir.shape<1>) -> (!fir.box<!fir.array<?xi32>>, !fir.ref<!fir.array<?xi32>>)
2524
! CHECK: %[[VAL_10:.*]] = arith.constant 0 : index
2625
! CHECK: %[[VAL_11:.*]]:3 = fir.box_dims %[[VAL_2]], %[[VAL_10]] : (!fir.box<!fir.array<?xi32>>, index) -> (index, index, index)
2726
! CHECK: %[[VAL_12:.*]] = fir.shape_shift %[[VAL_11]]#0, %[[VAL_11]]#1 : (index, index) -> !fir.shapeshift<1>
@@ -46,18 +45,6 @@ subroutine max_array_reduction(l, r)
4645
! CHECK: fir.store %[[VAL_13]] to %[[VAL_9]] : !fir.ref<i32>
4746
! CHECK: }
4847
! CHECK: omp.yield(%[[VAL_0]] : !fir.ref<!fir.box<!fir.array<?xi32>>>)
49-
! CHECK-LABEL: } cleanup {
50-
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.array<?xi32>>>):
51-
! CHECK: %[[VAL_1:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.array<?xi32>>>
52-
! CHECK: %[[VAL_2:.*]] = fir.box_addr %[[VAL_1]] : (!fir.box<!fir.array<?xi32>>) -> !fir.ref<!fir.array<?xi32>>
53-
! CHECK: %[[VAL_3:.*]] = fir.convert %[[VAL_2]] : (!fir.ref<!fir.array<?xi32>>) -> i64
54-
! CHECK: %[[VAL_4:.*]] = arith.constant 0 : i64
55-
! CHECK: %[[VAL_5:.*]] = arith.cmpi ne, %[[VAL_3]], %[[VAL_4]] : i64
56-
! CHECK: fir.if %[[VAL_5]] {
57-
! CHECK: %[[VAL_6:.*]] = fir.convert %[[VAL_2]] : (!fir.ref<!fir.array<?xi32>>) -> !fir.heap<!fir.array<?xi32>>
58-
! CHECK: fir.freemem %[[VAL_6]] : !fir.heap<!fir.array<?xi32>>
59-
! CHECK: }
60-
! CHECK: omp.yield
6148
! CHECK: }
6249

6350
! CHECK-LABEL: func.func @_QPmax_array_reduction(

flang/test/Lower/OpenMP/sections-array-reduction.f90

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,6 @@ subroutine sectionsReduction(x)
2323
! CHECK-LABEL: } combiner {
2424
! [...]
2525
! CHECK: omp.yield
26-
! CHECK-LABEL: } cleanup {
27-
! [...]
28-
! CHECK: omp.yield
2926
! CHECK: }
3027

3128
! CHECK-LABEL: func.func @_QPsectionsreduction(

0 commit comments

Comments
 (0)