[clang] [CIR] Implement function target/tune attrs and FMV metadata. (PR #195813)
via cfe-commits
cfe-commits at lists.llvm.org
Tue May 5 23:18:27 PDT 2026
================
@@ -770,7 +770,46 @@ bool CIRGenModule::getCPUAndFeaturesAttributes(
const auto *tc = fd ? fd->getAttr<TargetClonesAttr>() : nullptr;
bool addedAttr = false;
if (td || tv || sd || tc) {
- assert(!cir::MissingFeatures::opFuncMultiVersioning());
+ llvm::StringMap<bool> featureMap;
+ astContext.getFunctionFeatureMap(featureMap, gd);
+
+ // Now add the target-cpu and target-features to the function.
+ // While we populated the feature map above, we still need to
+ // get and parse the target/target_clones attribute so we can
+ // get the cpu for the function.
+ llvm::StringRef featureStr = td ? td->getFeaturesStr() : llvm::StringRef();
+ if (tc && (getTriple().isOSAIX() || getTriple().isX86()))
+ featureStr = tc->getFeatureStr(gd.getMultiVersionIndex());
+ if (!featureStr.empty()) {
+ clang::ParsedTargetAttr parsedAttr =
+ getTarget().parseTargetAttr(featureStr);
+ if (!parsedAttr.CPU.empty() &&
+ getTarget().isValidCPUName(parsedAttr.CPU)) {
+ targetCPU = parsedAttr.CPU;
+ tuneCPU = ""; // Clear the tune CPU.
+ }
+ if (!parsedAttr.Tune.empty() &&
+ getTarget().isValidCPUName(parsedAttr.Tune))
+ tuneCPU = parsedAttr.Tune;
+ }
+
+ if (sd) {
+ // Apply the given CPU name as the 'tune-cpu' so that the optimizer can
+ // favor this processor.
+ tuneCPU = sd->getCPUName(gd.getMultiVersionIndex())->getName();
----------------
skc7 wrote:
Checked `Sema::checkNonMultiVersionCompatAttributes` (clang/lib/Sema/SemaDecl.cpp) and seems it rejects combining `cpu_specific` with target / target_version / target_clones on the same decl, so when sd is set the only thing, this override is the command-line `-tune-cpu` default that tuneCPU was initialized with at the top of the function. Code logic here follows OGCG in `CodeGenModule.cpp`
https://github.com/llvm/llvm-project/pull/195813
More information about the cfe-commits
mailing list