[flang-commits] [flang] [MLIR][Flang][OpenMP] Implement lowering simd aligned to MLIR (PR #95198)
Tom Eccles via flang-commits
flang-commits at lists.llvm.org
Wed Jun 12 03:03:43 PDT 2024
================
@@ -999,6 +1000,72 @@ bool ClauseProcessor::processUseDevicePtr(
});
}
+static llvm::StringMap<bool> getTargetFeatures(mlir::ModuleOp module) {
+ llvm::StringMap<bool> featuresMap;
+ llvm::SmallVector<llvm::StringRef> targetFeaturesVec;
+ if (mlir::LLVM::TargetFeaturesAttr features =
+ fir::getTargetFeatures(module)) {
+ llvm::StringRef targetFeaturesStr(features.getFeaturesString());
+ targetFeaturesStr.split(targetFeaturesVec, ",");
+ for (auto &feature : targetFeaturesVec) {
+ if (feature.empty())
+ continue;
+ llvm::StringRef featureKeyString = feature.substr(1);
+ featuresMap[featureKeyString] = (feature[0] == '+');
+ }
+ }
+ return featuresMap;
+}
+
+static void
+addAlignedClause(lower::AbstractConverter &converter,
+ const omp::clause::Aligned &clause,
+ llvm::SmallVectorImpl<mlir::Value> &alignedVars,
+ llvm::SmallVectorImpl<mlir::Attribute> &alignmentAttrs) {
+ using Aligned = omp::clause::Aligned;
+ lower::StatementContext stmtCtx;
+ mlir::IntegerAttr alignmentValueAttr;
+ int64_t alignment = 0;
+ fir::FirOpBuilder &builder = converter.getFirOpBuilder();
+
+ if (auto &alignmentValueParserExpr =
+ std::get<std::optional<Aligned::Alignment>>(clause.t)) {
+ mlir::Value operand = fir::getBase(
+ converter.genExprValue(*alignmentValueParserExpr, stmtCtx));
+ if (mlir::Operation *definingOp = operand.getDefiningOp())
+ if (auto cst = mlir::dyn_cast<mlir::arith::ConstantOp>(definingOp))
+ if (auto intAttr = mlir::dyn_cast<mlir::IntegerAttr>(cst.getValue()))
+ alignment = intAttr.getInt();
----------------
tblah wrote:
Could you use `fir::getIntIfConstant` here?
https://github.com/llvm/llvm-project/pull/95198
More information about the flang-commits
mailing list