[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