[llvm] [InstCombine] Drop redundant dereferenceable assumptions (PR #202946)

Nikolas Klauser via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 11 07:53:03 PDT 2026


https://github.com/philnik777 updated https://github.com/llvm/llvm-project/pull/202946

>From 337d6fa37cc79526d7c540490278cb298ccbbf34 Mon Sep 17 00:00:00 2001
From: Nikolas Klauser <nikolasklauser at berlin.de>
Date: Wed, 10 Jun 2026 14:03:31 +0200
Subject: [PATCH 1/2] [InstCombine] Drop redundant dereferenceable assumptions

---
 .../Transforms/InstCombine/InstCombineCalls.cpp |  8 +++++++-
 llvm/test/Transforms/InstCombine/assume.ll      | 17 +++++++++++++++++
 2 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
index 22856c7d25e67..4f3fbb4d2dfb5 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
@@ -3677,8 +3677,14 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
       case BundleAttr::Dereferenceable: {
         auto [Ptr, _, Count] = getAssumeDereferenceableInfo(OBU);
 
-        if (Count && *Count == 0)
+        if (!Count)
+          break;
+
+        if (*Count == 0 || isDereferenceableAndAlignedPointer(
+                               Ptr, Align(1), APInt(64, *Count),
+                               getSimplifyQuery().getWithInstruction(II)))
           return CallBase::removeOperandBundleAt(II, Idx);
+
         break;
       }
 
diff --git a/llvm/test/Transforms/InstCombine/assume.ll b/llvm/test/Transforms/InstCombine/assume.ll
index bf073b8d7ce70..e381325c807da 100644
--- a/llvm/test/Transforms/InstCombine/assume.ll
+++ b/llvm/test/Transforms/InstCombine/assume.ll
@@ -1257,6 +1257,23 @@ define void @assume_dereferenceable_variable_on_nullptr(i64 %count) {
   ret void
 }
 
+define void @redundant_assume_dereferenceable_2(ptr dereferenceable(2) %ptr) {
+; CHECK-LABEL: @redundant_assume_dereferenceable_2(
+; CHECK-NEXT:    ret void
+;
+  call void @llvm.assume(i1 true) [ "dereferenceable"(ptr %ptr, i64 2) ]
+  ret void
+}
+
+define void @not_redundant_assume_dereferenceable_2(ptr dereferenceable(1) %ptr) {
+; CHECK-LABEL: @not_redundant_assume_dereferenceable_2(
+; CHECK-NEXT:    call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[PTR:%.*]], i64 2) ]
+; CHECK-NEXT:    ret void
+;
+  call void @llvm.assume(i1 true) [ "dereferenceable"(ptr %ptr, i64 2) ]
+  ret void
+}
+
 declare void @use(i1)
 declare void @llvm.dbg.value(metadata, metadata, metadata)
 

>From 44352ae90fa556f9c0139f77e51e55a094a122ef Mon Sep 17 00:00:00 2001
From: Nikolas Klauser <nikolasklauser at berlin.de>
Date: Thu, 11 Jun 2026 16:52:33 +0200
Subject: [PATCH 2/2] Address comment

---
 llvm/test/Transforms/InstCombine/assume.ll | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/llvm/test/Transforms/InstCombine/assume.ll b/llvm/test/Transforms/InstCombine/assume.ll
index e381325c807da..5da973f20fdd2 100644
--- a/llvm/test/Transforms/InstCombine/assume.ll
+++ b/llvm/test/Transforms/InstCombine/assume.ll
@@ -1264,6 +1264,15 @@ define void @redundant_assume_dereferenceable_2(ptr dereferenceable(2) %ptr) {
   call void @llvm.assume(i1 true) [ "dereferenceable"(ptr %ptr, i64 2) ]
   ret void
 }
+define void @redundant_assume_dereferenceable_2_via_assume(ptr %ptr) {
+; CHECK-LABEL: @redundant_assume_dereferenceable_2_via_assume(
+; CHECK-NEXT:    call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[PTR:%.*]], i64 2) ]
+; CHECK-NEXT:    ret void
+;
+  call void @llvm.assume(i1 true) [ "dereferenceable"(ptr %ptr, i64 2) ]
+  call void @llvm.assume(i1 true) [ "dereferenceable"(ptr %ptr, i64 2) ]
+  ret void
+}
 
 define void @not_redundant_assume_dereferenceable_2(ptr dereferenceable(1) %ptr) {
 ; CHECK-LABEL: @not_redundant_assume_dereferenceable_2(



More information about the llvm-commits mailing list