Skip to content

Commit 6dd4d9d

Browse files
committed
[MLIR][OpenMP] Add lowering support for AUTOMAP modifier
Add Automap modifier to the MLIR op definition for the DeclareTarget directive's Enter clause. Also add lowering support in Flang. Automap Ref: OpenMP 6.0 section 7.9.7.
1 parent cba078c commit 6dd4d9d

File tree

10 files changed

+83
-44
lines changed

10 files changed

+83
-44
lines changed

flang/include/flang/Lower/OpenMP.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ struct Variable;
5757
struct OMPDeferredDeclareTargetInfo {
5858
mlir::omp::DeclareTargetCaptureClause declareTargetCaptureClause;
5959
mlir::omp::DeclareTargetDeviceType declareTargetDeviceType;
60+
bool automap = false;
6061
const Fortran::semantics::Symbol &sym;
6162
};
6263

flang/lib/Lower/OpenMP/ClauseProcessor.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1184,7 +1184,8 @@ bool ClauseProcessor::processLink(
11841184
[&](const omp::clause::Link &clause, const parser::CharBlock &) {
11851185
// Case: declare target link(var1, var2)...
11861186
gatherFuncAndVarSyms(
1187-
clause.v, mlir::omp::DeclareTargetCaptureClause::link, result);
1187+
clause.v, mlir::omp::DeclareTargetCaptureClause::link, result,
1188+
/*automap=*/false);
11881189
});
11891190
}
11901191

@@ -1512,7 +1513,8 @@ bool ClauseProcessor::processTo(
15121513
[&](const omp::clause::To &clause, const parser::CharBlock &) {
15131514
// Case: declare target to(func, var1, var2)...
15141515
gatherFuncAndVarSyms(std::get<ObjectList>(clause.t),
1515-
mlir::omp::DeclareTargetCaptureClause::to, result);
1516+
mlir::omp::DeclareTargetCaptureClause::to, result,
1517+
/*automap=*/false);
15161518
});
15171519
}
15181520

@@ -1521,12 +1523,13 @@ bool ClauseProcessor::processEnter(
15211523
return findRepeatableClause<omp::clause::Enter>(
15221524
[&](const omp::clause::Enter &clause, const parser::CharBlock &source) {
15231525
mlir::Location currentLocation = converter.genLocation(source);
1524-
if (std::get<std::optional<omp::clause::Enter::Modifier>>(clause.t))
1525-
TODO(currentLocation, "Declare target enter AUTOMAP modifier");
1526+
bool automap =
1527+
std::get<std::optional<omp::clause::Enter::Modifier>>(clause.t)
1528+
.has_value();
15261529
// Case: declare target enter(func, var1, var2)...
15271530
gatherFuncAndVarSyms(std::get<ObjectList>(clause.t),
15281531
mlir::omp::DeclareTargetCaptureClause::enter,
1529-
result);
1532+
result, automap);
15301533
});
15311534
}
15321535

