llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Koakuma (koachan) <details> <summary>Changes</summary> This lets the backend read the `tune-cpu` directive that is emitted by the frontend. No changes are needed for clang as it is already emits it. --- Full diff: https://github.com/llvm/llvm-project/pull/77195.diff 4 Files Affected: - (modified) clang/include/clang/Driver/Options.td (+1-1) - (modified) llvm/lib/Target/Sparc/SparcSubtarget.cpp (+10-5) - (modified) llvm/lib/Target/Sparc/SparcSubtarget.h (+5-2) - (modified) llvm/lib/Target/Sparc/SparcTargetMachine.cpp (+5-2) ``````````diff diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index df12ba8fbcb296..070373b6b88c96 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -5119,7 +5119,7 @@ def module_file_info : Flag<["-"], "module-file-info">, Flags<[]>, HelpText<"Provide information about a particular module file">; def mthumb : Flag<["-"], "mthumb">, Group<m_Group>; def mtune_EQ : Joined<["-"], "mtune=">, Group<m_Group>, - HelpText<"Only supported on AArch64, PowerPC, RISC-V, SystemZ, and X86">; + HelpText<"Only supported on AArch64, PowerPC, RISC-V, SPARC, SystemZ, and X86">; def multi__module : Flag<["-"], "multi_module">; def multiply__defined__unused : Separate<["-"], "multiply_defined_unused">; def multiply__defined : Separate<["-"], "multiply_defined">; diff --git a/llvm/lib/Target/Sparc/SparcSubtarget.cpp b/llvm/lib/Target/Sparc/SparcSubtarget.cpp index 81c2137ea730f8..a5d196c502cd23 100644 --- a/llvm/lib/Target/Sparc/SparcSubtarget.cpp +++ b/llvm/lib/Target/Sparc/SparcSubtarget.cpp @@ -25,15 +25,18 @@ using namespace llvm; void SparcSubtarget::anchor() { } -SparcSubtarget &SparcSubtarget::initializeSubtargetDependencies(StringRef CPU, - StringRef FS) { +SparcSubtarget &SparcSubtarget::initializeSubtargetDependencies( + StringRef CPU, StringRef TuneCPU, StringRef FS) { // Determine default and user specified characteristics std::string CPUName = std::string(CPU); if (CPUName.empty()) CPUName = (Is64Bit) ? "v9" : "v8"; + if (TuneCPU.empty()) + TuneCPU = CPUName; + // Parse features string. - ParseSubtargetFeatures(CPUName, /*TuneCPU*/ CPUName, FS); + ParseSubtargetFeatures(CPUName, TuneCPU, FS); // Popc is a v9-only instruction. if (!IsV9) @@ -43,10 +46,12 @@ SparcSubtarget &SparcSubtarget::initializeSubtargetDependencies(StringRef CPU, } SparcSubtarget::SparcSubtarget(const Triple &TT, const std::string &CPU, + const std::string &TuneCPU, const std::string &FS, const TargetMachine &TM, bool is64Bit) - : SparcGenSubtargetInfo(TT, CPU, /*TuneCPU*/ CPU, FS), TargetTriple(TT), - Is64Bit(is64Bit), InstrInfo(initializeSubtargetDependencies(CPU, FS)), + : SparcGenSubtargetInfo(TT, CPU, TuneCPU, FS), TargetTriple(TT), + Is64Bit(is64Bit), + InstrInfo(initializeSubtargetDependencies(CPU, TuneCPU, FS)), TLInfo(TM, *this), FrameLowering(*this) {} int SparcSubtarget::getAdjustedFrameSize(int frameSize) const { diff --git a/llvm/lib/Target/Sparc/SparcSubtarget.h b/llvm/lib/Target/Sparc/SparcSubtarget.h index 8e3d05d5d7e5df..4363942c0d6248 100644 --- a/llvm/lib/Target/Sparc/SparcSubtarget.h +++ b/llvm/lib/Target/Sparc/SparcSubtarget.h @@ -45,7 +45,8 @@ class SparcSubtarget : public SparcGenSubtargetInfo { public: SparcSubtarget(const Triple &TT, const std::string &CPU, - const std::string &FS, const TargetMachine &TM, bool is64bit); + const std::string &TuneCPU, const std::string &FS, + const TargetMachine &TM, bool is64bit); const SparcInstrInfo *getInstrInfo() const override { return &InstrInfo; } const TargetFrameLowering *getFrameLowering() const override { @@ -70,7 +71,9 @@ class SparcSubtarget : public SparcGenSubtargetInfo { /// ParseSubtargetFeatures - Parses features string setting specified /// subtarget options. Definition of function is auto generated by tblgen. void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS); - SparcSubtarget &initializeSubtargetDependencies(StringRef CPU, StringRef FS); + SparcSubtarget &initializeSubtargetDependencies(StringRef CPU, + StringRef TuneCPU, + StringRef FS); bool is64Bit() const { return Is64Bit; } diff --git a/llvm/lib/Target/Sparc/SparcTargetMachine.cpp b/llvm/lib/Target/Sparc/SparcTargetMachine.cpp index dbc26636e39f1f..ae7bbcecc6c7ba 100644 --- a/llvm/lib/Target/Sparc/SparcTargetMachine.cpp +++ b/llvm/lib/Target/Sparc/SparcTargetMachine.cpp @@ -116,10 +116,13 @@ SparcTargetMachine::~SparcTargetMachine() = default; const SparcSubtarget * SparcTargetMachine::getSubtargetImpl(const Function &F) const { Attribute CPUAttr = F.getFnAttribute("target-cpu"); + Attribute TuneAttr = F.getFnAttribute("tune-cpu"); Attribute FSAttr = F.getFnAttribute("target-features"); std::string CPU = CPUAttr.isValid() ? CPUAttr.getValueAsString().str() : TargetCPU; + std::string TuneCPU = + TuneAttr.isValid() ? TuneAttr.getValueAsString().str() : CPU; std::string FS = FSAttr.isValid() ? FSAttr.getValueAsString().str() : TargetFS; @@ -137,8 +140,8 @@ SparcTargetMachine::getSubtargetImpl(const Function &F) const { // creation will depend on the TM and the code generation flags on the // function that reside in TargetOptions. resetTargetOptions(F); - I = std::make_unique<SparcSubtarget>(TargetTriple, CPU, FS, *this, - this->is64Bit); + I = std::make_unique<SparcSubtarget>(TargetTriple, CPU, TuneCPU, FS, *this, + this->is64Bit); } return I.get(); } `````````` </details> https://github.com/llvm/llvm-project/pull/77195 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits