aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlina Sbirlea <asbirlea@google.com>2024-01-23 09:42:47 -0800
committerGitHub <noreply@github.com>2024-01-23 09:42:47 -0800
commitedeaf41e22cc7b1ab9ef30954762f2a08a3c3561 (patch)
tree3c357796c5cb801bc736e64d8d7aa9c6539c9340
parent3428c28b3d611ac608bb8e22633c65f605a6511e (diff)
downloadllvm-edeaf41e22cc7b1ab9ef30954762f2a08a3c3561.zip
llvm-edeaf41e22cc7b1ab9ef30954762f2a08a3c3561.tar.gz
llvm-edeaf41e22cc7b1ab9ef30954762f2a08a3c3561.tar.bz2
[ConstantHoisting] Cache OptForSize. (#79170)
CacheOptForSize to remove quadratic behavior. For each constant analyzed, ConstantHoising calls `shouldOptimizeForSize(F)`, which calls `PSI.getTotalCallCount(F)`. PSI.getTotalCallCount(F) goes through all the instructions in all basic blocks, and checks if each is a call, to count them up. This reduces `llc` time for a very large IR from ~10min to under 3min. Reproducer testcase is much too large to share.
-rw-r--r--llvm/include/llvm/Transforms/Scalar/ConstantHoisting.h1
-rw-r--r--llvm/lib/Transforms/Scalar/ConstantHoisting.cpp7
2 files changed, 5 insertions, 3 deletions
diff --git a/llvm/include/llvm/Transforms/Scalar/ConstantHoisting.h b/llvm/include/llvm/Transforms/Scalar/ConstantHoisting.h
index fa13ed7..a4d1653f 100644
--- a/llvm/include/llvm/Transforms/Scalar/ConstantHoisting.h
+++ b/llvm/include/llvm/Transforms/Scalar/ConstantHoisting.h
@@ -153,6 +153,7 @@ private:
const DataLayout *DL;
BasicBlock *Entry;
ProfileSummaryInfo *PSI;
+ bool OptForSize;
/// Keeps track of constant candidates found in the function.
using ConstCandVecType = std::vector<consthoist::ConstantCandidate>;
diff --git a/llvm/lib/Transforms/Scalar/ConstantHoisting.cpp b/llvm/lib/Transforms/Scalar/ConstantHoisting.cpp
index 9e40d94..49f8761 100644
--- a/llvm/lib/Transforms/Scalar/ConstantHoisting.cpp
+++ b/llvm/lib/Transforms/Scalar/ConstantHoisting.cpp
@@ -576,9 +576,6 @@ ConstantHoistingPass::maximizeConstantsInRange(ConstCandVecType::iterator S,
ConstCandVecType::iterator &MaxCostItr) {
unsigned NumUses = 0;
- bool OptForSize = Entry->getParent()->hasOptSize() ||
- llvm::shouldOptimizeForSize(Entry->getParent(), PSI, BFI,
- PGSOQueryType::IRPass);
if (!OptForSize || std::distance(S,E) > 100) {
for (auto ConstCand = S; ConstCand != E; ++ConstCand) {
NumUses += ConstCand->Uses.size();
@@ -948,6 +945,10 @@ bool ConstantHoistingPass::runImpl(Function &Fn, TargetTransformInfo &TTI,
this->Ctx = &Fn.getContext();
this->Entry = &Entry;
this->PSI = PSI;
+ this->OptForSize = Entry.getParent()->hasOptSize() ||
+ llvm::shouldOptimizeForSize(Entry.getParent(), PSI, BFI,
+ PGSOQueryType::IRPass);
+
// Collect all constant candidates.
collectConstantCandidates(Fn);