[llvm-branch-commits] [llvm] release/20.x: [SystemZ] Fix compile time regression in adjustInliningThreshold(). (#137527) (PR #137628)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Apr 28 06:14:30 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-systemz
Author: None (llvmbot)
<details>
<summary>Changes</summary>
Backport 98b895d
Requested by: @<!-- -->JonPsson1
---
Full diff: https://github.com/llvm/llvm-project/pull/137628.diff
1 Files Affected:
- (modified) llvm/lib/Target/SystemZ/SystemZTargetTransformInfo.cpp (+30-18)
``````````diff
diff --git a/llvm/lib/Target/SystemZ/SystemZTargetTransformInfo.cpp b/llvm/lib/Target/SystemZ/SystemZTargetTransformInfo.cpp
index 2b94832939419..7eec38b79cb82 100644
--- a/llvm/lib/Target/SystemZ/SystemZTargetTransformInfo.cpp
+++ b/llvm/lib/Target/SystemZ/SystemZTargetTransformInfo.cpp
@@ -18,6 +18,7 @@
#include "llvm/CodeGen/BasicTTIImpl.h"
#include "llvm/CodeGen/TargetLowering.h"
#include "llvm/IR/DerivedTypes.h"
+#include "llvm/IR/InstIterator.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/Support/Debug.h"
@@ -80,7 +81,6 @@ unsigned SystemZTTIImpl::adjustInliningThreshold(const CallBase *CB) const {
const Function *Callee = CB->getCalledFunction();
if (!Callee)
return 0;
- const Module *M = Caller->getParent();
// Increase the threshold if an incoming argument is used only as a memcpy
// source.
@@ -92,25 +92,37 @@ unsigned SystemZTTIImpl::adjustInliningThreshold(const CallBase *CB) const {
}
}
- // Give bonus for globals used much in both caller and callee.
- std::set<const GlobalVariable *> CalleeGlobals;
- std::set<const GlobalVariable *> CallerGlobals;
- for (const GlobalVariable &Global : M->globals())
- for (const User *U : Global.users())
- if (const Instruction *User = dyn_cast<Instruction>(U)) {
- if (User->getParent()->getParent() == Callee)
- CalleeGlobals.insert(&Global);
- if (User->getParent()->getParent() == Caller)
- CallerGlobals.insert(&Global);
+ // Give bonus for globals used much in both caller and a relatively small
+ // callee.
+ unsigned InstrCount = 0;
+ SmallDenseMap<const Value *, unsigned> Ptr2NumUses;
+ for (auto &I : instructions(Callee)) {
+ if (++InstrCount == 200) {
+ Ptr2NumUses.clear();
+ break;
+ }
+ if (const auto *SI = dyn_cast<StoreInst>(&I)) {
+ if (!SI->isVolatile())
+ if (auto *GV = dyn_cast<GlobalVariable>(SI->getPointerOperand()))
+ Ptr2NumUses[GV]++;
+ } else if (const auto *LI = dyn_cast<LoadInst>(&I)) {
+ if (!LI->isVolatile())
+ if (auto *GV = dyn_cast<GlobalVariable>(LI->getPointerOperand()))
+ Ptr2NumUses[GV]++;
+ } else if (const auto *GEP = dyn_cast<GetElementPtrInst>(&I)) {
+ if (auto *GV = dyn_cast<GlobalVariable>(GEP->getPointerOperand())) {
+ unsigned NumStores = 0, NumLoads = 0;
+ countNumMemAccesses(GEP, NumStores, NumLoads, Callee);
+ Ptr2NumUses[GV] += NumLoads + NumStores;
}
- for (auto *GV : CalleeGlobals)
- if (CallerGlobals.count(GV)) {
- unsigned CalleeStores = 0, CalleeLoads = 0;
+ }
+ }
+
+ for (auto [Ptr, NumCalleeUses] : Ptr2NumUses)
+ if (NumCalleeUses > 10) {
unsigned CallerStores = 0, CallerLoads = 0;
- countNumMemAccesses(GV, CalleeStores, CalleeLoads, Callee);
- countNumMemAccesses(GV, CallerStores, CallerLoads, Caller);
- if ((CalleeStores + CalleeLoads) > 10 &&
- (CallerStores + CallerLoads) > 10) {
+ countNumMemAccesses(Ptr, CallerStores, CallerLoads, Caller);
+ if (CallerStores + CallerLoads > 10) {
Bonus = 1000;
break;
}
``````````
</details>
https://github.com/llvm/llvm-project/pull/137628
More information about the llvm-branch-commits
mailing list