[llvm] [IR] Avoid unnecessary canBeFreed() calls (NFC) (PR #202685)

via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 9 08:15:31 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-ir

Author: Nikita Popov (nikic)

<details>
<summary>Changes</summary>

Do not call canBeFreed() if the value can't ever be freed (e.g. for globals) or if there are no known dereferenceable bytes. The check is relatively expensive.

(The compile-time impact is only visible when enabling deref-at-point semantics.)

---
Full diff: https://github.com/llvm/llvm-project/pull/202685.diff


1 Files Affected:

- (modified) llvm/lib/IR/Value.cpp (+11-3) 


``````````diff
diff --git a/llvm/lib/IR/Value.cpp b/llvm/lib/IR/Value.cpp
index 850acf2b7a33b..69f0a9a5a6dec 100644
--- a/llvm/lib/IR/Value.cpp
+++ b/llvm/lib/IR/Value.cpp
@@ -902,7 +902,7 @@ uint64_t Value::getPointerDereferenceableBytes(const DataLayout &DL,
 
   uint64_t DerefBytes = 0;
   CanBeNull = false;
-  CanBeFreed = UseDerefAtPointSemantics && canBeFreed();
+  bool CanNotBeFreed = false;
   if (const Argument *A = dyn_cast<Argument>(this)) {
     DerefBytes = A->getDereferenceableBytes();
     if (DerefBytes == 0) {
@@ -955,7 +955,7 @@ uint64_t Value::getPointerDereferenceableBytes(const DataLayout &DL,
     if (std::optional<TypeSize> Size = AI->getAllocationSize(DL)) {
       DerefBytes = Size->getKnownMinValue();
       CanBeNull = false;
-      CanBeFreed = false;
+      CanNotBeFreed = true;
     }
   } else if (auto *GV = dyn_cast<GlobalVariable>(this)) {
     if (GV->getValueType()->isSized() && !GV->hasExternalWeakLinkage()) {
@@ -963,9 +963,17 @@ uint64_t Value::getPointerDereferenceableBytes(const DataLayout &DL,
       // CanBeNull flag.
       DerefBytes = DL.getTypeStoreSize(GV->getValueType()).getFixedValue();
       CanBeNull = false;
-      CanBeFreed = false;
+      CanNotBeFreed = true;
     }
   }
+
+  // Call canBeFreed() only if there are dereferenceable bytes and it's not
+  // one of the cases that can never be freed.
+  if (!CanNotBeFreed && DerefBytes != 0)
+    CanBeFreed = UseDerefAtPointSemantics && canBeFreed();
+  else
+    CanBeFreed = false;
+
   return DerefBytes;
 }
 

``````````

</details>


https://github.com/llvm/llvm-project/pull/202685


More information about the llvm-commits mailing list