diff options
author | Matthew Devereau <matthew.devereau@arm.com> | 2025-05-16 09:39:07 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-05-16 09:39:07 +0100 |
commit | 22576e2ccec60af6d27d8fd95ad3ca721b914815 (patch) | |
tree | 21f98aff874e1c010df39b877cd5b0a71835838b /clang/lib | |
parent | aacebaeab5448b4ef614aa8aca52ca210e451f79 (diff) | |
download | llvm-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.cpp | 9 | ||||
-rw-r--r-- | clang/lib/Basic/Targets/AArch64.h | 4 | ||||
-rw-r--r-- | clang/lib/Basic/Targets/RISCV.cpp | 3 | ||||
-rw-r--r-- | clang/lib/Basic/Targets/RISCV.h | 4 | ||||
-rw-r--r-- | clang/lib/CodeGen/CodeGenFunction.cpp | 10 |
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)); |