================
@@ -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
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits