aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/GlobalMerge.cpp
diff options
context:
space:
mode:
authorMichael Maitland <michaeltmaitland@gmail.com>2025-01-24 09:08:34 -0500
committerGitHub <noreply@github.com>2025-01-24 09:08:34 -0500
commite5e55c04d6af4ae32c99d574f59e632595abf607 (patch)
treed6468062bb9c0e8fe08df8a791c68d93ec68946a /llvm/lib/CodeGen/GlobalMerge.cpp
parent970094d50b08e694c2302f7ee39b1c33d08f2405 (diff)
downloadllvm-e5e55c04d6af4ae32c99d574f59e632595abf607.zip
llvm-e5e55c04d6af4ae32c99d574f59e632595abf607.tar.gz
llvm-e5e55c04d6af4ae32c99d574f59e632595abf607.tar.bz2
[GlobalMerge][NFC] Skip sorting by profitability when it is not needed (#124146)
We were previously sorting by profitability even if we were choosing to merge all globals together, which is not impacted by UsedGlobalSet order. We can also remove iteration of UsedGlobalSets in reverse order in both cases. In the first csae, the order does not matter. In the second case, we just sort by the order we need instead of sorting in the opposite direction and calling reverse. This change should only be an improvement on compile time. I have not measured it, but I think it would never make things worse.
Diffstat (limited to 'llvm/lib/CodeGen/GlobalMerge.cpp')
-rw-r--r--llvm/lib/CodeGen/GlobalMerge.cpp26
1 files changed, 12 insertions, 14 deletions
diff --git a/llvm/lib/CodeGen/GlobalMerge.cpp b/llvm/lib/CodeGen/GlobalMerge.cpp
index 7b76155..41e01a1 100644
--- a/llvm/lib/CodeGen/GlobalMerge.cpp
+++ b/llvm/lib/CodeGen/GlobalMerge.cpp
@@ -423,24 +423,12 @@ bool GlobalMergeImpl::doMerge(SmallVectorImpl<GlobalVariable *> &Globals,
}
}
- // Now we found a bunch of sets of globals used together. We accumulated
- // the number of times we encountered the sets (i.e., the number of functions
- // that use that exact set of globals).
- //
- // Multiply that by the size of the set to give us a crude profitability
- // metric.
- llvm::stable_sort(UsedGlobalSets,
- [](const UsedGlobalSet &UGS1, const UsedGlobalSet &UGS2) {
- return UGS1.Globals.count() * UGS1.UsageCount <
- UGS2.Globals.count() * UGS2.UsageCount;
- });
-
// We can choose to merge all globals together, but ignore globals never used
// with another global. This catches the obviously non-profitable cases of
// having a single global, but is aggressive enough for any other case.
if (GlobalMergeIgnoreSingleUse) {
BitVector AllGlobals(Globals.size());
- for (const UsedGlobalSet &UGS : llvm::reverse(UsedGlobalSets)) {
+ for (const UsedGlobalSet &UGS : UsedGlobalSets) {
if (UGS.UsageCount == 0)
continue;
if (UGS.Globals.count() > 1)
@@ -449,6 +437,16 @@ bool GlobalMergeImpl::doMerge(SmallVectorImpl<GlobalVariable *> &Globals,
return doMerge(Globals, AllGlobals, M, isConst, AddrSpace);
}
+ // Now we found a bunch of sets of globals used together. We accumulated
+ // the number of times we encountered the sets (i.e., the number of functions
+ // that use that exact set of globals). Multiply that by the size of the set
+ // to give us a crude profitability metric.
+ llvm::stable_sort(UsedGlobalSets,
+ [](const UsedGlobalSet &UGS1, const UsedGlobalSet &UGS2) {
+ return UGS1.Globals.count() * UGS1.UsageCount >=
+ UGS2.Globals.count() * UGS2.UsageCount;
+ });
+
// Starting from the sets with the best (=biggest) profitability, find a
// good combination.
// The ideal (and expensive) solution can only be found by trying all
@@ -458,7 +456,7 @@ bool GlobalMergeImpl::doMerge(SmallVectorImpl<GlobalVariable *> &Globals,
BitVector PickedGlobals(Globals.size());
bool Changed = false;
- for (const UsedGlobalSet &UGS : llvm::reverse(UsedGlobalSets)) {
+ for (const UsedGlobalSet &UGS : UsedGlobalSets) {
if (UGS.UsageCount == 0)
continue;
if (PickedGlobals.anyCommon(UGS.Globals))