flang/lib/Lower/OpenMP/OpenMP.cpp

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -773,7 +773,7 @@ static void getDeclareTargetInfo(
773773
ObjectList objects{makeObjects(*objectList, semaCtx)};
774774
// Case: declare target(func, var1, var2)
775775
gatherFuncAndVarSyms(objects, mlir::omp::DeclareTargetCaptureClause::to,
776-
symbolAndClause);
776+
symbolAndClause, /*automap=*/false);
777777
} else if (const auto *clauseList{
778778
parser::Unwrap<parser::OmpClauseList>(spec.u)}) {
779779
List<Clause> clauses = makeClauses(*clauseList, semaCtx);
@@ -814,13 +814,12 @@ static void collectDeferredDeclareTargets(
814814
mlir::ModuleOp mod = converter.getFirOpBuilder().getModule();
815815

816816
for (const DeclareTargetCapturePair &symClause : symbolAndClause) {
817-
mlir::Operation *op = mod.lookupSymbol(
818-
converter.mangleName(std::get<const semantics::Symbol &>(symClause)));
817+
mlir::Operation *op =
818+
mod.lookupSymbol(converter.mangleName(symClause.symbol));
819819

820820
if (!op) {
821-
deferredDeclareTarget.push_back({std::get<0>(symClause),
822-
clauseOps.deviceType,
823-
std::get<1>(symClause)});
821+
deferredDeclareTarget.push_back({symClause.clause, clauseOps.deviceType,
822+
symClause.automap, symClause.symbol});
824823
}
825824
}
826825
}
@@ -839,8 +838,8 @@ getDeclareTargetFunctionDevice(
839838
// directive is a function or subroutine
840839
mlir::ModuleOp mod = converter.getFirOpBuilder().getModule();
841840
for (const DeclareTargetCapturePair &symClause : symbolAndClause) {
842-
mlir::Operation *op = mod.lookupSymbol(
843-
converter.mangleName(std::get<const semantics::Symbol &>(symClause)));
841+
mlir::Operation *op =
842+
mod.lookupSymbol(converter.mangleName(symClause.symbol));
844843

845844
if (mlir::isa_and_nonnull<mlir::func::FuncOp>(op))
846845
return clauseOps.deviceType;
@@ -1057,7 +1056,7 @@ getImplicitMapTypeAndKind(fir::FirOpBuilder &firOpBuilder,
10571056
static void
10581057
markDeclareTarget(mlir::Operation *op, lower::AbstractConverter &converter,
10591058
mlir::omp::DeclareTargetCaptureClause captureClause,
1060-
mlir::omp::DeclareTargetDeviceType deviceType) {
1059+
mlir::omp::DeclareTargetDeviceType deviceType, bool automap) {
10611060
// TODO: Add support for program local variables with declare target applied
10621061
auto declareTargetOp = llvm::dyn_cast<mlir::omp::DeclareTargetInterface>(op);
10631062
if (!declareTargetOp)
@@ -1072,11 +1071,11 @@ markDeclareTarget(mlir::Operation *op, lower::AbstractConverter &converter,
10721071
if (declareTargetOp.isDeclareTarget()) {
10731072
if (declareTargetOp.getDeclareTargetDeviceType() != deviceType)
10741073
declareTargetOp.setDeclareTarget(mlir::omp::DeclareTargetDeviceType::any,
1075-
captureClause);
1074+
captureClause, automap);
10761075
return;
10771076
}
10781077

1079-
declareTargetOp.setDeclareTarget(deviceType, captureClause);
1078+
declareTargetOp.setDeclareTarget(deviceType, captureClause, automap);
10801079
}
10811080

10821081
//===----------------------------------------------------------------------===//
@@ -3536,19 +3535,17 @@ genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,
35363535
clauseOps, symbolAndClause);
35373536

35383537
for (const DeclareTargetCapturePair &symClause : symbolAndClause) {
3539-
mlir::Operation *op = mod.lookupSymbol(
3540-
converter.mangleName(std::get<const semantics::Symbol &>(symClause)));
3538+
mlir::Operation *op =
3539+
mod.lookupSymbol(converter.mangleName(symClause.symbol));
35413540

35423541
// Some symbols are deferred until later in the module, these are handled
35433542
// upon finalization of the module for OpenMP inside of Bridge, so we simply
35443543
// skip for now.
35453544
if (!op)
35463545
continue;
35473546

3548-
markDeclareTarget(
3549-
op, converter,
3550-
std::get<mlir::omp::DeclareTargetCaptureClause>(symClause),
3551-
clauseOps.deviceType);
3547+
markDeclareTarget(op, converter, symClause.clause, clauseOps.deviceType,
3548+
symClause.automap);
35523549
}
35533550
}
35543551

@@ -4145,7 +4142,7 @@ bool Fortran::lower::markOpenMPDeferredDeclareTargetFunctions(
41454142
deviceCodeFound = true;
41464143

41474144
markDeclareTarget(op, converter, declTar.declareTargetCaptureClause,
4148-
devType);
4145+
devType, declTar.automap);
41494146
}
41504147

41514148
return deviceCodeFound;

flang/lib/Lower/OpenMP/Utils.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,10 @@ getIterationVariableSymbol(const lower::pft::Evaluation &eval) {
102102

103103
void gatherFuncAndVarSyms(
104104
const ObjectList &objects, mlir::omp::DeclareTargetCaptureClause clause,
105-
llvm::SmallVectorImpl<DeclareTargetCapturePair> &symbolAndClause) {
105+
llvm::SmallVectorImpl<DeclareTargetCapturePair> &symbolAndClause,
106+
bool automap) {
106107
for (const Object &object : objects)
107-
symbolAndClause.emplace_back(clause, *object.sym());
108+
symbolAndClause.emplace_back(clause, *object.sym(), automap);
108109
}
109110

110111
mlir::omp::MapInfoOp

flang/lib/Lower/OpenMP/Utils.h

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,15 @@ class AbstractConverter;
4242

4343
namespace omp {
4444

45-
using DeclareTargetCapturePair =
46-
std::pair<mlir::omp::DeclareTargetCaptureClause, const semantics::Symbol &>;
45+
struct DeclareTargetCapturePair {
46+
mlir::omp::DeclareTargetCaptureClause clause;
47+
bool automap = false;
48+
const semantics::Symbol &symbol;
49+
50+
DeclareTargetCapturePair(mlir::omp::DeclareTargetCaptureClause c,
51+
const semantics::Symbol &s, bool a = false)
52+
: clause(c), automap(a), symbol(s) {}
53+
};
4754

4855
// A small helper structure for keeping track of a component members MapInfoOp
4956
// and index data when lowering OpenMP map clauses. Keeps track of the
@@ -150,7 +157,8 @@ getIterationVariableSymbol(const lower::pft::Evaluation &eval);
150157

151158
void gatherFuncAndVarSyms(
152159
const ObjectList &objects, mlir::omp::DeclareTargetCaptureClause clause,
153-
llvm::SmallVectorImpl<DeclareTargetCapturePair> &symbolAndClause);
160+
llvm::SmallVectorImpl<DeclareTargetCapturePair> &symbolAndClause,
161+
bool automap = false);
154162

155163
int64_t getCollapseValue(const List<Clause> &clauses);
156164

flang/lib/Optimizer/OpenMP/FunctionFiltering.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,9 @@ class FunctionFilteringPass
9595
return WalkResult::skip();
9696
}
9797
if (declareTargetOp)
98-
declareTargetOp.setDeclareTarget(declareType,
99-
omp::DeclareTargetCaptureClause::to);
98+
declareTargetOp.setDeclareTarget(
99+
declareType, omp::DeclareTargetCaptureClause::to,
100+
declareTargetOp.getDeclareTargetAutomap());
100101
}
101102
return WalkResult::advance();
102103
});

