================ @@ -4290,6 +4291,18 @@ class FirConverter : public Fortran::lower::AbstractConverter { assert(blockId == 0 && "invalid blockId"); assert(activeConstructStack.empty() && "invalid construct stack state"); + // Set target_cpu and target_features attributes to be passed through to the + // llvm.func operation during lowering. + const llvm::TargetMachine &targetMachine = bridge.getTargetMachine(); + if (auto targetCPU = targetMachine.getTargetCPU(); !targetCPU.empty()) + func->setAttr("target_cpu", + mlir::StringAttr::get(func.getContext(), targetCPU)); + + if (auto targetFeatures = targetMachine.getTargetFeatureString(); + !targetFeatures.empty()) + func->setAttr("target_features", mlir::LLVM::TargetFeaturesAttr::get( + func.getContext(), targetFeatures)); ---------------- Leporacanthicus wrote:
I _think_ this doesn't set the target info for function declarations (interfaces that are in a different source), which I need. I'm happy to add that as an addition on top. l Are we getting the target CPU and target features for every function? Or just the once? I'm sure it's not a "heavy" operaiton, but seems a bit unnecessary to do repeatedly. Should be the same for ALL functions in a module... https://github.com/llvm/llvm-project/pull/78289 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits