Skip to content

Commit e5e3e4b

Browse files
authored
[OpenACC] Add firstprivate recipe helper methods to ACC dialect (#153604)
Like we did for the 'private' clause, this adds an easier to use helper function to add the 'firstprivate' clause + recipe to the Parallel and Serial ops.
1 parent aa4805a commit e5e3e4b

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1536,6 +1536,10 @@ def OpenACC_ParallelOp : OpenACC_Op<"parallel",
15361536
/// Adds a private clause variable to this operation, including its recipe.
15371537
void addPrivatization(MLIRContext *, mlir::acc::PrivateOp op,
15381538
mlir::acc::PrivateRecipeOp recipe);
1539+
/// Adds a firstprivate clause variable to this operation, including its
1540+
/// recipe.
1541+
void addFirstPrivatization(MLIRContext *, mlir::acc::FirstprivateOp op,
1542+
mlir::acc::FirstprivateRecipeOp recipe);
15391543
}];
15401544

15411545
let assemblyFormat = [{
@@ -1681,6 +1685,10 @@ def OpenACC_SerialOp : OpenACC_Op<"serial",
16811685
/// Adds a private clause variable to this operation, including its recipe.
16821686
void addPrivatization(MLIRContext *, mlir::acc::PrivateOp op,
16831687
mlir::acc::PrivateRecipeOp recipe);
1688+
/// Adds a firstprivate clause variable to this operation, including its
1689+
/// recipe.
1690+
void addFirstPrivatization(MLIRContext *, mlir::acc::FirstprivateOp op,
1691+
mlir::acc::FirstprivateRecipeOp recipe);
16841692
}];
16851693

16861694
let assemblyFormat = [{

mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1390,6 +1390,20 @@ void acc::ParallelOp::addPrivatization(MLIRContext *context,
13901390
setPrivatizationRecipesAttr(mlir::ArrayAttr::get(context, recipes));
13911391
}
13921392

1393+
void acc::ParallelOp::addFirstPrivatization(
1394+
MLIRContext *context, mlir::acc::FirstprivateOp op,
1395+
mlir::acc::FirstprivateRecipeOp recipe) {
1396+
getFirstprivateOperandsMutable().append(op.getResult());
1397+
1398+
llvm::SmallVector<mlir::Attribute> recipes;
1399+
1400+
if (getFirstprivatizationRecipesAttr())
1401+
llvm::copy(getFirstprivatizationRecipesAttr(), std::back_inserter(recipes));
1402+
1403+
recipes.push_back(
1404+
mlir::SymbolRefAttr::get(context, recipe.getSymName().str()));
1405+
setFirstprivatizationRecipesAttr(mlir::ArrayAttr::get(context, recipes));
1406+
}
13931407
static ParseResult parseNumGangs(
13941408
mlir::OpAsmParser &parser,
13951409
llvm::SmallVectorImpl<mlir::OpAsmParser::UnresolvedOperand> &operands,
@@ -2041,6 +2055,21 @@ void acc::SerialOp::addPrivatization(MLIRContext *context,
20412055
setPrivatizationRecipesAttr(mlir::ArrayAttr::get(context, recipes));
20422056
}
20432057

2058+
void acc::SerialOp::addFirstPrivatization(
2059+
MLIRContext *context, mlir::acc::FirstprivateOp op,
2060+
mlir::acc::FirstprivateRecipeOp recipe) {
2061+
getFirstprivateOperandsMutable().append(op.getResult());
2062+
2063+
llvm::SmallVector<mlir::Attribute> recipes;
2064+
2065+
if (getFirstprivatizationRecipesAttr())
2066+
llvm::copy(getFirstprivatizationRecipesAttr(), std::back_inserter(recipes));
2067+
2068+
recipes.push_back(
2069+
mlir::SymbolRefAttr::get(context, recipe.getSymName().str()));
2070+
setFirstprivatizationRecipesAttr(mlir::ArrayAttr::get(context, recipes));
2071+
}
2072+
20442073
//===----------------------------------------------------------------------===//
20452074
// KernelsOp
20462075
//===----------------------------------------------------------------------===//

0 commit comments

Comments
 (0)