[flang-commits] [flang] 015834e - [flang][openacc][NFC] Extract device_type parser to its own
Valentin Clement via flang-commits
flang-commits at lists.llvm.org
Fri Jul 8 07:02:11 PDT 2022
Author: Valentin Clement
Date: 2022-07-08T16:02:04+02:00
New Revision: 015834e45581e91deb310d508c38a5e36a220c0d
URL: https://github.com/llvm/llvm-project/commit/015834e45581e91deb310d508c38a5e36a220c0d
DIFF: https://github.com/llvm/llvm-project/commit/015834e45581e91deb310d508c38a5e36a220c0d.diff
LOG: [flang][openacc][NFC] Extract device_type parser to its own
Move the device_type parser to a separate parser AccDeviceTypeExprList. Preparatory work for D106968.
Reviewed By: kiranchandramohan
Differential Revision: https://reviews.llvm.org/D106967
Added:
Modified:
flang/include/flang/Parser/dump-parse-tree.h
flang/include/flang/Parser/parse-tree.h
flang/lib/Lower/OpenACC.cpp
flang/lib/Parser/openacc-parsers.cpp
llvm/include/llvm/Frontend/OpenACC/ACC.td
Removed:
################################################################################
diff --git a/flang/include/flang/Parser/dump-parse-tree.h b/flang/include/flang/Parser/dump-parse-tree.h
index a81125e19e6dc..c97c368a847da 100644
--- a/flang/include/flang/Parser/dump-parse-tree.h
+++ b/flang/include/flang/Parser/dump-parse-tree.h
@@ -92,6 +92,8 @@ class ParseTreeDumper {
NODE(parser, AccSizeExprList)
NODE(parser, AccSelfClause)
NODE(parser, AccStandaloneDirective)
+ NODE(parser, AccDeviceTypeExpr)
+ NODE(parser, AccDeviceTypeExprList)
NODE(parser, AccTileExpr)
NODE(parser, AccTileExprList)
NODE(parser, AccLoopDirective)
diff --git a/flang/include/flang/Parser/parse-tree.h b/flang/include/flang/Parser/parse-tree.h
index e1521f00ff0f8..0c16844749056 100644
--- a/flang/include/flang/Parser/parse-tree.h
+++ b/flang/include/flang/Parser/parse-tree.h
@@ -3915,6 +3915,17 @@ struct AccWaitArgument {
std::tuple<std::optional<ScalarIntExpr>, std::list<ScalarIntExpr>> t;
};
+struct AccDeviceTypeExpr {
+ TUPLE_CLASS_BOILERPLATE(AccDeviceTypeExpr);
+ CharBlock source;
+ std::tuple<std::optional<ScalarIntExpr>> t; // if null then *
+};
+
+struct AccDeviceTypeExprList {
+ WRAPPER_CLASS_BOILERPLATE(
+ AccDeviceTypeExprList, std::list<AccDeviceTypeExpr>);
+};
+
struct AccTileExpr {
TUPLE_CLASS_BOILERPLATE(AccTileExpr);
CharBlock source;
diff --git a/flang/lib/Lower/OpenACC.cpp b/flang/lib/Lower/OpenACC.cpp
index 0eec586ab02a3..e04ced0e548bc 100644
--- a/flang/lib/Lower/OpenACC.cpp
+++ b/flang/lib/Lower/OpenACC.cpp
@@ -151,19 +151,21 @@ static void genDeviceTypeClause(
const Fortran::parser::AccClause::DeviceType *deviceTypeClause,
llvm::SmallVectorImpl<mlir::Value> &operands,
Fortran::lower::StatementContext &stmtCtx) {
- const auto &deviceTypeValue = deviceTypeClause->v;
- if (deviceTypeValue) {
- for (const auto &scalarIntExpr : *deviceTypeValue) {
- mlir::Value expr = fir::getBase(converter.genExprValue(
- *Fortran::semantics::GetExpr(scalarIntExpr), stmtCtx));
- operands.push_back(expr);
+ const Fortran::parser::AccDeviceTypeExprList &deviceTypeExprList =
+ deviceTypeClause->v;
+ for (const auto &deviceTypeExpr : deviceTypeExprList.v) {
+ const auto &expr = std::get<std::optional<Fortran::parser::ScalarIntExpr>>(
+ deviceTypeExpr.t);
+ if (expr) {
+ operands.push_back(fir::getBase(
+ converter.genExprValue(*Fortran::semantics::GetExpr(expr), stmtCtx)));
+ } else {
+ // * was passed as value and will be represented as a special constant.
+ fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder();
+ mlir::Value star = firOpBuilder.createIntegerConstant(
+ converter.getCurrentLocation(), firOpBuilder.getIndexType(), starCst);
+ operands.push_back(star);
}
- } else {
- fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder();
- // * was passed as value and will be represented as a special constant.
- mlir::Value star = firOpBuilder.createIntegerConstant(
- converter.getCurrentLocation(), firOpBuilder.getIndexType(), starCst);
- operands.push_back(star);
}
}
diff --git a/flang/lib/Parser/openacc-parsers.cpp b/flang/lib/Parser/openacc-parsers.cpp
index 61b2b238aa89b..f11f6530951a3 100644
--- a/flang/lib/Parser/openacc-parsers.cpp
+++ b/flang/lib/Parser/openacc-parsers.cpp
@@ -62,12 +62,9 @@ TYPE_PARSER("AUTO" >> construct<AccClause>(construct<AccClause::Auto>()) ||
"DEVICE_RESIDENT" >>
construct<AccClause>(construct<AccClause::DeviceResident>(
parenthesized(Parser<AccObjectList>{}))) ||
- ("DEVICE_TYPE"_tok || "DTYPE"_tok) >>
- construct<AccClause>(construct<AccClause::DeviceType>(parenthesized(
- "*" >> construct<std::optional<std::list<ScalarIntExpr>>>()))) ||
("DEVICE_TYPE"_tok || "DTYPE"_tok) >>
construct<AccClause>(construct<AccClause::DeviceType>(
- parenthesized(maybe(nonemptyList(scalarIntExpr))))) ||
+ parenthesized(Parser<AccDeviceTypeExprList>{}))) ||
"FINALIZE" >> construct<AccClause>(construct<AccClause::Finalize>()) ||
"FIRSTPRIVATE" >> construct<AccClause>(construct<AccClause::Firstprivate>(
parenthesized(Parser<AccObjectList>{}))) ||
@@ -137,6 +134,12 @@ TYPE_PARSER(construct<AccSizeExpr>(scalarIntExpr) ||
construct<AccSizeExpr>("*" >> construct<std::optional<ScalarIntExpr>>()))
TYPE_PARSER(construct<AccSizeExprList>(nonemptyList(Parser<AccSizeExpr>{})))
+TYPE_PARSER(construct<AccDeviceTypeExpr>(scalarIntExpr) ||
+ construct<AccDeviceTypeExpr>(
+ "*" >> construct<std::optional<ScalarIntExpr>>()))
+TYPE_PARSER(
+ construct<AccDeviceTypeExprList>(nonemptyList(Parser<AccDeviceTypeExpr>{})))
+
// tile size is one of:
// * (represented as an empty std::optional<ScalarIntExpr>)
// constant-int-expr
diff --git a/llvm/include/llvm/Frontend/OpenACC/ACC.td b/llvm/include/llvm/Frontend/OpenACC/ACC.td
index 10c282b0217dc..45d8158944549 100644
--- a/llvm/include/llvm/Frontend/OpenACC/ACC.td
+++ b/llvm/include/llvm/Frontend/OpenACC/ACC.td
@@ -128,10 +128,8 @@ def ACCC_DeviceResident : Clause<"device_resident"> {
// 2.4
def ACCC_DeviceType : Clause<"device_type"> {
- let flangClass = "ScalarIntExpr";
+ let flangClass = "AccDeviceTypeExprList";
let defaultValue = "*";
- let isValueOptional = true;
- let isValueList = true;
}
// 2.6.6
More information about the flang-commits
mailing list