[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