From 0cccf724af3a0e237ae06c7d4e21ac0321e50e9b Mon Sep 17 00:00:00 2001 From: rfwang07 Date: Tue, 22 Apr 2025 19:46:53 +0800 Subject: [PATCH] Add Om for Kunpeng Opts --- 0012-Add-Om-for-Kunpeng-Opts.patch | 380 +++++++++++++++++++++++++++++ llvm-bolt.spec | 9 +- 2 files changed, 388 insertions(+), 1 deletion(-) create mode 100644 0012-Add-Om-for-Kunpeng-Opts.patch diff --git a/0012-Add-Om-for-Kunpeng-Opts.patch b/0012-Add-Om-for-Kunpeng-Opts.patch new file mode 100644 index 0000000..0f8a8ee --- /dev/null +++ b/0012-Add-Om-for-Kunpeng-Opts.patch @@ -0,0 +1,380 @@ +From f4757a1bff16b44a329e3f70973ca6c623518291 Mon Sep 17 00:00:00 2001 +From: rfwang07 +Date: Tue, 22 Apr 2025 19:33:52 +0800 +Subject: [PATCH] Add Om for Kunpeng Opts + +--- + bolt/include/bolt/Passes/BinaryPasses.h | 8 +++ + bolt/include/bolt/Passes/SplitFunctions.h | 19 +++++++ + bolt/lib/Core/BinaryFunctionProfile.cpp | 6 +-- + bolt/lib/Passes/BinaryPasses.cpp | 10 +--- + bolt/lib/Passes/IndirectCallPromotion.cpp | 2 +- + bolt/lib/Passes/Inliner.cpp | 2 +- + bolt/lib/Passes/MCF.cpp | 2 +- + bolt/lib/Passes/ReorderFunctions.cpp | 2 +- + bolt/lib/Passes/SplitFunctions.cpp | 23 +-------- + bolt/lib/Passes/VeneerElimination.cpp | 2 +- + bolt/lib/Rewrite/BinaryPassManager.cpp | 6 +-- + bolt/lib/Rewrite/RewriteInstance.cpp | 2 +- + bolt/tools/driver/llvm-bolt.cpp | 61 +++++++++++++++++++++++ + 13 files changed, 104 insertions(+), 41 deletions(-) + +diff --git a/bolt/include/bolt/Passes/BinaryPasses.h b/bolt/include/bolt/Passes/BinaryPasses.h +index dace07e..5a2fe3b 100644 +--- a/bolt/include/bolt/Passes/BinaryPasses.h ++++ b/bolt/include/bolt/Passes/BinaryPasses.h +@@ -23,6 +23,14 @@ + #include + #include + ++namespace opts { ++enum SctcModes : char { ++ SctcAlways, ++ SctcPreserveDirection, ++ SctcHeuristic ++}; ++} ++ + namespace llvm { + namespace bolt { + +diff --git a/bolt/include/bolt/Passes/SplitFunctions.h b/bolt/include/bolt/Passes/SplitFunctions.h +index 4058f33..a8c3a14 100644 +--- a/bolt/include/bolt/Passes/SplitFunctions.h ++++ b/bolt/include/bolt/Passes/SplitFunctions.h +@@ -15,6 +15,25 @@ + #include "llvm/Support/CommandLine.h" + #include + ++using namespace llvm; ++ ++class DeprecatedSplitFunctionOptionParser : public cl::parser { ++public: ++ explicit DeprecatedSplitFunctionOptionParser(cl::Option &O) ++ : cl::parser(O) {} ++ ++ bool parse(cl::Option &O, StringRef ArgName, StringRef Arg, bool &Value) { ++ if (Arg == "2" || Arg == "3") { ++ Value = true; ++ errs() << formatv("BOLT-WARNING: specifying non-boolean value \"{0}\" " ++ "for option -{1} is deprecated\n", ++ Arg, ArgName); ++ return false; ++ } ++ return cl::parser::parse(O, ArgName, Arg, Value); ++ } ++}; ++ + namespace llvm { + namespace bolt { + +diff --git a/bolt/lib/Core/BinaryFunctionProfile.cpp b/bolt/lib/Core/BinaryFunctionProfile.cpp +index 0d705cd..c062f8d 100644 +--- a/bolt/lib/Core/BinaryFunctionProfile.cpp ++++ b/bolt/lib/Core/BinaryFunctionProfile.cpp +@@ -44,17 +44,17 @@ static cl::alias ICPAlias("icp", + + extern cl::opt JumpTables; + +-static cl::opt FixFuncCounts( ++cl::opt FixFuncCounts( + "fix-func-counts", + cl::desc("adjust function counts based on basic blocks execution count"), + cl::Hidden, cl::cat(BoltOptCategory)); + +-static cl::opt FixBlockCounts( ++cl::opt FixBlockCounts( + "fix-block-counts", + cl::desc("adjust block counts based on outgoing branch counts"), + cl::init(true), cl::Hidden, cl::cat(BoltOptCategory)); + +-static cl::opt ++cl::opt + InferFallThroughs("infer-fall-throughs", + cl::desc("infer execution count for fall-through blocks"), + cl::Hidden, cl::cat(BoltOptCategory)); +diff --git a/bolt/lib/Passes/BinaryPasses.cpp b/bolt/lib/Passes/BinaryPasses.cpp +index a674fb4..1db25ff 100644 +--- a/bolt/lib/Passes/BinaryPasses.cpp ++++ b/bolt/lib/Passes/BinaryPasses.cpp +@@ -88,7 +88,7 @@ static cl::opt MinBranchClusters( + "branches"), + cl::Hidden, cl::cat(BoltOptCategory)); + +-static cl::list Peepholes( ++cl::list Peepholes( + "peepholes", cl::CommaSeparated, cl::desc("enable peephole optimizations"), + cl::value_desc("opt1,opt2,opt3,..."), + cl::values(clEnumValN(Peepholes::PEEP_NONE, "none", "disable peepholes"), +@@ -176,13 +176,7 @@ static cl::opt + cl::desc("print the list of functions with stale profile"), + cl::Hidden, cl::cat(BoltOptCategory)); + +-enum SctcModes : char { +- SctcAlways, +- SctcPreserveDirection, +- SctcHeuristic +-}; +- +-static cl::opt ++cl::opt + SctcMode("sctc-mode", + cl::desc("mode for simplify conditional tail calls"), + cl::init(SctcAlways), +diff --git a/bolt/lib/Passes/IndirectCallPromotion.cpp b/bolt/lib/Passes/IndirectCallPromotion.cpp +index ea80194..4ff6837 100644 +--- a/bolt/lib/Passes/IndirectCallPromotion.cpp ++++ b/bolt/lib/Passes/IndirectCallPromotion.cpp +@@ -72,7 +72,7 @@ static cl::alias ICPMispredictThresholdAlias( + cl::desc("alias for --indirect-call-promotion-mispredict-threshold"), + cl::aliasopt(ICPMispredictThreshold)); + +-static cl::opt ICPUseMispredicts( ++cl::opt ICPUseMispredicts( + "indirect-call-promotion-use-mispredicts", + cl::desc("use misprediction frequency for determining whether or not ICP " + "should be applied at a callsite. The " +diff --git a/bolt/lib/Passes/Inliner.cpp b/bolt/lib/Passes/Inliner.cpp +index 67dd294..7fdd780 100644 +--- a/bolt/lib/Passes/Inliner.cpp ++++ b/bolt/lib/Passes/Inliner.cpp +@@ -50,7 +50,7 @@ ForceInlineFunctions("force-inline", + cl::Hidden, + cl::cat(BoltOptCategory)); + +-static cl::opt InlineAll("inline-all", cl::desc("inline all functions"), ++cl::opt InlineAll("inline-all", cl::desc("inline all functions"), + cl::cat(BoltOptCategory)); + + static cl::opt InlineIgnoreLeafCFI( +diff --git a/bolt/lib/Passes/MCF.cpp b/bolt/lib/Passes/MCF.cpp +index a6455bb..bd98286 100644 +--- a/bolt/lib/Passes/MCF.cpp ++++ b/bolt/lib/Passes/MCF.cpp +@@ -31,7 +31,7 @@ extern cl::OptionCategory BoltOptCategory; + + extern cl::opt TimeOpts; + +-static cl::opt IterativeGuess( ++cl::opt IterativeGuess( + "iterative-guess", + cl::desc("in non-LBR mode, guess edge counts using iterative technique"), + cl::Hidden, cl::cat(BoltOptCategory)); +diff --git a/bolt/lib/Passes/ReorderFunctions.cpp b/bolt/lib/Passes/ReorderFunctions.cpp +index 2fc99f6..359cd05 100644 +--- a/bolt/lib/Passes/ReorderFunctions.cpp ++++ b/bolt/lib/Passes/ReorderFunctions.cpp +@@ -98,7 +98,7 @@ static cl::opt CgIgnoreRecursiveCalls( + cl::desc("ignore recursive calls when constructing the call graph"), + cl::init(true), cl::cat(BoltOptCategory)); + +-static cl::opt ++cl::opt + CgUseSplitHotSize("cg-use-split-hot-size", + cl::desc("use hot/cold data on basic blocks to determine hot sizes for " + "call graph functions"), +diff --git a/bolt/lib/Passes/SplitFunctions.cpp b/bolt/lib/Passes/SplitFunctions.cpp +index 34973ce..e934b75 100644 +--- a/bolt/lib/Passes/SplitFunctions.cpp ++++ b/bolt/lib/Passes/SplitFunctions.cpp +@@ -34,25 +34,6 @@ + using namespace llvm; + using namespace bolt; + +-namespace { +-class DeprecatedSplitFunctionOptionParser : public cl::parser { +-public: +- explicit DeprecatedSplitFunctionOptionParser(cl::Option &O) +- : cl::parser(O) {} +- +- bool parse(cl::Option &O, StringRef ArgName, StringRef Arg, bool &Value) { +- if (Arg == "2" || Arg == "3") { +- Value = true; +- errs() << formatv("BOLT-WARNING: specifying non-boolean value \"{0}\" " +- "for option -{1} is deprecated\n", +- Arg, ArgName); +- return false; +- } +- return cl::parser::parse(O, ArgName, Arg, Value); +- } +-}; +-} // namespace +- + namespace opts { + + extern cl::OptionCategory BoltOptCategory; +@@ -61,7 +42,7 @@ extern cl::opt SplitEH; + extern cl::opt ExecutionCountThreshold; + extern cl::opt RandomSeed; + +-static cl::opt AggressiveSplitting( ++cl::opt AggressiveSplitting( + "split-all-cold", cl::desc("outline as many cold basic blocks as possible"), + cl::cat(BoltOptCategory)); + +@@ -74,7 +55,7 @@ static cl::opt SplitAlignThreshold( + + cl::Hidden, cl::cat(BoltOptCategory)); + +-static cl::opt ++cl::opt + SplitFunctions("split-functions", + cl::desc("split functions into fragments"), + cl::cat(BoltOptCategory)); +diff --git a/bolt/lib/Passes/VeneerElimination.cpp b/bolt/lib/Passes/VeneerElimination.cpp +index eadbfc1..611d027 100644 +--- a/bolt/lib/Passes/VeneerElimination.cpp ++++ b/bolt/lib/Passes/VeneerElimination.cpp +@@ -20,7 +20,7 @@ namespace opts { + + extern cl::OptionCategory BoltOptCategory; + +-static llvm::cl::opt ++llvm::cl::opt + EliminateVeneers("elim-link-veneers", + cl::desc("run veneer elimination pass"), cl::init(true), + cl::Hidden, cl::cat(BoltOptCategory)); +diff --git a/bolt/lib/Rewrite/BinaryPassManager.cpp b/bolt/lib/Rewrite/BinaryPassManager.cpp +index 517984d..c231037 100644 +--- a/bolt/lib/Rewrite/BinaryPassManager.cpp ++++ b/bolt/lib/Rewrite/BinaryPassManager.cpp +@@ -58,7 +58,7 @@ DynoStatsAll("dyno-stats-all", + cl::desc("print dyno stats after each stage"), + cl::ZeroOrMore, cl::Hidden, cl::cat(BoltCategory)); + +-static cl::opt ++cl::opt + EliminateUnreachable("eliminate-unreachable", + cl::desc("eliminate unreachable code"), cl::init(true), + cl::cat(BoltOptCategory)); +@@ -207,12 +207,12 @@ static cl::opt RegReAssign( + "reassign registers so as to avoid using REX prefixes in hot code"), + cl::cat(BoltOptCategory)); + +-static cl::opt SimplifyConditionalTailCalls( ++cl::opt SimplifyConditionalTailCalls( + "simplify-conditional-tail-calls", + cl::desc("simplify conditional tail calls by removing unnecessary jumps"), + cl::init(true), cl::cat(BoltOptCategory)); + +-static cl::opt SimplifyRODataLoads( ++cl::opt SimplifyRODataLoads( + "simplify-rodata-loads", + cl::desc("simplify loads from read-only sections by replacing the memory " + "operand with the constant found in the corresponding section"), +diff --git a/bolt/lib/Rewrite/RewriteInstance.cpp b/bolt/lib/Rewrite/RewriteInstance.cpp +index 255c1ae..7a931db 100644 +--- a/bolt/lib/Rewrite/RewriteInstance.cpp ++++ b/bolt/lib/Rewrite/RewriteInstance.cpp +@@ -234,7 +234,7 @@ static cl::opt DWPPathName("dwp", + cl::Hidden, cl::init(""), + cl::cat(BoltCategory)); + +-static cl::opt ++cl::opt + UseGnuStack("use-gnu-stack", + cl::desc("use GNU_STACK program header for new segment (workaround for " + "issues with strip/objcopy)"), +diff --git a/bolt/tools/driver/llvm-bolt.cpp b/bolt/tools/driver/llvm-bolt.cpp +index 5a3af6a..8cba4d2 100644 +--- a/bolt/tools/driver/llvm-bolt.cpp ++++ b/bolt/tools/driver/llvm-bolt.cpp +@@ -26,6 +26,10 @@ + #include "llvm/Support/PrettyStackTrace.h" + #include "llvm/Support/Signals.h" + #include "llvm/Support/TargetSelect.h" ++#include "bolt/Passes/BinaryPasses.h" ++#include "bolt/Passes/ReorderFunctions.h" ++#include "bolt/Passes/SplitFunctions.h" ++#include "bolt/Passes/TailDuplication.h" + + #define DEBUG_TYPE "bolt" + +@@ -35,6 +39,28 @@ using namespace bolt; + + namespace opts { + ++extern cl::opt ReorderBlocks; ++extern cl::opt ReorderFunctions; ++extern cl::opt SplitFunctions; ++extern cl::opt AggressiveSplitting; ++extern cl::opt ICF; ++extern cl::opt UseGnuStack; ++extern cl::opt InlineAll; ++extern cl::opt InferFallThroughs; ++extern cl::opt SimplifyConditionalTailCalls; ++extern cl::opt SimplifyRODataLoads; ++extern cl::opt ICPUseMispredicts; ++extern cl::opt EliminateVeneers; ++extern cl::opt EliminateUnreachable; ++extern cl::opt FixBlockCounts; ++extern cl::opt FixFuncCounts; ++extern cl::opt SctcMode; ++extern cl::opt AlignBlocks; ++extern cl::opt CgUseSplitHotSize; ++extern cl::opt TailDuplicationMode; ++extern cl::opt IterativeGuess; ++extern cl::opt AssumeABI; ++ + static cl::OptionCategory *BoltCategories[] = {&BoltCategory, + &BoltOptCategory, + &BoltRelocCategory, +@@ -69,6 +95,12 @@ InputDataFilename2("data2", + cl::Optional, + cl::cat(BoltCategory)); + ++static cl::opt ++Om("Om", ++ cl::desc("Kunpeng optimization"), ++ cl::ZeroOrMore, ++ cl::cat(BoltOptCategory)); ++ + static cl::opt + InputFilename2( + cl::Positional, +@@ -152,6 +184,34 @@ void boltDiffMode(int argc, char **argv) { + opts::DiffOnly = true; + } + ++void handleOptionOm() { ++ if (!opts::Om) { ++ return; ++ } ++ ++ opts::ReorderBlocks = ReorderBasicBlocks::LT_OPTIMIZE_EXT_TSP; // -reorder-blocks=ext-tsp ++ opts::ReorderFunctions = ReorderFunctions::RT_HFSORT_PLUS; // -reorder-functions=hfsort+ ++ opts::SplitFunctions = true; // -split-functions ++ opts::AggressiveSplitting = true; // -split-all-cold ++ opts::ICF = true; // -icf=1 ++ opts::UseGnuStack = true; // -use-gnu-stack ++ opts::InlineAll = true; // --inline-all ++ opts::InferFallThroughs = true; // --infer-fall-throughs ++ opts::SimplifyConditionalTailCalls = true; // --simplify-conditional-tail-calls ++ opts::SimplifyRODataLoads = true; // --simplify-rodata-loads ++ opts::ICPUseMispredicts = true; // --indirect-call-promotion-use-mispredicts ++ opts::EliminateVeneers = true; // --elim-link-veneers ++ opts::EliminateUnreachable = true; // --eliminate-unreachable ++ opts::FixBlockCounts = true; // --fix-block-counts ++ opts::FixFuncCounts = true; // --fix-func-counts ++ opts::SctcMode = opts::SctcModes::SctcPreserveDirection; // --sctc-mode=preserve ++ opts::AlignBlocks = true; // --align-blocks ++ opts::CgUseSplitHotSize = true; // --cg-use-split-hot-size ++ opts::TailDuplicationMode = TailDuplication::TD_AGGRESSIVE; // --tail-duplication=aggressive ++ opts::IterativeGuess = true; // --iterative-guess ++ opts::AssumeABI = true; // --assume-abi ++} ++ + void boltMode(int argc, char **argv) { + cl::HideUnrelatedOptions(ArrayRef(opts::BoltCategories)); + // Register the target printer for --version. +@@ -160,6 +220,7 @@ void boltMode(int argc, char **argv) { + + cl::ParseCommandLineOptions(argc, argv, + "BOLT - Binary Optimization and Layout Tool\n"); ++ handleOptionOm(); + + if (opts::OutputFilename.empty()) { + errs() << ToolName << ": expected -o= option.\n"; +-- +2.33.0 + diff --git a/llvm-bolt.spec b/llvm-bolt.spec index 51a0aa7..cb69a26 100644 --- a/llvm-bolt.spec +++ b/llvm-bolt.spec @@ -22,7 +22,7 @@ Name: %{pkg_name} Version: %{bolt_version} -Release: 4 +Release: 5 Summary: BOLT is a post-link optimizer developed to speed up large applications License: Apache 2.0 URL: https://github.com/llvm/llvm-project/tree/main/bolt @@ -41,6 +41,7 @@ Patch8: 0008-merge-fdata-Support-process-no_lbr-profile-file.patch Patch9: 0009-support-aarch64-instrumentation.patch Patch10: 0010-AArch64-Add-hybrid-guess-approach-for-edge-weight-estimation.patch Patch11: 0011-support-D-FOT-addrs-data-parsing-for-optimized-binary.patch +Patch12: 0012-Add-Om-for-Kunpeng-Opts.patch BuildRequires: gcc BuildRequires: gcc-c++ @@ -158,6 +159,12 @@ rm -f %{buildroot}/%{_builddir}/%{bolt_srcdir}/%{_vpath_builddir}/%{_lib}/lib*.a %doc %{install_docdir} %changelog +* Tue Apr 22 2025 rfwang07 17.0.6-5 +- Type:backport +- ID:NA +- SUG:NA +- DESC: Add Om for Kunpeng Opts + * Tue Jan 21 2025 wangqiang 17.0.6-4 - Type:bugfix - ID:NA -- Gitee