flang/lib/Optimizer/OpenMP/MarkDeclareTarget.cpp

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class MarkDeclareTargetPass
3333

3434
void markNestedFuncs(mlir::omp::DeclareTargetDeviceType parentDevTy,
3535
mlir::omp::DeclareTargetCaptureClause parentCapClause,
36-
mlir::Operation *currOp,
36+
bool parentAutomap, mlir::Operation *currOp,
3737
llvm::SmallPtrSet<mlir::Operation *, 16> visited) {
3838
if (visited.contains(currOp))
3939
return;
@@ -57,13 +57,16 @@ class MarkDeclareTargetPass
5757
currentDt != mlir::omp::DeclareTargetDeviceType::any) {
5858
current.setDeclareTarget(
5959
mlir::omp::DeclareTargetDeviceType::any,
60-
current.getDeclareTargetCaptureClause());
60+
current.getDeclareTargetCaptureClause(),
61+
current.getDeclareTargetAutomap());
6162
}
6263
} else {
63-
current.setDeclareTarget(parentDevTy, parentCapClause);
64+
current.setDeclareTarget(parentDevTy, parentCapClause,
65+
parentAutomap);
6466
}
6567

66-
markNestedFuncs(parentDevTy, parentCapClause, currFOp, visited);
68+
markNestedFuncs(parentDevTy, parentCapClause, parentAutomap,
69+
currFOp, visited);
6770
}
6871
}
6972
}
@@ -81,7 +84,8 @@ class MarkDeclareTargetPass
8184
llvm::SmallPtrSet<mlir::Operation *, 16> visited;
8285
markNestedFuncs(declareTargetOp.getDeclareTargetDeviceType(),
8386
declareTargetOp.getDeclareTargetCaptureClause(),
84-
functionOp, visited);
87+
declareTargetOp.getDeclareTargetAutomap(), functionOp,
88+
visited);
8589
}
8690
}
8791

@@ -92,9 +96,10 @@ class MarkDeclareTargetPass
9296
// the contents of the device clause
9397
getOperation()->walk([&](mlir::omp::TargetOp tarOp) {
9498
llvm::SmallPtrSet<mlir::Operation *, 16> visited;
95-
markNestedFuncs(mlir::omp::DeclareTargetDeviceType::nohost,
96-
mlir::omp::DeclareTargetCaptureClause::to, tarOp,
97-
visited);
99+
markNestedFuncs(
100+
/*parentDevTy=*/mlir::omp::DeclareTargetDeviceType::nohost,
101+
/*parentCapClause=*/mlir::omp::DeclareTargetCaptureClause::to,
102+
/*parentAutomap=*/false, tarOp, visited);
98103
});
99104
}
100105
};
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
!RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=60 %s -o - | FileCheck %s
2+
3+
program automap
4+
integer :: x
5+
!$omp declare target enter(automap: x)
6+
end program
7+
8+
!CHECK: fir.global @x {omp.declare_target = #omp.declaretarget<device_type = (any), capture_clause = (enter), automap = true>} : i32

mlir/include/mlir/Dialect/OpenMP/OpenMPAttrDefs.td

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,10 @@ def AtomicControlAttr : OpenMP_Attr<"AtomicControl", "atomic_control"> {
4242
//===----------------------------------------------------------------------===//
4343

4444
def DeclareTargetAttr : OpenMP_Attr<"DeclareTarget", "declaretarget"> {
45-
let parameters = (ins
46-
OptionalParameter<"DeclareTargetDeviceTypeAttr">:$device_type,
47-
OptionalParameter<"DeclareTargetCaptureClauseAttr">:$capture_clause
48-
);
45+
let parameters =
46+
(ins OptionalParameter<"DeclareTargetDeviceTypeAttr">:$device_type,
47+
OptionalParameter<"DeclareTargetCaptureClauseAttr">:$capture_clause,
48+
OptionalParameter<"BoolAttr">:$automap);
4949

5050
let assemblyFormat = "`<` struct(params) `>`";
5151
}

mlir/include/mlir/Dialect/OpenMP/OpenMPOpsInterfaces.td

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -329,14 +329,16 @@ def DeclareTargetInterface : OpInterface<"DeclareTargetInterface"> {
329329
/*retTy=*/"void",
330330
/*methodName=*/"setDeclareTarget",
331331
(ins "mlir::omp::DeclareTargetDeviceType":$deviceType,
332-
"mlir::omp::DeclareTargetCaptureClause":$captureClause), [{}], [{
332+
"mlir::omp::DeclareTargetCaptureClause":$captureClause),
333+
"bool":$automap), [{}], [{
333334
$_op->setAttr("omp.declare_target",
334335
mlir::omp::DeclareTargetAttr::get(
335336
$_op->getContext(),
336337
mlir::omp::DeclareTargetDeviceTypeAttr::get(
337338
$_op->getContext(), deviceType),
338339
mlir::omp::DeclareTargetCaptureClauseAttr::get(
339-
$_op->getContext(), captureClause)));
340+
$_op->getContext(), captureClause),
341+
mlir::BoolAttr::get($_op->getContext(), automap)));
340342
}]>,
341343
InterfaceMethod<
342344
/*description=*/[{
@@ -374,6 +376,19 @@ def DeclareTargetInterface : OpInterface<"DeclareTargetInterface"> {
374376
if (auto dAttr = llvm::dyn_cast_or_null<mlir::omp::DeclareTargetAttr>(dTar))
375377
return dAttr.getCaptureClause().getValue();
376378
return {};
379+
}]>,
380+
InterfaceMethod<
381+
/*description=*/[{
382+
Return true if the DeclareTarget attribute has the AUTOMAP modifier.
383+
}],
384+
/*retTy=*/"bool",
385+
/*methodName=*/"getDeclareTargetAutomap",
386+
(ins), [{}], [{
387+
if (mlir::Attribute dTar = $_op->getAttr("omp.declare_target"))
388+
if (auto dAttr = llvm::dyn_cast_or_null<mlir::omp::DeclareTargetAttr>(dTar))
389+
if (auto autoVal = dAttr.getAutomap())
390+
return autoVal.getValue();
391+
return false;
377392
}]>
378393
];
379394
}

0 commit comments

Comments
 (0)