diff options
author | Alina Sbirlea <asbirlea@google.com> | 2024-01-23 09:42:47 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-23 09:42:47 -0800 |
commit | edeaf41e22cc7b1ab9ef30954762f2a08a3c3561 (patch) | |
tree | 3c357796c5cb801bc736e64d8d7aa9c6539c9340 | |
parent | 3428c28b3d611ac608bb8e22633c65f605a6511e (diff) | |
download | llvm-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.h | 1 | ||||
-rw-r--r-- | llvm/lib/Transforms/Scalar/ConstantHoisting.cpp | 7 |
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); |