Skip to content

Commit 498e2ec

Browse files
committed
[flang][OpenMP] fix reduction of arrays with non-default lower bounds
It turned out that hlfir::genVariableBox didn't add lower bounds to the boxes it created. Fixes #89259
1 parent 087b33b commit 498e2ec

8 files changed

+167
-37
lines changed

flang/lib/Lower/OpenMP/ReductionProcessor.cpp

Lines changed: 48 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -295,55 +295,60 @@ mlir::Value ReductionProcessor::createScalarCombiner(
295295
return reductionOp;
296296
}
297297

298-
/// Create reduction combiner region for reduction variables which are boxed
299-
/// arrays
300-
static void genBoxCombiner(fir::FirOpBuilder &builder, mlir::Location loc,
301-
ReductionProcessor::ReductionIdentifier redId,
302-
fir::BaseBoxType boxTy, mlir::Value lhs,
303-
mlir::Value rhs) {
304-
fir::SequenceType seqTy =
305-
mlir::dyn_cast_or_null<fir::SequenceType>(boxTy.getEleTy());
306-
// TODO: support allocatable arrays: !fir.box<!fir.heap<!fir.array<...>>>
307-
if (!seqTy || seqTy.hasUnknownShape())
308-
TODO(loc, "Unsupported boxed type in OpenMP reduction");
309-
310-
// load fir.ref<fir.box<...>>
311-
mlir::Value lhsAddr = lhs;
312-
lhs = builder.create<fir::LoadOp>(loc, lhs);
313-
rhs = builder.create<fir::LoadOp>(loc, rhs);
314-
315-
const unsigned rank = seqTy.getDimension();
316-
llvm::SmallVector<mlir::Value> extents;
317-
extents.reserve(rank);
298+
/// Generate a fir::ShapeShift op describing the provided boxed array.
299+
static fir::ShapeShiftOp getShapeShift(fir::FirOpBuilder &builder,
300+
mlir::Location loc, mlir::Value box) {
301+
fir::SequenceType sequenceType = mlir::cast<fir::SequenceType>(
302+
hlfir::getFortranElementOrSequenceType(box.getType()));
303+
const unsigned rank = sequenceType.getDimension();
318304
llvm::SmallVector<mlir::Value> lbAndExtents;
319305
lbAndExtents.reserve(rank * 2);
320306

321-
// Get box lowerbounds and extents:
322307
mlir::Type idxTy = builder.getIndexType();
323308
for (unsigned i = 0; i < rank; ++i) {
324309
// TODO: ideally we want to hoist box reads out of the critical section.
325310
// We could do this by having box dimensions in block arguments like
326311
// OpenACC does
327312
mlir::Value dim = builder.createIntegerConstant(loc, idxTy, i);
328313
auto dimInfo =
329-
builder.create<fir::BoxDimsOp>(loc, idxTy, idxTy, idxTy, lhs, dim);
330-
extents.push_back(dimInfo.getExtent());
314+
builder.create<fir::BoxDimsOp>(loc, idxTy, idxTy, idxTy, box, dim);
331315
lbAndExtents.push_back(dimInfo.getLowerBound());
332316
lbAndExtents.push_back(dimInfo.getExtent());
333317
}
334318

335319
auto shapeShiftTy = fir::ShapeShiftType::get(builder.getContext(), rank);
336320
auto shapeShift =
337321
builder.create<fir::ShapeShiftOp>(loc, shapeShiftTy, lbAndExtents);
322+
return shapeShift;
323+
}
324+
325+
/// Create reduction combiner region for reduction variables which are boxed
326+
/// arrays
327+
static void genBoxCombiner(fir::FirOpBuilder &builder, mlir::Location loc,
328+
ReductionProcessor::ReductionIdentifier redId,
329+
fir::BaseBoxType boxTy, mlir::Value lhs,
330+
mlir::Value rhs) {
331+
fir::SequenceType seqTy =
332+
mlir::dyn_cast_or_null<fir::SequenceType>(boxTy.getEleTy());
333+
// TODO: support allocatable arrays: !fir.box<!fir.heap<!fir.array<...>>>
334+
if (!seqTy || seqTy.hasUnknownShape())
335+
TODO(loc, "Unsupported boxed type in OpenMP reduction");
336+
337+
// load fir.ref<fir.box<...>>
338+
mlir::Value lhsAddr = lhs;
339+
lhs = builder.create<fir::LoadOp>(loc, lhs);
340+
rhs = builder.create<fir::LoadOp>(loc, rhs);
341+
342+
fir::ShapeShiftOp shapeShift = getShapeShift(builder, loc, lhs);
338343

339344
// Iterate over array elements, applying the equivalent scalar reduction:
340345

341346
// A hlfir::elemental here gets inlined with a temporary so create the
342347
// loop nest directly.
343348
// This function already controls all of the code in this region so we
344349
// know this won't miss any opportuinties for clever elemental inlining
345-
hlfir::LoopNest nest =
346-
hlfir::genLoopNest(loc, builder, extents, /*isUnordered=*/true);
350+
hlfir::LoopNest nest = hlfir::genLoopNest(
351+
loc, builder, shapeShift.getExtents(), /*isUnordered=*/true);
347352
builder.setInsertionPointToStart(nest.innerLoop.getBody());
348353
mlir::Type refTy = fir::ReferenceType::get(seqTy.getEleTy());
349354
auto lhsEleAddr = builder.create<fir::ArrayCoorOp>(
@@ -470,7 +475,9 @@ createReductionInitRegion(fir::FirOpBuilder &builder, mlir::Location loc,
470475
if (!mlir::isa<fir::SequenceType>(innerTy))
471476
TODO(loc, "Unsupported boxed type for reduction");
472477
// Create the private copy from the initial fir.box:
473-
hlfir::Entity source = hlfir::Entity{builder.getBlock()->getArgument(0)};
478+
mlir::Value loadedBox =
479+
builder.loadIfRef(loc, builder.getBlock()->getArgument(0));
480+
hlfir::Entity source = hlfir::Entity{loadedBox};
474481

475482
// Allocating on the heap in case the whole reduction is nested inside of a
476483
// loop
@@ -491,7 +498,21 @@ createReductionInitRegion(fir::FirOpBuilder &builder, mlir::Location loc,
491498
}
492499

493500
// Put the temporary inside of a box:
494-
hlfir::Entity box = hlfir::genVariableBox(loc, builder, temp);
501+
// hlfir::genVariableBox doesn't handle non-default lower bounds
502+
mlir::Value box;
503+
fir::ShapeShiftOp shapeShift = getShapeShift(builder, loc, loadedBox);
504+
mlir::Type boxType = loadedBox.getType();
505+
if (mlir::isa<fir::BaseBoxType>(temp.getType()))
506+
// the box created by the declare form createTempFromMold is missing lower
507+
// bounds info
508+
box = builder.create<fir::ReboxOp>(loc, boxType, temp, shapeShift,
509+
/*shift=*/mlir::Value{});
510+
else
511+
box = builder.create<fir::EmboxOp>(
512+
loc, boxType, temp, shapeShift,
513+
/*slice=*/mlir::Value{},
514+
/*typeParams=*/llvm::ArrayRef<mlir::Value>{});
515+
495516
builder.create<hlfir::AssignOp>(loc, initValue, box);
496517
mlir::Value boxAlloca = builder.create<fir::AllocaOp>(loc, ty);
497518
builder.create<fir::StoreOp>(loc, box, boxAlloca);
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
! RUN: bbc -emit-hlfir -fopenmp -o - %s 2>&1 | FileCheck %s
2+
! RUN: %flang_fc1 -emit-hlfir -fopenmp -o - %s 2>&1 | FileCheck %s
3+
4+
program reduce
5+
integer, dimension(2:4, 2) :: i = 0
6+
7+
!$omp parallel reduction(+:i)
8+
i(3, 1) = 3
9+
!$omp end parallel
10+
11+
print *,i
12+
13+
end program
14+
15+
! CHECK-LABEL: omp.declare_reduction @add_reduction_byref_box_3x2xi32 : !fir.ref<!fir.box<!fir.array<3x2xi32>>> init {
16+
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.array<3x2xi32>>>):
17+
! CHECK: %[[VAL_1:.*]] = arith.constant 0 : i32
18+
! CHECK: %[[VAL_2:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.array<3x2xi32>>>
19+
! CHECK: %[[VAL_3:.*]] = arith.constant 3 : index
20+
! CHECK: %[[VAL_4:.*]] = arith.constant 2 : index
21+
! CHECK: %[[VAL_5:.*]] = fir.shape %[[VAL_3]], %[[VAL_4]] : (index, index) -> !fir.shape<2>
22+
! CHECK: %[[VAL_6:.*]] = fir.allocmem !fir.array<3x2xi32> {bindc_name = ".tmp", uniq_name = ""}
23+
! CHECK: %[[VAL_7:.*]] = arith.constant true
24+
! 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>>)
25+
! CHECK: %[[VAL_9:.*]] = arith.constant 0 : index
26+
! CHECK: %[[VAL_10:.*]]:3 = fir.box_dims %[[VAL_2]], %[[VAL_9]] : (!fir.box<!fir.array<3x2xi32>>, index) -> (index, index, index)
27+
! CHECK: %[[VAL_11:.*]] = arith.constant 1 : index
28+
! CHECK: %[[VAL_12:.*]]:3 = fir.box_dims %[[VAL_2]], %[[VAL_11]] : (!fir.box<!fir.array<3x2xi32>>, index) -> (index, index, index)
29+
! 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>
30+
! CHECK: %[[VAL_14:.*]] = fir.embox %[[VAL_8]]#0(%[[VAL_13]]) : (!fir.heap<!fir.array<3x2xi32>>, !fir.shapeshift<2>) -> !fir.box<!fir.array<3x2xi32>>
31+
! CHECK: hlfir.assign %[[VAL_1]] to %[[VAL_14]] : i32, !fir.box<!fir.array<3x2xi32>>
32+
! CHECK: %[[VAL_15:.*]] = fir.alloca !fir.box<!fir.array<3x2xi32>>
33+
! CHECK: fir.store %[[VAL_14]] to %[[VAL_15]] : !fir.ref<!fir.box<!fir.array<3x2xi32>>>
34+
! CHECK: omp.yield(%[[VAL_15]] : !fir.ref<!fir.box<!fir.array<3x2xi32>>>)
35+
! CHECK: } combiner {
36+
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.array<3x2xi32>>>, %[[VAL_1:.*]]: !fir.ref<!fir.box<!fir.array<3x2xi32>>>):
37+
! CHECK: %[[VAL_2:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.array<3x2xi32>>>
38+
! CHECK: %[[VAL_3:.*]] = fir.load %[[VAL_1]] : !fir.ref<!fir.box<!fir.array<3x2xi32>>>
39+
! CHECK: %[[VAL_4:.*]] = arith.constant 0 : index
40+
! CHECK: %[[VAL_5:.*]]:3 = fir.box_dims %[[VAL_2]], %[[VAL_4]] : (!fir.box<!fir.array<3x2xi32>>, index) -> (index, index, index)
41+
! CHECK: %[[VAL_6:.*]] = arith.constant 1 : index
42+
! CHECK: %[[VAL_7:.*]]:3 = fir.box_dims %[[VAL_2]], %[[VAL_6]] : (!fir.box<!fir.array<3x2xi32>>, index) -> (index, index, index)
43+
! CHECK: %[[VAL_8:.*]] = fir.shape_shift %[[VAL_5]]#0, %[[VAL_5]]#1, %[[VAL_7]]#0, %[[VAL_7]]#1 : (index, index, index, index) -> !fir.shapeshift<2>
44+
! CHECK: %[[VAL_9:.*]] = arith.constant 1 : index
45+
! CHECK: fir.do_loop %[[VAL_10:.*]] = %[[VAL_9]] to %[[VAL_7]]#1 step %[[VAL_9]] unordered {
46+
! CHECK: fir.do_loop %[[VAL_11:.*]] = %[[VAL_9]] to %[[VAL_5]]#1 step %[[VAL_9]] unordered {
47+
! CHECK: %[[VAL_12:.*]] = fir.array_coor %[[VAL_2]](%[[VAL_8]]) %[[VAL_11]], %[[VAL_10]] : (!fir.box<!fir.array<3x2xi32>>, !fir.shapeshift<2>, index, index) -> !fir.ref<i32>
48+
! CHECK: %[[VAL_13:.*]] = fir.array_coor %[[VAL_3]](%[[VAL_8]]) %[[VAL_11]], %[[VAL_10]] : (!fir.box<!fir.array<3x2xi32>>, !fir.shapeshift<2>, index, index) -> !fir.ref<i32>
49+
! CHECK: %[[VAL_14:.*]] = fir.load %[[VAL_12]] : !fir.ref<i32>
50+
! CHECK: %[[VAL_15:.*]] = fir.load %[[VAL_13]] : !fir.ref<i32>
51+
! CHECK: %[[VAL_16:.*]] = arith.addi %[[VAL_14]], %[[VAL_15]] : i32
52+
! CHECK: fir.store %[[VAL_16]] to %[[VAL_12]] : !fir.ref<i32>
53+
! CHECK: }
54+
! CHECK: }
55+
! CHECK: omp.yield(%[[VAL_0]] : !fir.ref<!fir.box<!fir.array<3x2xi32>>>)
56+
! CHECK: } cleanup {
57+
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.array<3x2xi32>>>):
58+
! CHECK: %[[VAL_1:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.array<3x2xi32>>>
59+
! CHECK: %[[VAL_2:.*]] = fir.box_addr %[[VAL_1]] : (!fir.box<!fir.array<3x2xi32>>) -> !fir.ref<!fir.array<3x2xi32>>
60+
! CHECK: %[[VAL_3:.*]] = fir.convert %[[VAL_2]] : (!fir.ref<!fir.array<3x2xi32>>) -> i64
61+
! CHECK: %[[VAL_4:.*]] = arith.constant 0 : i64
62+
! CHECK: %[[VAL_5:.*]] = arith.cmpi ne, %[[VAL_3]], %[[VAL_4]] : i64
63+
! CHECK: fir.if %[[VAL_5]] {
64+
! CHECK: %[[VAL_6:.*]] = fir.convert %[[VAL_2]] : (!fir.ref<!fir.array<3x2xi32>>) -> !fir.heap<!fir.array<3x2xi32>>
65+
! CHECK: fir.freemem %[[VAL_6]] : !fir.heap<!fir.array<3x2xi32>>
66+
! CHECK: }
67+
! CHECK: omp.yield
68+
! CHECK: }
69+
70+
! CHECK-LABEL: func.func @_QQmain() attributes {fir.bindc_name = "reduce"} {
71+
! CHECK: %[[VAL_0:.*]] = fir.address_of(@_QFEi) : !fir.ref<!fir.array<3x2xi32>>
72+
! CHECK: %[[VAL_1:.*]] = arith.constant 2 : index
73+
! CHECK: %[[VAL_2:.*]] = arith.constant 3 : index
74+
! CHECK: %[[VAL_3:.*]] = arith.constant 1 : index
75+
! CHECK: %[[VAL_4:.*]] = arith.constant 2 : index
76+
! CHECK: %[[VAL_5:.*]] = fir.shape_shift %[[VAL_1]], %[[VAL_2]], %[[VAL_3]], %[[VAL_4]] : (index, index, index, index) -> !fir.shapeshift<2>
77+
! CHECK: %[[VAL_6:.*]]:2 = hlfir.declare %[[VAL_0]](%[[VAL_5]]) {uniq_name = "_QFEi"} : (!fir.ref<!fir.array<3x2xi32>>, !fir.shapeshift<2>) -> (!fir.box<!fir.array<3x2xi32>>, !fir.ref<!fir.array<3x2xi32>>)
78+
! CHECK: %[[VAL_7:.*]] = fir.alloca !fir.box<!fir.array<3x2xi32>>
79+
! CHECK: fir.store %[[VAL_6]]#0 to %[[VAL_7]] : !fir.ref<!fir.box<!fir.array<3x2xi32>>>
80+
! CHECK: omp.parallel byref reduction(@add_reduction_byref_box_3x2xi32 %[[VAL_7]] -> %[[VAL_8:.*]] : !fir.ref<!fir.box<!fir.array<3x2xi32>>>) {
81+
! CHECK: %[[VAL_9:.*]]:2 = hlfir.declare %[[VAL_8]] {uniq_name = "_QFEi"} : (!fir.ref<!fir.box<!fir.array<3x2xi32>>>) -> (!fir.ref<!fir.box<!fir.array<3x2xi32>>>, !fir.ref<!fir.box<!fir.array<3x2xi32>>>)
82+
! CHECK: %[[VAL_10:.*]] = arith.constant 3 : i32
83+
! CHECK: %[[VAL_11:.*]] = fir.load %[[VAL_9]]#0 : !fir.ref<!fir.box<!fir.array<3x2xi32>>>
84+
! CHECK: %[[VAL_12:.*]] = arith.constant 3 : index
85+
! CHECK: %[[VAL_13:.*]] = arith.constant 1 : index
86+
! CHECK: %[[VAL_14:.*]] = hlfir.designate %[[VAL_11]] (%[[VAL_12]], %[[VAL_13]]) : (!fir.box<!fir.array<3x2xi32>>, index, index) -> !fir.ref<i32>
87+
! CHECK: hlfir.assign %[[VAL_10]] to %[[VAL_14]] : i32, !fir.ref<i32>
88+
! CHECK: omp.terminator
89+
! CHECK: }
90+

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,10 @@ program reduce
2323
! CHECK: %[[TRUE:.*]] = arith.constant true
2424
! CHECK: %[[VAL_6:.*]]:2 = hlfir.declare %[[VAL_1]](%[[VAL_5]]) {uniq_name = ".tmp"} : (!fir.heap<!fir.array<3xi32>>,
2525
!fir.shape<1>) -> (!fir.heap<!fir.array<3xi32>>, !fir.heap<!fir.array<3xi32>>)
26-
! CHECK: %[[VAL_7:.*]] = fir.embox %[[VAL_6]]#0(%[[VAL_5]]) : (!fir.heap<!fir.array<3xi32>>, !fir.shape<1>) -> !fir.box<!fir.array<3xi32>>
26+
! CHECK: %[[C0:.*]] = arith.constant 0 : index
27+
! CHECK: %[[DIMS:.*]]:3 = fir.box_dims %[[VAL_3]], %[[C0]] : (!fir.box<!fir.array<3xi32>>, index) -> (index, index, index)
28+
! CHECK: %[[SHIFT:.*]] = fir.shape_shift %[[DIMS]]#0, %[[DIMS]]#1 : (index, index) -> !fir.shapeshift<1>
29+
! CHECK: %[[VAL_7:.*]] = fir.embox %[[VAL_6]]#0(%[[SHIFT]]) : (!fir.heap<!fir.array<3xi32>>, !fir.shapeshift<1>) -> !fir.box<!fir.array<3xi32>>
2730
! CHECK: hlfir.assign %[[VAL_2]] to %[[VAL_7]] : i32, !fir.box<!fir.array<3xi32>>
2831
! CHECK: %[[VAL_8:.*]] = fir.alloca !fir.box<!fir.array<3xi32>>
2932
! CHECK: fir.store %[[VAL_7]] to %[[VAL_8]] : !fir.ref<!fir.box<!fir.array<3xi32>>>

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,11 @@ program reduce
2121
! CHECK: %[[VAL_5:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1>
2222
! CHECK: %[[VAL_1:.*]] = fir.allocmem !fir.array<3xi32>
2323
! CHECK: %[[TRUE:.*]] = arith.constant true
24-
! CHECK: %[[VAL_6:.*]]:2 = hlfir.declare %[[VAL_1]](%[[VAL_5]]) {uniq_name = ".tmp"} : (!fir.heap<!fir.array<3xi32>>,
25-
!fir.shape<1>) -> (!fir.heap<!fir.array<3xi32>>, !fir.heap<!fir.array<3xi32>>)
26-
! CHECK: %[[VAL_7:.*]] = fir.embox %[[VAL_6]]#0(%[[VAL_5]]) : (!fir.heap<!fir.array<3xi32>>, !fir.shape<1>) -> !fir.box<!fir.array<3xi32>>
24+
! 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>>)
25+
! CHECK: %[[C0:.*]] = arith.constant 0 : index
26+
! CHECK: %[[DIMS:.*]]:3 = fir.box_dims %[[VAL_3]], %[[C0]] : (!fir.box<!fir.array<3xi32>>, index) -> (index, index, index)
27+
! CHECK: %[[SHIFT:.*]] = fir.shape_shift %[[DIMS]]#0, %[[DIMS]]#1 : (index, index) -> !fir.shapeshift<1>
28+
! CHECK: %[[VAL_7:.*]] = fir.embox %[[VAL_6]]#0(%[[SHIFT]]) : (!fir.heap<!fir.array<3xi32>>, !fir.shapeshift<1>) -> !fir.box<!fir.array<3xi32>>
2729
! CHECK: hlfir.assign %[[VAL_2]] to %[[VAL_7]] : i32, !fir.box<!fir.array<3xi32>>
2830
! CHECK: %[[VAL_8:.*]] = fir.alloca !fir.box<!fir.array<3xi32>>
2931
! CHECK: fir.store %[[VAL_7]] to %[[VAL_8]] : !fir.ref<!fir.box<!fir.array<3xi32>>>

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,13 @@
1111
! CHECK: %[[VAL_6:.*]] = fir.allocmem !fir.array<?xi32>, %[[VAL_4]]#1 {bindc_name = ".tmp", uniq_name = ""}
1212
! CHECK: %[[TRUE:.*]] = arith.constant true
1313
! 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: hlfir.assign %[[VAL_1]] to %[[VAL_7]]#0 : i32, !fir.box<!fir.array<?xi32>>
14+
! CHECK: %[[C0:.*]] = arith.constant 0 : index
15+
! CHECK: %[[DIMS:.*]]:3 = fir.box_dims %[[VAL_2]], %[[C0]] : (!fir.box<!fir.array<?xi32>>, index) -> (index, index, index)
16+
! CHECK: %[[SHIFT:.*]] = fir.shape_shift %[[DIMS]]#0, %[[DIMS]]#1 : (index, index) -> !fir.shapeshift<1>
17+
! CHECK: %[[REBOX:.*]] = fir.rebox %[[VAL_7]]#0(%[[SHIFT]]) : (!fir.box<!fir.array<?xi32>>, !fir.shapeshift<1>) -> !fir.box<!fir.array<?xi32>>
18+
! CHECK: hlfir.assign %[[VAL_1]] to %[[REBOX]] : i32, !fir.box<!fir.array<?xi32>>
1519
! CHECK: %[[VAL_8:.*]] = fir.alloca !fir.box<!fir.array<?xi32>>
16-
! CHECK: fir.store %[[VAL_7]]#0 to %[[VAL_8]] : !fir.ref<!fir.box<!fir.array<?xi32>>>
20+
! CHECK: fir.store %[[REBOX]] to %[[VAL_8]] : !fir.ref<!fir.box<!fir.array<?xi32>>>
1721
! CHECK: omp.yield(%[[VAL_8]] : !fir.ref<!fir.box<!fir.array<?xi32>>>)
1822
! CHECK: } combiner {
1923
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.array<?xi32>>>, %[[VAL_1:.*]]: !fir.ref<!fir.box<!fir.array<?xi32>>>):

flang/test/Lower/OpenMP/wsloop-reduction-array-assumed-shape.f90

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,13 @@ subroutine reduce(r)
3232
! CHECK: %[[VAL_6:.*]] = fir.allocmem !fir.array<?xf64>, %[[VAL_4]]#1 {bindc_name = ".tmp", uniq_name = ""}
3333
! CHECK: %[[TRUE:.*]] = arith.constant true
3434
! CHECK: %[[VAL_7:.*]]:2 = hlfir.declare %[[VAL_6]](%[[VAL_5]]) {uniq_name = ".tmp"} : (!fir.heap<!fir.array<?xf64>>, !fir.shape<1>) -> (!fir.box<!fir.array<?xf64>>, !fir.heap<!fir.array<?xf64>>)
35-
! CHECK: hlfir.assign %[[VAL_1]] to %[[VAL_7]]#0 : f64, !fir.box<!fir.array<?xf64>>
35+
! CHECK: %[[C0:.*]] = arith.constant 0 : index
36+
! CHECK: %[[DIMS:.*]]:3 = fir.box_dims %[[VAL_2]], %[[C0]] : (!fir.box<!fir.array<?xf64>>, index) -> (index, index, index)
37+
! CHECK: %[[SHIFT:.*]] = fir.shape_shift %[[DIMS]]#0, %[[DIMS]]#1 : (index, index) -> !fir.shapeshift<1>
38+
! CHECK: %[[REBOX:.*]] = fir.rebox %[[VAL_7]]#0(%[[SHIFT]]) : (!fir.box<!fir.array<?xf64>>, !fir.shapeshift<1>) -> !fir.box<!fir.array<?xf64>
39+
! CHECK: hlfir.assign %[[VAL_1]] to %[[REBOX]] : f64, !fir.box<!fir.array<?xf64>>
3640
! CHECK: %[[VAL_8:.*]] = fir.alloca !fir.box<!fir.array<?xf64>>
37-
! CHECK: fir.store %[[VAL_7]]#0 to %[[VAL_8]] : !fir.ref<!fir.box<!fir.array<?xf64>>>
41+
! CHECK: fir.store %[[REBOX]] to %[[VAL_8]] : !fir.ref<!fir.box<!fir.array<?xf64>>>
3842
! CHECK: omp.yield(%[[VAL_8]] : !fir.ref<!fir.box<!fir.array<?xf64>>>)
3943

4044
! CHECK-LABEL: } combiner {

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,10 @@ program reduce
2323
! CHECK: %[[VAL_1:.*]] = fir.allocmem !fir.array<2xi32> {bindc_name = ".tmp", uniq_name = ""}
2424
! CHECK: %[[TRUE:.*]] = arith.constant true
2525
! CHECK: %[[VAL_6:.*]]:2 = hlfir.declare %[[VAL_1]](%[[VAL_5]]) {uniq_name = ".tmp"} : (!fir.heap<!fir.array<2xi32>>, !fir.shape<1>) -> (!fir.heap<!fir.array<2xi32>>, !fir.heap<!fir.array<2xi32>>)
26-
! CHECK: %[[VAL_7:.*]] = fir.embox %[[VAL_6]]#0(%[[VAL_5]]) : (!fir.heap<!fir.array<2xi32>>, !fir.shape<1>) -> !fir.box<!fir.array<2xi32>>
26+
! CHECK: %[[C0:.*]] = arith.constant 0 : index
27+
! CHECK: %[[DIMS:.*]]:3 = fir.box_dims %[[VAL_3]], %[[C0]] : (!fir.box<!fir.array<2xi32>>, index) -> (index, index, index)
28+
! CHECK: %[[SHIFT:.*]] = fir.shape_shift %[[DIMS]]#0, %[[DIMS]]#1 : (index, index) -> !fir.shapeshift<1>
29+
! CHECK: %[[VAL_7:.*]] = fir.embox %[[VAL_6]]#0(%[[SHIFT]]) : (!fir.heap<!fir.array<2xi32>>, !fir.shapeshift<1>) -> !fir.box<!fir.array<2xi32>>
2730
! CHECK: hlfir.assign %[[VAL_2]] to %[[VAL_7]] : i32, !fir.box<!fir.array<2xi32>>
2831
! CHECK: %[[VAL_8:.*]] = fir.alloca !fir.box<!fir.array<2xi32>>
2932
! CHECK: fir.store %[[VAL_7]] to %[[VAL_8]] : !fir.ref<!fir.box<!fir.array<2xi32>>>

0 commit comments

Comments
 (0)