Skip to content

Commit d607ed7

Browse files
TIFitisronlieb
authored andcommitted
[MLIR][OpenMP] Add OMP Mapper field to MapInfoOp (llvm#120994)
This patch adds the mapper field to the omp.map.info op. Depends on llvm#117046.
1 parent 43e637c commit d607ed7

File tree

19 files changed

+86
-126
lines changed

19 files changed

+86
-126
lines changed

flang/include/flang/Lower/OpenMP/Utils.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,8 @@ createMapInfoOp(fir::FirOpBuilder &builder, mlir::Location loc,
116116
llvm::ArrayRef<mlir::Value> members,
117117
mlir::ArrayAttr membersIndex, uint64_t mapType,
118118
mlir::omp::VariableCaptureKind mapCaptureType, mlir::Type retTy,
119-
bool partialMap = false);
119+
bool partialMap = false,
120+
mlir::FlatSymbolRefAttr mapperId = mlir::FlatSymbolRefAttr());
120121

121122
void insertChildMapInfoIntoParent(
122123
Fortran::lower::AbstractConverter &converter,

flang/lib/Lower/OpenMP/DataSharingProcessor.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -508,8 +508,6 @@ void DataSharingProcessor::doPrivatize(const semantics::Symbol *sym,
508508

509509
lower::SymbolBox hsb = converter.lookupOneLevelUpSymbol(*sym);
510510
assert(hsb && "Host symbol box not found");
511-
hlfir::Entity entity{hsb.getAddr()};
512-
bool cannotHaveNonDefaultLowerBounds = !entity.mayHaveNonDefaultLowerBounds();
513511

514512
mlir::Location symLoc = hsb.getAddr().getLoc();
515513
std::string privatizerName = sym->name().ToString() + ".privatizer";
@@ -530,6 +528,7 @@ void DataSharingProcessor::doPrivatize(const semantics::Symbol *sym,
530528
// an alloca for a fir.array type there. Get around this by boxing all
531529
// arrays.
532530
if (mlir::isa<fir::SequenceType>(allocType)) {
531+
hlfir::Entity entity{hsb.getAddr()};
533532
entity = genVariableBox(symLoc, firOpBuilder, entity);
534533
privVal = entity.getBase();
535534
allocType = privVal.getType();
@@ -591,7 +590,7 @@ void DataSharingProcessor::doPrivatize(const semantics::Symbol *sym,
591590
result.getDeallocRegion(),
592591
isFirstPrivate ? DeclOperationKind::FirstPrivate
593592
: DeclOperationKind::Private,
594-
sym, cannotHaveNonDefaultLowerBounds);
593+
sym);
595594
// TODO: currently there are false positives from dead uses of the mold
596595
// arg
597596
if (!result.getInitMoldArg().getUses().empty())

flang/lib/Lower/OpenMP/PrivateReductionUtils.cpp

Lines changed: 20 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -122,40 +122,25 @@ static void createCleanupRegion(Fortran::lower::AbstractConverter &converter,
122122
typeError();
123123
}
124124

125-
fir::ShapeShiftOp
126-
Fortran::lower::omp::getShapeShift(fir::FirOpBuilder &builder,
127-
mlir::Location loc, mlir::Value box,
128-
bool cannotHaveNonDefaultLowerBounds) {
125+
fir::ShapeShiftOp Fortran::lower::omp::getShapeShift(fir::FirOpBuilder &builder,
126+
mlir::Location loc,
127+
mlir::Value box) {
129128
fir::SequenceType sequenceType = mlir::cast<fir::SequenceType>(
130129
hlfir::getFortranElementOrSequenceType(box.getType()));
131130
const unsigned rank = sequenceType.getDimension();
132-
133131
llvm::SmallVector<mlir::Value> lbAndExtents;
134132
lbAndExtents.reserve(rank * 2);
135-
mlir::Type idxTy = builder.getIndexType();
136133

137-
if (cannotHaveNonDefaultLowerBounds && !sequenceType.hasDynamicExtents()) {
138-
// We don't need fir::BoxDimsOp if all of the extents are statically known
139-
// and we can assume default lower bounds. This helps avoids reads from the
140-
// mold arg.
141-
mlir::Value one = builder.createIntegerConstant(loc, idxTy, 1);
142-
for (int64_t extent : sequenceType.getShape()) {
143-
assert(extent != sequenceType.getUnknownExtent());
144-
mlir::Value extentVal = builder.createIntegerConstant(loc, idxTy, extent);
145-
lbAndExtents.push_back(one);
146-
lbAndExtents.push_back(extentVal);
147-
}
148-
} else {
149-
for (unsigned i = 0; i < rank; ++i) {
150-
// TODO: ideally we want to hoist box reads out of the critical section.
151-
// We could do this by having box dimensions in block arguments like
152-
// OpenACC does
153-
mlir::Value dim = builder.createIntegerConstant(loc, idxTy, i);
154-
auto dimInfo =
155-
builder.create<fir::BoxDimsOp>(loc, idxTy, idxTy, idxTy, box, dim);
156-
lbAndExtents.push_back(dimInfo.getLowerBound());
157-
lbAndExtents.push_back(dimInfo.getExtent());
158-
}
134+
mlir::Type idxTy = builder.getIndexType();
135+
for (unsigned i = 0; i < rank; ++i) {
136+
// TODO: ideally we want to hoist box reads out of the critical section.
137+
// We could do this by having box dimensions in block arguments like
138+
// OpenACC does
139+
mlir::Value dim = builder.createIntegerConstant(loc, idxTy, i);
140+
auto dimInfo =
141+
builder.create<fir::BoxDimsOp>(loc, idxTy, idxTy, idxTy, box, dim);
142+
lbAndExtents.push_back(dimInfo.getLowerBound());
143+
lbAndExtents.push_back(dimInfo.getExtent());
159144
}
160145

161146
auto shapeShiftTy = fir::ShapeShiftType::get(builder.getContext(), rank);
@@ -263,13 +248,12 @@ class PopulateInitAndCleanupRegionsHelper {
263248
mlir::Type argType, mlir::Value scalarInitValue,
264249
mlir::Value allocatedPrivVarArg, mlir::Value moldArg,
265250
mlir::Block *initBlock, mlir::Region &cleanupRegion,
266-
DeclOperationKind kind, const Fortran::semantics::Symbol *sym,
267-
bool cannotHaveLowerBounds)
251+
DeclOperationKind kind, const Fortran::semantics::Symbol *sym)
268252
: converter{converter}, builder{converter.getFirOpBuilder()}, loc{loc},
269253
argType{argType}, scalarInitValue{scalarInitValue},
270254
allocatedPrivVarArg{allocatedPrivVarArg}, moldArg{moldArg},
271255
initBlock{initBlock}, cleanupRegion{cleanupRegion}, kind{kind},
272-
sym{sym}, cannotHaveNonDefaultLowerBounds{cannotHaveLowerBounds} {
256+
sym{sym} {
273257
valType = fir::unwrapRefType(argType);
274258
}
275259

@@ -311,10 +295,6 @@ class PopulateInitAndCleanupRegionsHelper {
311295
/// Any length parameters which have been fetched for the type
312296
mlir::SmallVector<mlir::Value> lenParams;
313297

314-
/// If the source variable being privatized definitely can't have non-default
315-
/// lower bounds then we don't need to generate code to read them.
316-
bool cannotHaveNonDefaultLowerBounds;
317-
318298
void createYield(mlir::Value ret) {
319299
builder.create<mlir::omp::YieldOp>(loc, ret);
320300
}
@@ -452,8 +432,7 @@ void PopulateInitAndCleanupRegionsHelper::initAndCleanupBoxedArray(
452432
// Special case for (possibly allocatable) arrays of polymorphic types
453433
// e.g. !fir.class<!fir.heap<!fir.array<?x!fir.type<>>>>
454434
if (source.isPolymorphic()) {
455-
fir::ShapeShiftOp shape =
456-
getShapeShift(builder, loc, source, cannotHaveNonDefaultLowerBounds);
435+
fir::ShapeShiftOp shape = getShapeShift(builder, loc, source);
457436
mlir::Type arrayType = source.getElementOrSequenceType();
458437
mlir::Value allocatedArray = builder.create<fir::AllocMemOp>(
459438
loc, arrayType, /*typeparams=*/mlir::ValueRange{}, shape.getExtents());
@@ -501,8 +480,8 @@ void PopulateInitAndCleanupRegionsHelper::initAndCleanupBoxedArray(
501480
// Put the temporary inside of a box:
502481
// hlfir::genVariableBox doesn't handle non-default lower bounds
503482
mlir::Value box;
504-
fir::ShapeShiftOp shapeShift = getShapeShift(builder, loc, getLoadedMoldArg(),
505-
cannotHaveNonDefaultLowerBounds);
483+
fir::ShapeShiftOp shapeShift =
484+
getShapeShift(builder, loc, getLoadedMoldArg());
506485
mlir::Type boxType = getLoadedMoldArg().getType();
507486
if (mlir::isa<fir::BaseBoxType>(temp.getType()))
508487
// the box created by the declare form createTempFromMold is missing
@@ -637,10 +616,10 @@ void Fortran::lower::omp::populateByRefInitAndCleanupRegions(
637616
mlir::Type argType, mlir::Value scalarInitValue, mlir::Block *initBlock,
638617
mlir::Value allocatedPrivVarArg, mlir::Value moldArg,
639618
mlir::Region &cleanupRegion, DeclOperationKind kind,
640-
const Fortran::semantics::Symbol *sym, bool cannotHaveLowerBounds) {
619+
const Fortran::semantics::Symbol *sym) {
641620
PopulateInitAndCleanupRegionsHelper helper(
642621
converter, loc, argType, scalarInitValue, allocatedPrivVarArg, moldArg,
643-
initBlock, cleanupRegion, kind, sym, cannotHaveLowerBounds);
622+
initBlock, cleanupRegion, kind, sym);
644623
helper.populateByRefInitAndCleanupRegions();
645624

646625
// Often we load moldArg to check something (e.g. length parameters, shape)

flang/lib/Lower/OpenMP/PrivateReductionUtils.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,11 @@ void populateByRefInitAndCleanupRegions(
5555
mlir::Value scalarInitValue, mlir::Block *initBlock,
5656
mlir::Value allocatedPrivVarArg, mlir::Value moldArg,
5757
mlir::Region &cleanupRegion, DeclOperationKind kind,
58-
const Fortran::semantics::Symbol *sym = nullptr,
59-
bool cannotHaveNonDefaultLowerBounds = false);
58+
const Fortran::semantics::Symbol *sym = nullptr);
6059

6160
/// Generate a fir::ShapeShift op describing the provided boxed array.
6261
fir::ShapeShiftOp getShapeShift(fir::FirOpBuilder &builder, mlir::Location loc,
63-
mlir::Value box,
64-
bool cannotHaveNonDefaultLowerBounds = false);
62+
mlir::Value box);
6563

6664
} // namespace omp
6765
} // namespace lower

flang/lib/Lower/OpenMP/Utils.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ createMapInfoOp(fir::FirOpBuilder &builder, mlir::Location loc,
130130
llvm::ArrayRef<mlir::Value> members,
131131
mlir::ArrayAttr membersIndex, uint64_t mapType,
132132
mlir::omp::VariableCaptureKind mapCaptureType, mlir::Type retTy,
133-
bool partialMap) {
133+
bool partialMap, mlir::FlatSymbolRefAttr mapperId) {
134134
if (auto boxTy = llvm::dyn_cast<fir::BaseBoxType>(baseAddr.getType())) {
135135
baseAddr = builder.create<fir::BoxAddrOp>(loc, baseAddr);
136136
retTy = baseAddr.getType();
@@ -149,6 +149,7 @@ createMapInfoOp(fir::FirOpBuilder &builder, mlir::Location loc,
149149
mlir::omp::MapInfoOp op = builder.create<mlir::omp::MapInfoOp>(
150150
loc, retTy, baseAddr, varType, varPtrPtr, members, membersIndex, bounds,
151151
builder.getIntegerAttr(builder.getIntegerType(64, false), mapType),
152+
mapperId,
152153
builder.getAttr<mlir::omp::VariableCaptureKindAttr>(mapCaptureType),
153154
builder.getStringAttr(name), builder.getBoolAttr(partialMap));
154155
return op;

flang/lib/Optimizer/OpenMP/DoConcurrentConversion.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ mlir::omp::MapInfoOp createMapInfoOp(
5151
mlir::Value varPtrPtr, std::string name, llvm::ArrayRef<mlir::Value> bounds,
5252
llvm::ArrayRef<mlir::Value> members, mlir::ArrayAttr membersIndex,
5353
uint64_t mapType, mlir::omp::VariableCaptureKind mapCaptureType,
54-
mlir::Type retTy, bool partialMap = false) {
54+
mlir::Type retTy, bool partialMap = false,
55+
mlir::FlatSymbolRefAttr mapperId = mlir::FlatSymbolRefAttr()) {
5556
if (auto boxTy = llvm::dyn_cast<fir::BaseBoxType>(baseAddr.getType())) {
5657
baseAddr = builder.create<fir::BoxAddrOp>(loc, baseAddr);
5758
retTy = baseAddr.getType();
@@ -70,6 +71,7 @@ mlir::omp::MapInfoOp createMapInfoOp(
7071
mlir::omp::MapInfoOp op = builder.create<mlir::omp::MapInfoOp>(
7172
loc, retTy, baseAddr, varType, varPtrPtr, members, membersIndex, bounds,
7273
builder.getIntegerAttr(builder.getIntegerType(64, false), mapType),
74+
mapperId,
7375
builder.getAttr<mlir::omp::VariableCaptureKindAttr>(mapCaptureType),
7476
builder.getStringAttr(name), builder.getBoolAttr(partialMap));
7577

flang/lib/Optimizer/OpenMP/MapInfoFinalization.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ class MapInfoFinalizationPass
184184
/*members=*/mlir::SmallVector<mlir::Value>{},
185185
/*membersIndex=*/mlir::ArrayAttr{}, bounds,
186186
builder.getIntegerAttr(builder.getIntegerType(64, false), mapType),
187+
/*mapperId*/ mlir::FlatSymbolRefAttr(),
187188
builder.getAttr<mlir::omp::VariableCaptureKindAttr>(
188189
mlir::omp::VariableCaptureKind::ByRef),
189190
/*name=*/builder.getStringAttr(""),
@@ -331,7 +332,8 @@ class MapInfoFinalizationPass
331332
builder.getIntegerAttr(
332333
builder.getIntegerType(64, false),
333334
getDescriptorMapType(op.getMapType().value_or(0), target)),
334-
op.getMapCaptureTypeAttr(), op.getNameAttr(),
335+
/*mapperId*/ mlir::FlatSymbolRefAttr(), op.getMapCaptureTypeAttr(),
336+
op.getNameAttr(),
335337
/*partial_map=*/builder.getBoolAttr(false));
336338
op.replaceAllUsesWith(newDescParentMapOp.getResult());
337339
op->erase();
@@ -629,6 +631,7 @@ class MapInfoFinalizationPass
629631
// /*members=*/mlir::ValueRange{},
630632
// /*members_index=*/mlir::ArrayAttr{},
631633
// /*bounds=*/bounds, op.getMapTypeAttr(),
634+
// /*mapperId*/ mlir::FlatSymbolRefAttr(),
632635
// builder.getAttr<mlir::omp::VariableCaptureKindAttr>(
633636
// mlir::omp::VariableCaptureKind::ByRef),
634637
// builder.getStringAttr(op.getNameAttr().strref() + "." +

flang/lib/Optimizer/OpenMP/MapsForPrivatizedSymbols.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ class MapsForPrivatizedSymbolsPass
9191
/*bounds=*/ValueRange{},
9292
builder.getIntegerAttr(builder.getIntegerType(64, /*isSigned=*/false),
9393
mapTypeTo),
94+
/*mapperId*/ mlir::FlatSymbolRefAttr(),
9495
builder.getAttr<omp::VariableCaptureKindAttr>(
9596
omp::VariableCaptureKind::ByRef),
9697
StringAttr(), builder.getBoolAttr(false));

flang/lib/Semantics/check-omp-structure.cpp

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1477,20 +1477,7 @@ void OmpStructureChecker::CheckThreadprivateOrDeclareTargetVar(
14771477
}
14781478
}
14791479
},
1480-
[&](const parser::Name &name) {
1481-
if (name.symbol) {
1482-
if (auto *cb{name.symbol->detailsIf<CommonBlockDetails>()}) {
1483-
for (const auto &obj : cb->objects()) {
1484-
if (FindEquivalenceSet(*obj)) {
1485-
context_.Say(name.source,
1486-
"A variable in a %s directive cannot appear in an EQUIVALENCE statement (variable '%s' from common block '/%s/')"_err_en_US,
1487-
ContextDirectiveAsFortran(), obj->name(),
1488-
name.symbol->name());
1489-
}
1490-
}
1491-
}
1492-
}
1493-
},
1480+
[&](const parser::Name &) {}, // common block
14941481
},
14951482
ompObject.u);
14961483
}

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

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
! Test delayed privatization for arrays.
2-
! XFAIL: *
32
! RUN: split-file %s %t
43

54
! RUN: %flang_fc1 -emit-hlfir -fopenmp -mmlir --openmp-enable-delayed-privatization \
@@ -37,8 +36,7 @@ subroutine delayed_privatization_private_1d(var1, l1, u1)
3736
! ONE_DIM-NEXT: %[[C0:.*]] = arith.constant 0 : index
3837
! ONE_DIM-NEXT: %[[DIMS:.*]]:3 = fir.box_dims %[[PRIV_ARG_VAL]], %[[C0]]
3938
! ONE_DIM-NEXT: %[[SHAPE:.*]] = fir.shape %[[DIMS]]#1
40-
! ONE_DIM-NEXT: %[[ARRAY_ALLOC:.*]] = fir.allocmem !fir.array<?xi32>, %[[DIMS]]#1
41-
! ONE_DIM-NEXT: %[[TRUE:.*]] = arith.constant true
39+
! ONE_DIM-NEXT: %[[ARRAY_ALLOC:.*]] = fir.alloca !fir.array<?xi32>, %[[DIMS]]#1
4240
! ONE_DIM-NEXT: %[[DECL:.*]]:2 = hlfir.declare %[[ARRAY_ALLOC]](%[[SHAPE]])
4341
! ONE_DIM-NEXT: %[[C0_0:.*]] = arith.constant 0
4442
! ONE_DIM-NEXT: %[[DIMS2:.*]]:3 = fir.box_dims %[[PRIV_ARG_VAL]], %[[C0_0]]
@@ -75,8 +73,7 @@ subroutine delayed_privatization_private_2d(var1, l1, u1, l2, u2)
7573
! TWO_DIM-NEXT: %[[C1:.*]] = arith.constant 1 : index
7674
! TWO_DIM-NEXT: %[[DIMS_1:.*]]:3 = fir.box_dims %[[PRIV_ARG_VAL]], %[[C1]]
7775
! TWO_DIM-NEXT: %[[SHAPE:.*]] = fir.shape %[[DIMS_0]]#1, %[[DIMS_1]]#1
78-
! TWO_DIM-NEXT: %[[ARRAY_ALLOC:.*]] = fir.allocmem !fir.array<?x?xi32>, %[[DIMS_0]]#1, %[[DIMS_1]]#1
79-
! 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
8077
! TWO_DIM-NEXT: %[[DECL:.*]]:2 = hlfir.declare %[[ARRAY_ALLOC]](%[[SHAPE]])
8178
! TWO_DIM-NEXT: %[[C0_0:.*]] = arith.constant 0
8279
! TWO_DIM-NEXT: %[[DIMS2_0:.*]]:3 = fir.box_dims %[[PRIV_ARG_VAL]], %[[C0_0]]
@@ -108,14 +105,14 @@ program main
108105
! ONE_DIM_DEFAULT_LB-SAME: @[[PRIVATIZER_SYM:.*]] : [[BOX_TYPE:!fir.box<!fir.array<10xi32>>]] init {
109106

110107
! 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>
109+
! 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]])
116-
! ONE_DIM_DEFAULT_LB-NEXT: %[[ONE:.*]] = arith.constant 1 : index
117-
! ONE_DIM_DEFAULT_LB-NEXT: %[[TEN:.*]] = arith.constant 10 : index
118-
! ONE_DIM_DEFAULT_LB-NEXT: %[[SHAPE_SHIFT:.*]] = fir.shape_shift %[[ONE]], %[[TEN]]
113+
! ONE_DIM_DEFAULT_LB-NEXT: %[[C0_0:.*]] = arith.constant 0
114+
! ONE_DIM_DEFAULT_LB-NEXT: %[[DIMS2:.*]]:3 = fir.box_dims %[[PRIV_ARG_VAL]], %[[C0_0]]
115+
! ONE_DIM_DEFAULT_LB-NEXT: %[[SHAPE_SHIFT:.*]] = fir.shape_shift %[[DIMS2]]#0, %[[DIMS2]]#1
119116
! ONE_DIM_DEFAULT_LB-NEXT: %[[EMBOX:.*]] = fir.embox %[[DECL]]#0(%[[SHAPE_SHIFT]])
120117
! ONE_DIM_DEFAULT_LB-NEXT: fir.store %[[EMBOX]] to %[[PRIV_BOX_ALLOC]]
121118
! ONE_DIM_DEFAULT_LB-NEXT: omp.yield(%[[PRIV_BOX_ALLOC]] : [[TYPE]])

flang/test/Lower/OpenMP/different_vars_lastprivate_barrier.f90

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,28 @@
11
! RUN: %flang_fc1 -fopenmp -mmlir --openmp-enable-delayed-privatization-staging=true -emit-hlfir %s -o - | FileCheck %s
22

3-
subroutine first_and_lastprivate(var)
3+
subroutine first_and_lastprivate
44
integer i
5-
integer, dimension(:) :: var
5+
integer, dimension(3) :: var
66

77
!$omp parallel do lastprivate(i) private(var)
88
do i=1,1
99
end do
1010
!$omp end parallel do
1111
end subroutine
1212

13-
! CHECK: omp.private {type = private} @[[VAR_PRIVATIZER:.*Evar_private_box_Uxi32]] : [[BOX_TYPE:!fir\.box<!fir\.array<\?xi32>>]] init {
13+
! CHECK: omp.private {type = private} @[[VAR_PRIVATIZER:.*Evar_private_box_3xi32]] : [[BOX_TYPE:!fir\.box<!fir\.array<3xi32>>]] init {
1414
! CHECK-NEXT: ^bb0(%[[ORIG_REF:.*]]: {{.*}}, %[[PRIV_REF:.*]]: {{.*}}):
1515
! CHECK: %[[ORIG_VAL:.*]] = fir.load %[[ORIG_REF]]
16-
! CHECK: %[[BOX_DIMS_0:.*]]:3 = fir.box_dims %[[ORIG_VAL]], %{{.*}} : ([[BOX_TYPE]], index) -> (index, index, index)
1716
! CHECK: %[[BOX_DIMS:.*]]:3 = fir.box_dims %[[ORIG_VAL]], %{{.*}} : ([[BOX_TYPE]], index) -> (index, index, index)
1817
! CHECK: %[[SHAPE_SHIFT:.*]] = fir.shape_shift %[[BOX_DIMS]]#0, %[[BOX_DIMS]]#1
19-
! CHECK: %[[EMBOX:.*]] = fir.rebox %{{.*}}(%[[SHAPE_SHIFT]]) : {{.*}} -> [[BOX_TYPE]]
18+
! CHECK: %[[EMBOX:.*]] = fir.embox %{{.*}}(%[[SHAPE_SHIFT]]) : {{.*}} -> [[BOX_TYPE]]
2019
! CHECK: fir.store %[[EMBOX]] to %[[PRIV_REF]]
2120
! CHECK: omp.yield(%[[PRIV_REF]] : !fir.ref<[[BOX_TYPE]]>)
2221
! CHECK: }
2322

2423
! CHECK: omp.private {type = private} @[[I_PRIVATIZER:.*Ei_private_i32]] : i32
2524

26-
! CHECK: func.func @{{.*}}first_and_lastprivate({{.*}})
25+
! CHECK: func.func @{{.*}}first_and_lastprivate()
2726
! CHECK: %[[ORIG_I_DECL:.*]]:2 = hlfir.declare {{.*}} {uniq_name = "{{.*}}Ei"}
2827
! CHECK: omp.parallel {
2928
! CHECK-NOT: omp.barrier

flang/test/Semantics/OpenMP/threadprivate02.f90

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,6 @@ program threadprivate02
77
integer :: arr1(10)
88
common /blk1/ a1
99
real, save :: eq_a, eq_b, eq_c, eq_d
10-
integer :: eq_e, eq_f
11-
equivalence(eq_e, eq_f)
12-
common /blk2/ eq_e
1310

1411
!$omp threadprivate(arr1)
1512

@@ -28,9 +25,6 @@ program threadprivate02
2825
!$omp threadprivate(eq_c)
2926
equivalence(eq_c, eq_d)
3027

31-
!ERROR: A variable in a THREADPRIVATE directive cannot appear in an EQUIVALENCE statement (variable 'eq_e' from common block '/blk2/')
32-
!$omp threadprivate(/blk2/)
33-
3428
contains
3529
subroutine func()
3630
integer :: arr2(10)

0 commit comments

Comments
 (0)