[llvm] [ValueTracking] Infer nonnull from alignment with non-zero offsets (PR #203634)

Nikolas Klauser via llvm-commits llvm-commits at lists.llvm.org
Fri Jun 12 14:06:37 PDT 2026


https://github.com/philnik777 created https://github.com/llvm/llvm-project/pull/203634

None

>From e85b5cf11a98bda841c7fad500ac22f143c2d292 Mon Sep 17 00:00:00 2001
From: Nikolas Klauser <nikolasklauser at berlin.de>
Date: Fri, 12 Jun 2026 22:53:54 +0200
Subject: [PATCH] [ValueTracking] Infer nonnull from alignment with non-zero
 offsets

---
 llvm/lib/IR/BundleAttributes.cpp           |  6 ++++++
 llvm/test/Analysis/ValueTracking/assume.ll | 21 +++++++++++++++++++++
 2 files changed, 27 insertions(+)

diff --git a/llvm/lib/IR/BundleAttributes.cpp b/llvm/lib/IR/BundleAttributes.cpp
index a05a11daab3f2..d57e23ebc06ba 100644
--- a/llvm/lib/IR/BundleAttributes.cpp
+++ b/llvm/lib/IR/BundleAttributes.cpp
@@ -76,6 +76,12 @@ llvm::getAssumeDereferenceableInfo(OperandBundleUse OBU) {
 bool llvm::assumeBundleImpliesNonNull(const Value *Val, const Function *Context,
                                       OperandBundleUse OBU) {
   switch (getBundleAttrFromOBU(OBU)) {
+  case BundleAttr::Align: {
+    auto [Ptr, _, Alignment, Offset] = getAssumeAlignInfo(OBU);
+    return Ptr == Val && Alignment && Offset && isPowerOf2_64(*Alignment) &&
+           *Offset % *Alignment != 0;
+  }
+
   case BundleAttr::Dereferenceable: {
     auto [Ptr, _, Count] = getAssumeDereferenceableInfo(OBU);
     return Ptr == Val && Count && *Count != 0 &&
diff --git a/llvm/test/Analysis/ValueTracking/assume.ll b/llvm/test/Analysis/ValueTracking/assume.ll
index 09efbdac20cf4..36fa135a184d3 100644
--- a/llvm/test/Analysis/ValueTracking/assume.ll
+++ b/llvm/test/Analysis/ValueTracking/assume.ll
@@ -259,3 +259,24 @@ define i1 @test_align_with_variable_offset(ptr %ptr, i64 %offset) {
   %is_aligned = icmp eq i64 %and, 0
   ret i1 %is_aligned
 }
+
+define i1 @align_with_non_zero_offset_is_nonnull(ptr %ptr) {
+; CHECK-LABEL: @align_with_non_zero_offset_is_nonnull(
+; CHECK-NEXT:    call void @llvm.assume(i1 true) [ "align"(ptr [[PTR:%.*]], i64 4, i64 1) ]
+; CHECK-NEXT:    ret i1 false
+;
+  call void @llvm.assume(i1 true) ["align"(ptr %ptr, i64 4, i64 1)]
+  %is_null = icmp eq ptr %ptr, null
+  ret i1 %is_null
+}
+
+define i1 @align_with_zero_offset_might_be_null(ptr %ptr) {
+; CHECK-LABEL: @align_with_zero_offset_might_be_null(
+; CHECK-NEXT:    call void @llvm.assume(i1 true) [ "align"(ptr [[PTR:%.*]], i64 4, i64 0) ]
+; CHECK-NEXT:    [[IS_NULL:%.*]] = icmp eq ptr [[PTR]], null
+; CHECK-NEXT:    ret i1 [[IS_NULL]]
+;
+  call void @llvm.assume(i1 true) ["align"(ptr %ptr, i64 4, i64 0)]
+  %is_null = icmp eq ptr %ptr, null
+  ret i1 %is_null
+}



More information about the llvm-commits mailing list