[clang] [CIR] Emit target-cpu, target-features, and tune-cpu attrs on cir.func (PR #193458)
Bruno Cardoso Lopes via cfe-commits
cfe-commits at lists.llvm.org
Mon Apr 27 17:12:40 PDT 2026
================
@@ -698,6 +699,78 @@ void CIRGenModule::setCommonAttributes(GlobalDecl gd, mlir::Operation *gv) {
}
}
+/// Get the feature delta from the default feature map for the given target CPU.
+static std::vector<std::string>
+getFeatureDeltaFromDefault(const CIRGenModule &cgm, llvm::StringRef targetCPU,
+ llvm::StringMap<bool> &featureMap) {
+ llvm::StringMap<bool> defaultFeatureMap;
+ cgm.getTarget().initFeatureMap(
+ defaultFeatureMap, cgm.getASTContext().getDiagnostics(), targetCPU, {});
+
+ std::vector<std::string> delta;
+ for (const auto &[k, v] : featureMap) {
+ auto defaultIt = defaultFeatureMap.find(k);
+ if (defaultIt == defaultFeatureMap.end() || defaultIt->getValue() != v)
+ delta.push_back((v ? "+" : "-") + k.str());
+ }
+
+ return delta;
+}
+
+bool CIRGenModule::getCPUAndFeaturesAttributes(
+ GlobalDecl gd, llvm::StringMap<std::string> &attrs,
+ bool setTargetFeatures) {
+ // Add target-cpu and target-features attributes to functions. If
+ // we have a decl for the function and it has a target attribute then
+ // parse that and add it to the feature set.
+ llvm::StringRef targetCPU = getTarget().getTargetOpts().CPU;
+ llvm::StringRef tuneCPU = getTarget().getTargetOpts().TuneCPU;
+ std::vector<std::string> features;
+ const auto *fd = dyn_cast_or_null<FunctionDecl>(gd.getDecl());
+ fd = fd ? fd->getMostRecentDecl() : fd;
----------------
bcardosolopes wrote:
Could use a one-liner explaining when `fd` is null here (i.e. globals without a FunctionDecl) — the AMDGPU branch later handles that case via `initFeatureMap`, but it's not obvious from reading top-down.
https://github.com/llvm/llvm-project/pull/193458
More information about the cfe-commits
mailing list