[llvm] [SystemZ] Fix compile time regression in adjustInliningThreshold(). (PR #137527)

Jonas Paulsson via llvm-commits llvm-commits at lists.llvm.org
Sun Apr 27 23:10:59 PDT 2025


https://github.com/JonPsson1 updated https://github.com/llvm/llvm-project/pull/137527

>From 65bc5bffb350beb26970d6664328f2fa5fa3d53a Mon Sep 17 00:00:00 2001
From: Jonas Paulsson <paulson1 at linux.ibm.com>
Date: Sun, 27 Apr 2025 11:50:57 +0200
Subject: [PATCH 1/2] IP

---
 .../SystemZ/SystemZTargetTransformInfo.cpp    | 50 +++++++++++--------
 1 file changed, 29 insertions(+), 21 deletions(-)

diff --git a/llvm/lib/Target/SystemZ/SystemZTargetTransformInfo.cpp b/llvm/lib/Target/SystemZ/SystemZTargetTransformInfo.cpp
index ee142ccd20e20..78f5154229f55 100644
--- a/llvm/lib/Target/SystemZ/SystemZTargetTransformInfo.cpp
+++ b/llvm/lib/Target/SystemZ/SystemZTargetTransformInfo.cpp
@@ -80,7 +80,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,29 +91,38 @@ 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.
+  if (Callee->getInstructionCount() < 200) {
+    std::map<const Value *, unsigned> Ptr2NumUses;
+    for (auto &BB : *Callee)
+      for (auto &I : BB) {
+        if (const auto *SI = dyn_cast<StoreInst>(&I)) {
+          if (!SI->isVolatile())
+            Ptr2NumUses[SI->getPointerOperand()]++;
+        } else if (const auto *LI = dyn_cast<LoadInst>(&I)) {
+          if (!LI->isVolatile())
+            Ptr2NumUses[LI->getPointerOperand()]++;
+        } else if (const auto *GEP = dyn_cast<GetElementPtrInst>(&I)) {
+          unsigned NumStores = 0, NumLoads = 0;
+          countNumMemAccesses(GEP, NumStores, NumLoads, Callee);
+          Ptr2NumUses[GEP->getPointerOperand()] += NumLoads + NumStores;
+        }
       }
-  for (auto *GV : CalleeGlobals)
-    if (CallerGlobals.count(GV)) {
-      unsigned CalleeStores = 0, CalleeLoads = 0;
-      unsigned CallerStores = 0, CallerLoads = 0;
-      countNumMemAccesses(GV, CalleeStores, CalleeLoads, Callee);
-      countNumMemAccesses(GV, CallerStores, CallerLoads, Caller);
-      if ((CalleeStores + CalleeLoads) > 10 &&
-          (CallerStores + CallerLoads) > 10) {
-        Bonus = 1000;
-        break;
+
+    for (auto I : Ptr2NumUses) {
+      const Value *Ptr = I.first;
+      unsigned NumCalleeUses = I.second;
+      if (NumCalleeUses > 10 && isa<GlobalVariable>(Ptr)) {
+        unsigned CallerStores = 0, CallerLoads = 0;
+        countNumMemAccesses(Ptr, CallerStores, CallerLoads, Caller);
+        if (CallerStores + CallerLoads > 10) {
+          Bonus = 1000;
+          break;
+        }
       }
     }
+  }
 
   // Give bonus when Callee accesses an Alloca of Caller heavily.
   unsigned NumStores = 0;

>From be26bc95ebc8b45b1f4432b630a286f8408a5192 Mon Sep 17 00:00:00 2001
From: Jonas Paulsson <paulson1 at linux.ibm.com>
Date: Sun, 27 Apr 2025 18:59:52 +0200
Subject: [PATCH 2/2] Updated per review.

---
 .../SystemZ/SystemZTargetTransformInfo.cpp    | 49 ++++++++++---------
 1 file changed, 26 insertions(+), 23 deletions(-)

diff --git a/llvm/lib/Target/SystemZ/SystemZTargetTransformInfo.cpp b/llvm/lib/Target/SystemZ/SystemZTargetTransformInfo.cpp
index 78f5154229f55..e26bdd77ee98b 100644
--- a/llvm/lib/Target/SystemZ/SystemZTargetTransformInfo.cpp
+++ b/llvm/lib/Target/SystemZ/SystemZTargetTransformInfo.cpp
@@ -93,36 +93,39 @@ unsigned SystemZTTIImpl::adjustInliningThreshold(const CallBase *CB) const {
 
   // Give bonus for globals used much in both caller and a relatively small
   // callee.
-  if (Callee->getInstructionCount() < 200) {
-    std::map<const Value *, unsigned> Ptr2NumUses;
-    for (auto &BB : *Callee)
-      for (auto &I : BB) {
-        if (const auto *SI = dyn_cast<StoreInst>(&I)) {
-          if (!SI->isVolatile())
-            Ptr2NumUses[SI->getPointerOperand()]++;
-        } else if (const auto *LI = dyn_cast<LoadInst>(&I)) {
-          if (!LI->isVolatile())
-            Ptr2NumUses[LI->getPointerOperand()]++;
-        } else if (const auto *GEP = dyn_cast<GetElementPtrInst>(&I)) {
+  unsigned InstrCount = 0;
+  SmallDenseMap<const Value *, unsigned> Ptr2NumUses;
+  for (auto &BB : *Callee)
+    for (auto &I : BB.instructionsWithoutDebug()) {
+      if (++InstrCount == 200)
+        goto GlobalsDone;
+      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[GEP->getPointerOperand()] += NumLoads + NumStores;
+          Ptr2NumUses[GV] += NumLoads + NumStores;
         }
       }
+    }
 
-    for (auto I : Ptr2NumUses) {
-      const Value *Ptr = I.first;
-      unsigned NumCalleeUses = I.second;
-      if (NumCalleeUses > 10 && isa<GlobalVariable>(Ptr)) {
-        unsigned CallerStores = 0, CallerLoads = 0;
-        countNumMemAccesses(Ptr, CallerStores, CallerLoads, Caller);
-        if (CallerStores + CallerLoads > 10) {
-          Bonus = 1000;
-          break;
-        }
+  for (auto [Ptr, NumCalleeUses] : Ptr2NumUses)
+    if (NumCalleeUses > 10) {
+      unsigned CallerStores = 0, CallerLoads = 0;
+      countNumMemAccesses(Ptr, CallerStores, CallerLoads, Caller);
+      if (CallerStores + CallerLoads > 10) {
+        Bonus = 1000;
+        break;
       }
     }
-  }
+GlobalsDone:
 
   // Give bonus when Callee accesses an Alloca of Caller heavily.
   unsigned NumStores = 0;



More information about the llvm-commits mailing list