Skip to content

Commit 76ccb77

Browse files
committed
Separate FMV and Extensions
1 parent ee76f1e commit 76ccb77

File tree

15 files changed

+373
-310
lines changed

15 files changed

+373
-310
lines changed

clang/include/clang/AST/ASTContext.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3194,9 +3194,6 @@ class ASTContext : public RefCountedBase<ASTContext> {
31943194
/// valid feature names.
31953195
ParsedTargetAttr filterFunctionTargetAttrs(const TargetAttr *TD) const;
31963196

3197-
std::vector<std::string>
3198-
filterFunctionTargetVersionAttrs(const TargetVersionAttr *TV) const;
3199-
32003197
void getFunctionFeatureMap(llvm::StringMap<bool> &FeatureMap,
32013198
const FunctionDecl *) const;
32023199
void getFunctionFeatureMap(llvm::StringMap<bool> &FeatureMap,

clang/include/clang/Basic/TargetInfo.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1400,11 +1400,6 @@ class TargetInfo : public TransferrableTargetInfo,
14001400
return true;
14011401
}
14021402

1403-
/// For given feature return dependent ones.
1404-
virtual StringRef getFeatureDependencies(StringRef Feature) const {
1405-
return StringRef();
1406-
}
1407-
14081403
struct BranchProtectionInfo {
14091404
LangOptions::SignReturnAddressScopeKind SignReturnAddr;
14101405
LangOptions::SignReturnAddressKeyKind SignKey;

clang/lib/AST/ASTContext.cpp

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@
8787
#include "llvm/Support/MD5.h"
8888
#include "llvm/Support/MathExtras.h"
8989
#include "llvm/Support/raw_ostream.h"
90+
#include "llvm/TargetParser/AArch64TargetParser.h"
9091
#include "llvm/TargetParser/Triple.h"
9192
#include <algorithm>
9293
#include <cassert>
@@ -13664,16 +13665,23 @@ QualType ASTContext::getCorrespondingSignedFixedPointType(QualType Ty) const {
1366413665
}
1366513666
}
1366613667

13668+
// Given a list of FMV features, add each of their backend features to the list.
13669+
static void
13670+
GetFMVBackendFeaturesFor(const llvm::SmallVector<StringRef, 8> FMVFeatStrings,
13671+
std::vector<std::string>& BackendFeats) {
13672+
for (auto &F : FMVFeatStrings)
13673+
if (auto FMVExt = llvm::AArch64::parseFMVExtension(F))
13674+
for (auto F : FMVExt->getImpliedFeatures())
13675+
BackendFeats.push_back(F.str());
13676+
}
13677+
1366713678
std::vector<std::string> ASTContext::filterFunctionTargetVersionAttrs(
1366813679
const TargetVersionAttr *TV) const {
1366913680
assert(TV != nullptr);
1367013681
llvm::SmallVector<StringRef, 8> Feats;
1367113682
std::vector<std::string> ResFeats;
1367213683
TV->getFeatures(Feats);
13673-
for (auto &Feature : Feats)
13674-
if (Target->validateCpuSupports(Feature.str()))
13675-
// Use '?' to mark features that came from TargetVersion.
13676-
ResFeats.push_back("?" + Feature.str());
13684+
GetFMVBackendFeaturesFor(Feats, ResFeats);
1367713685
return ResFeats;
1367813686
}
1367913687

@@ -13735,13 +13743,11 @@ void ASTContext::getFunctionFeatureMap(llvm::StringMap<bool> &FeatureMap,
1373513743
} else if (const auto *TC = FD->getAttr<TargetClonesAttr>()) {
1373613744
std::vector<std::string> Features;
1373713745
if (Target->getTriple().isAArch64()) {
13738-
// TargetClones for AArch64
1373913746
llvm::SmallVector<StringRef, 8> Feats;
1374013747
TC->getFeatures(Feats, GD.getMultiVersionIndex());
13741-
for (StringRef Feat : Feats)
13742-
if (Target->validateCpuSupports(Feat.str()))
13743-
// Use '?' to mark features that came from AArch64 TargetClones.
13744-
Features.push_back("?" + Feat.str());
13748+
GetFMVBackendFeaturesFor(Feats, Features);
13749+
13750+
// Combine with the features from the Target, not expanded
1374513751
Features.insert(Features.begin(),
1374613752
Target->getTargetOpts().FeaturesAsWritten.begin(),
1374713753
Target->getTargetOpts().FeaturesAsWritten.end());
@@ -13754,11 +13760,14 @@ void ASTContext::getFunctionFeatureMap(llvm::StringMap<bool> &FeatureMap,
1375413760
}
1375513761
Target->initFeatureMap(FeatureMap, getDiagnostics(), TargetCPU, Features);
1375613762
} else if (const auto *TV = FD->getAttr<TargetVersionAttr>()) {
13757-
std::vector<std::string> Feats = filterFunctionTargetVersionAttrs(TV);
13763+
llvm::SmallVector<StringRef, 8> Feats;
13764+
TV->getFeatures(Feats);
13765+
std::vector<std::string> Features;
13766+
GetFMVBackendFeaturesFor(Feats, Features);
1375813767
Feats.insert(Feats.begin(),
1375913768
Target->getTargetOpts().FeaturesAsWritten.begin(),
1376013769
Target->getTargetOpts().FeaturesAsWritten.end());
13761-
Target->initFeatureMap(FeatureMap, getDiagnostics(), TargetCPU, Feats);
13770+
Target->initFeatureMap(FeatureMap, getDiagnostics(), TargetCPU, Features);
1376213771
} else {
1376313772
FeatureMap = Target->getTargetOpts().FeatureMap;
1376413773
}

clang/lib/Basic/Targets/AArch64.cpp

Lines changed: 62 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -659,34 +659,30 @@ AArch64TargetInfo::getVScaleRange(const LangOptions &LangOpts) const {
659659
unsigned AArch64TargetInfo::multiVersionSortPriority(StringRef Name) const {
660660
if (Name == "default")
661661
return 0;
662-
if (auto Ext = llvm::AArch64::parseArchExtension(Name))
663-
return Ext->FmvPriority;
662+
if (auto Ext = llvm::AArch64::parseFMVExtension(Name))
663+
return Ext->Priority;
664664
return 0;
665665
}
666666

667667
unsigned AArch64TargetInfo::multiVersionFeatureCost() const {
668668
// Take the maximum priority as per feature cost, so more features win.
669-
return llvm::AArch64::ExtensionInfo::MaxFMVPriority;
669+
constexpr unsigned MaxFMVPriority = 1000;
670+
return MaxFMVPriority;
670671
}
671672

672673
bool AArch64TargetInfo::doesFeatureAffectCodeGen(StringRef Name) const {
673-
if (auto Ext = llvm::AArch64::parseArchExtension(Name))
674-
return !Ext->DependentFeatures.empty();
674+
// FMV extensions which imply no backend features do not affect codegen.
675+
if (auto Ext = llvm::AArch64::parseFMVExtension(Name))
676+
return !Ext->Features.empty();
675677
return false;
676678
}
677679

678-
StringRef AArch64TargetInfo::getFeatureDependencies(StringRef Name) const {
679-
if (auto Ext = llvm::AArch64::parseArchExtension(Name))
680-
return Ext->DependentFeatures;
681-
return StringRef();
682-
}
683-
684680
bool AArch64TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
685681
// CPU features might be separated by '+', extract them and check
686682
llvm::SmallVector<StringRef, 8> Features;
687683
FeatureStr.split(Features, "+");
688684
for (auto &Feature : Features)
689-
if (!llvm::AArch64::parseArchExtension(Feature.trim()).has_value())
685+
if (!llvm::AArch64::parseFMVExtension(Feature.trim()).has_value())
690686
return false;
691687
return true;
692688
}
@@ -1066,31 +1062,62 @@ bool AArch64TargetInfo::initFeatureMap(
10661062
}
10671063
}
10681064

1069-
// Process target and dependent features. This is done in two loops collecting
1070-
// them into UpdatedFeaturesVec: first to add dependent '+'features, second to
1071-
// add target '+/-'features that can later disable some of features added on
1072-
// the first loop. Function Multi Versioning features begin with '?'.
1073-
for (const auto &Feature : FeaturesVec)
1074-
if (((Feature[0] == '?' || Feature[0] == '+')) &&
1075-
AArch64TargetInfo::doesFeatureAffectCodeGen(Feature.substr(1))) {
1076-
StringRef DepFeatures =
1077-
AArch64TargetInfo::getFeatureDependencies(Feature.substr(1));
1078-
SmallVector<StringRef, 1> AttrFeatures;
1079-
DepFeatures.split(AttrFeatures, ",");
1080-
for (auto F : AttrFeatures)
1081-
UpdatedFeaturesVec.push_back(F.str());
1065+
// Special cases which rely on dependency expansion at this stage
1066+
for(auto F : FeaturesVec) {
1067+
// Crypto is the only one we don't want passed through
1068+
if(F == "+crypto") {
1069+
UpdatedFeaturesVec.emplace_back("+aes");
1070+
UpdatedFeaturesVec.emplace_back("+sha2");
1071+
} else {
1072+
UpdatedFeaturesVec.emplace_back(F);
10821073
}
1083-
for (const auto &Feature : FeaturesVec)
1084-
if (Feature[0] != '?') {
1085-
std::string UpdatedFeature = Feature;
1086-
if (Feature[0] == '+') {
1087-
std::optional<llvm::AArch64::ExtensionInfo> Extension =
1088-
llvm::AArch64::parseArchExtension(Feature.substr(1));
1089-
if (Extension)
1090-
UpdatedFeature = Extension->Feature.str();
1091-
}
1092-
UpdatedFeaturesVec.push_back(UpdatedFeature);
1074+
1075+
if(F == "+sve") {
1076+
UpdatedFeaturesVec.emplace_back("+sve");
1077+
UpdatedFeaturesVec.emplace_back("+fullfp16");
1078+
UpdatedFeaturesVec.emplace_back("+neon");
1079+
UpdatedFeaturesVec.emplace_back("+fp-armv8");
1080+
}
1081+
else if(F == "+sve2") {
1082+
UpdatedFeaturesVec.emplace_back("+sve");
1083+
UpdatedFeaturesVec.emplace_back("+fullfp16");
1084+
}
1085+
else if(F == "+sve2p1") {
1086+
UpdatedFeaturesVec.emplace_back("+sve2");
1087+
UpdatedFeaturesVec.emplace_back("+sve");
1088+
}
1089+
else if(F == "+sve2-aes") {
1090+
UpdatedFeaturesVec.emplace_back("+sve2");
1091+
UpdatedFeaturesVec.emplace_back("+sve");
10931092
}
1093+
else if(F == "+sve2-bitperm") {
1094+
UpdatedFeaturesVec.emplace_back("+sve2");
1095+
UpdatedFeaturesVec.emplace_back("+sve");
1096+
}
1097+
else if(F == "+sve2-sha3") {
1098+
UpdatedFeaturesVec.emplace_back("+sve2");
1099+
UpdatedFeaturesVec.emplace_back("+sve");
1100+
}
1101+
else if(F == "+sve2-sm4") {
1102+
UpdatedFeaturesVec.emplace_back("+sve2");
1103+
UpdatedFeaturesVec.emplace_back("+sve");
1104+
}
1105+
else if(F == "+sme") {
1106+
UpdatedFeaturesVec.emplace_back("+bf16");
1107+
}
1108+
else if(F == "+sme2") {
1109+
UpdatedFeaturesVec.emplace_back("+sme");
1110+
UpdatedFeaturesVec.emplace_back("+bf16");
1111+
}
1112+
else if(F == "+sme-i16i64") {
1113+
UpdatedFeaturesVec.emplace_back("+sme");
1114+
UpdatedFeaturesVec.emplace_back("+bf16");
1115+
}
1116+
else if(F == "+sme2p1") {
1117+
UpdatedFeaturesVec.emplace_back("+sme2");
1118+
UpdatedFeaturesVec.emplace_back("+sme");
1119+
}
1120+
}
10941121

10951122
return TargetInfo::initFeatureMap(Features, Diags, CPU, UpdatedFeaturesVec);
10961123
}

clang/lib/Basic/Targets/AArch64.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,6 @@ class LLVM_LIBRARY_VISIBILITY AArch64TargetInfo : public TargetInfo {
155155
std::optional<std::pair<unsigned, unsigned>>
156156
getVScaleRange(const LangOptions &LangOpts) const override;
157157
bool doesFeatureAffectCodeGen(StringRef Name) const override;
158-
StringRef getFeatureDependencies(StringRef Name) const override;
159158
bool validateCpuSupports(StringRef FeatureStr) const override;
160159
bool hasFeature(StringRef Feature) const override;
161160
void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14176,7 +14176,7 @@ Value *CodeGenFunction::EmitAArch64CpuSupports(const CallExpr *E) {
1417614176
ArgStr.split(Features, "+");
1417714177
for (auto &Feature : Features) {
1417814178
Feature = Feature.trim();
14179-
if (!llvm::AArch64::parseArchExtension(Feature))
14179+
if (!llvm::AArch64::parseFMVExtension(Feature))
1418014180
return Builder.getFalse();
1418114181
if (Feature != "default")
1418214182
Features.push_back(Feature);

clang/lib/CodeGen/Targets/AArch64.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -962,7 +962,7 @@ void AArch64ABIInfo::appendAttributeMangling(StringRef AttrStr,
962962

963963
llvm::SmallDenseSet<StringRef, 8> UniqueFeats;
964964
for (auto &Feat : Features)
965-
if (auto Ext = llvm::AArch64::parseArchExtension(Feat))
965+
if (auto Ext = llvm::AArch64::parseFMVExtension(Feat))
966966
if (UniqueFeats.insert(Ext->Name).second)
967967
Out << 'M' << Ext->Name;
968968
}

0 commit comments

Comments
 (0)