[flang-commits] [flang] [flang][OpenMP] Support lowering of metadirective (part 1) (PR #193664)
Abid Qadeer via flang-commits
flang-commits at lists.llvm.org
Mon Jun 1 04:08:24 PDT 2026
================
@@ -4638,11 +4586,224 @@ static void genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,
// support the case of threadprivate variable declared in module.
}
+namespace {
+struct TargetOMPContext final : public llvm::omp::OMPContext {
+ TargetOMPContext(mlir::ModuleOp module,
+ llvm::ArrayRef<llvm::omp::TraitProperty> constructTraits)
+ // DeviceNum is set to -1 (unknown) because the
+ // target_device={device_num()} selector is not yet supported. OMPContext
+ // uses DeviceNum > -1 to activate target_device traits from the offload
+ // triple; without a concrete device number those traits are left
+ // inactive.
+ : OMPContext(isDeviceCompilation(module), fir::getTargetTriple(module),
+ getOffloadTargetTriple(module),
+ /*DeviceNum=*/-1),
+ targetFeatures(fir::getTargetFeatures(module)) {
+ for (llvm::omp::TraitProperty trait : constructTraits)
+ addTrait(trait);
+ }
+
+ bool matchesISATrait(llvm::StringRef rawString) const override {
+ if (!targetFeatures || targetFeatures.nullOrEmpty())
+ return false;
+ return targetFeatures.contains(("+" + rawString).str());
+ }
+
+private:
+ static bool isDeviceCompilation(mlir::ModuleOp module) {
+ return llvm::cast<mlir::omp::OffloadModuleInterface>(*module.getOperation())
+ .getIsTargetDevice();
+ }
+
+ static llvm::Triple getOffloadTargetTriple(mlir::ModuleOp module) {
+ auto offloadMod =
+ llvm::cast<mlir::omp::OffloadModuleInterface>(*module.getOperation());
+ auto targetTriples = offloadMod.getTargetTriples();
+
+ if (!targetTriples.empty())
+ if (auto tripleAttr =
+ llvm::dyn_cast<mlir::StringAttr>(targetTriples.front()))
+ return llvm::Triple(tripleAttr.getValue());
+
+ return llvm::Triple();
+ }
+
+ mlir::LLVM::TargetFeaturesAttr targetFeatures;
+};
+
+struct MetadirectiveCandidate {
+ MetadirectiveCandidate(const parser::OmpDirectiveSpecification *spec,
+ llvm::omp::VariantMatchInfo vmi, bool isExplicit)
+ : spec(spec), vmi(vmi), isExplicit(isExplicit) {}
+
+ const parser::OmpDirectiveSpecification *spec = nullptr;
+ llvm::omp::VariantMatchInfo vmi;
+ bool isExplicit = false;
+};
+} // namespace
+
+static void appendConstructTraits(
+ mlir::Operation *op,
+ llvm::SmallVectorImpl<llvm::omp::TraitProperty> &constructTraits) {
+ if (mlir::isa<mlir::omp::SimdOp>(op))
+ constructTraits.push_back(llvm::omp::TraitProperty::construct_simd_simd);
+ if (mlir::isa<mlir::omp::WsloopOp>(op))
+ constructTraits.push_back(llvm::omp::TraitProperty::construct_for_for);
----------------
abidh wrote:
The PR description lists construct={parallel, target, teams} as the supported construct selectors, but this code handles `SimdOp` and `WsloopOp`, covering `construct={simd}` and `construct={for}`. I don't see any tests for those two. I am also not sure how they interact with loop related constructs which are explicitly not handled by this PR. I'd suggest either removing them from this PR with a TODO comment, or adding explicit tests and updating the PR description to list them as supported.
https://github.com/llvm/llvm-project/pull/193664
More information about the flang-commits
mailing list