aboutsummaryrefslogtreecommitdiff
path: root/clang/lib
diff options
context:
space:
mode:
authorMatthew Devereau <matthew.devereau@arm.com>2025-05-16 09:39:07 +0100
committerGitHub <noreply@github.com>2025-05-16 09:39:07 +0100
commit22576e2ccec60af6d27d8fd95ad3ca721b914815 (patch)
tree21f98aff874e1c010df39b877cd5b0a71835838b /clang/lib
parentaacebaeab5448b4ef614aa8aca52ca210e451f79 (diff)
downloadllvm-22576e2ccec60af6d27d8fd95ad3ca721b914815.zip
llvm-22576e2ccec60af6d27d8fd95ad3ca721b914815.tar.gz
llvm-22576e2ccec60af6d27d8fd95ad3ca721b914815.tar.bz2
[Clang][AArch64] Add pessimistic vscale_range for sve/sme (#137624)
The "target-features" function attribute is not currently considered when adding vscale_range to a function. When +sve/+sme are pushed onto functions with "#pragma attribute push(+sve/+sme)", the function potentially misses out on optimizations that rely on vscale_range being present.
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/Basic/Targets/AArch64.cpp9
-rw-r--r--clang/lib/Basic/Targets/AArch64.h4
-rw-r--r--clang/lib/Basic/Targets/RISCV.cpp3
-rw-r--r--clang/lib/Basic/Targets/RISCV.h4
-rw-r--r--clang/lib/CodeGen/CodeGenFunction.cpp10
5 files changed, 21 insertions, 9 deletions
diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp
index 3633bab..e1f6c7b 100644
--- a/clang/lib/Basic/Targets/AArch64.cpp
+++ b/clang/lib/Basic/Targets/AArch64.cpp
@@ -794,12 +794,17 @@ AArch64TargetInfo::getTargetBuiltins() const {
std::optional<std::pair<unsigned, unsigned>>
AArch64TargetInfo::getVScaleRange(const LangOptions &LangOpts,
- bool IsArmStreamingFunction) const {
+ bool IsArmStreamingFunction,
+ llvm::StringMap<bool> *FeatureMap) const {
if (LangOpts.VScaleMin || LangOpts.VScaleMax)
return std::pair<unsigned, unsigned>(
LangOpts.VScaleMin ? LangOpts.VScaleMin : 1, LangOpts.VScaleMax);
- if (hasFeature("sve") || (IsArmStreamingFunction && hasFeature("sme")))
+ if (hasFeature("sve") || (FeatureMap && (FeatureMap->lookup("sve"))))
+ return std::pair<unsigned, unsigned>(1, 16);
+
+ if (IsArmStreamingFunction &&
+ (hasFeature("sme") || (FeatureMap && (FeatureMap->lookup("sme")))))
return std::pair<unsigned, unsigned>(1, 16);
return std::nullopt;
diff --git a/clang/lib/Basic/Targets/AArch64.h b/clang/lib/Basic/Targets/AArch64.h
index 2fab88c..6eeac69 100644
--- a/clang/lib/Basic/Targets/AArch64.h
+++ b/clang/lib/Basic/Targets/AArch64.h
@@ -187,8 +187,8 @@ public:
llvm::SmallVector<Builtin::InfosShard> getTargetBuiltins() const override;
std::optional<std::pair<unsigned, unsigned>>
- getVScaleRange(const LangOptions &LangOpts,
- bool IsArmStreamingFunction) const override;
+ getVScaleRange(const LangOptions &LangOpts, bool IsArmStreamingFunction,
+ llvm::StringMap<bool> *FeatureMap = nullptr) const override;
bool doesFeatureAffectCodeGen(StringRef Name) const override;
bool validateCpuSupports(StringRef FeatureStr) const override;
bool hasFeature(StringRef Feature) const override;
diff --git a/clang/lib/Basic/Targets/RISCV.cpp b/clang/lib/Basic/Targets/RISCV.cpp
index 390ef0f..a1a2437 100644
--- a/clang/lib/Basic/Targets/RISCV.cpp
+++ b/clang/lib/Basic/Targets/RISCV.cpp
@@ -332,7 +332,8 @@ bool RISCVTargetInfo::initFeatureMap(
std::optional<std::pair<unsigned, unsigned>>
RISCVTargetInfo::getVScaleRange(const LangOptions &LangOpts,
- bool IsArmStreamingFunction) const {
+ bool IsArmStreamingFunction,
+ llvm::StringMap<bool> *FeatureMap) const {
// RISCV::RVVBitsPerBlock is 64.
unsigned VScaleMin = ISAInfo->getMinVLen() / llvm::RISCV::RVVBitsPerBlock;
diff --git a/clang/lib/Basic/Targets/RISCV.h b/clang/lib/Basic/Targets/RISCV.h
index c26aa19..0b36c9d 100644
--- a/clang/lib/Basic/Targets/RISCV.h
+++ b/clang/lib/Basic/Targets/RISCV.h
@@ -99,8 +99,8 @@ public:
const std::vector<std::string> &FeaturesVec) const override;
std::optional<std::pair<unsigned, unsigned>>
- getVScaleRange(const LangOptions &LangOpts,
- bool IsArmStreamingFunction) const override;
+ getVScaleRange(const LangOptions &LangOpts, bool IsArmStreamingFunction,
+ llvm::StringMap<bool> *FeatureMap = nullptr) const override;
bool hasFeature(StringRef Feature) const override;
diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp
index d773cdd..ac40aab 100644
--- a/clang/lib/CodeGen/CodeGenFunction.cpp
+++ b/clang/lib/CodeGen/CodeGenFunction.cpp
@@ -1115,9 +1115,15 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, QualType RetTy,
Fn->removeFnAttr("zero-call-used-regs");
// Add vscale_range attribute if appropriate.
+ llvm::StringMap<bool> FeatureMap;
+ bool IsArmStreaming = false;
+ if (FD) {
+ getContext().getFunctionFeatureMap(FeatureMap, FD);
+ IsArmStreaming = IsArmStreamingFunction(FD, true);
+ }
std::optional<std::pair<unsigned, unsigned>> VScaleRange =
- getContext().getTargetInfo().getVScaleRange(
- getLangOpts(), FD ? IsArmStreamingFunction(FD, true) : false);
+ getContext().getTargetInfo().getVScaleRange(getLangOpts(), IsArmStreaming,
+ &FeatureMap);
if (VScaleRange) {
CurFn->addFnAttr(llvm::Attribute::getWithVScaleRangeArgs(
getLLVMContext(), VScaleRange->first, VScaleRange->second));