[llvm] [ValueTracking] Enhance alignment propagation in computeKnownBits. (PR #166935)

Shamshura Egor via llvm-commits llvm-commits at lists.llvm.org
Mon Dec 1 04:30:04 PST 2025


https://github.com/egorshamshura updated https://github.com/llvm/llvm-project/pull/166935

>From 65147d22f01598fef181e2833aac757c393bd074 Mon Sep 17 00:00:00 2001
From: Shamshura Egor <shamshuraegor at gmail.com>
Date: Mon, 1 Dec 2025 12:11:32 +0000
Subject: [PATCH 1/2] Added tests.

---
 .../Transforms/InferAlignment/ptrtoint.ll     | 33 +++++++++++++++++++
 1 file changed, 33 insertions(+)
 create mode 100644 llvm/test/Transforms/InferAlignment/ptrtoint.ll

diff --git a/llvm/test/Transforms/InferAlignment/ptrtoint.ll b/llvm/test/Transforms/InferAlignment/ptrtoint.ll
new file mode 100644
index 0000000000000..f5dbf9a5ad37c
--- /dev/null
+++ b/llvm/test/Transforms/InferAlignment/ptrtoint.ll
@@ -0,0 +1,33 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; RUN: opt < %s -passes=infer-alignment -S | FileCheck %s
+
+define i64 @base(ptr %0) {
+; CHECK-LABEL: define i64 @base(
+; CHECK-SAME: ptr [[TMP0:%.*]]) {
+; CHECK-NEXT:    [[V1:%.*]] = load i32, ptr [[TMP0]], align 4
+; CHECK-NEXT:    [[V3:%.*]] = ptrtoint ptr [[TMP0]] to i64
+; CHECK-NEXT:    [[V5:%.*]] = and i64 [[V3]], 2
+; CHECK-NEXT:    ret i64 [[V5]]
+;
+  %v1 = load i32, ptr %0, align 4
+  %v3 = ptrtoint ptr %0 to i64
+  %v5 = and i64 %v3, 2
+  ret i64 %v5
+}
+
+define i64 @best_alignment(ptr %0) {
+; CHECK-LABEL: define i64 @best_alignment(
+; CHECK-SAME: ptr [[TMP0:%.*]]) {
+; CHECK-NEXT:    [[V1:%.*]] = load i32, ptr [[TMP0]], align 8
+; CHECK-NEXT:    [[V1_3:%.*]] = load i32, ptr [[TMP0]], align 16
+; CHECK-NEXT:    [[V3:%.*]] = ptrtoint ptr [[TMP0]] to i64
+; CHECK-NEXT:    [[V5:%.*]] = and i64 [[V3]], 15
+; CHECK-NEXT:    ret i64 [[V5]]
+;
+  %v1 = load i32, ptr %0, align 8
+  %v2 = load i32, ptr %0, align 16
+  %v3 = ptrtoint ptr %0 to i64
+  %v5 = and i64 %v3, 15
+  ret i64 %v5
+}
+

>From ac791c01eec7b649047c2c6c93d0f573faaf4d00 Mon Sep 17 00:00:00 2001
From: Shamshura Egor <shamshuraegor at gmail.com>
Date: Mon, 1 Dec 2025 12:29:41 +0000
Subject: [PATCH 2/2] Added opt.

---
 llvm/lib/Transforms/Scalar/InferAlignment.cpp | 21 +++++++++++++++++++
 .../Transforms/InferAlignment/ptrtoint.ll     |  4 ++--
 2 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/llvm/lib/Transforms/Scalar/InferAlignment.cpp b/llvm/lib/Transforms/Scalar/InferAlignment.cpp
index 39751c04eba08..9a22dfc10c421 100644
--- a/llvm/lib/Transforms/Scalar/InferAlignment.cpp
+++ b/llvm/lib/Transforms/Scalar/InferAlignment.cpp
@@ -16,11 +16,13 @@
 #include "llvm/Analysis/ValueTracking.h"
 #include "llvm/IR/Instructions.h"
 #include "llvm/IR/IntrinsicInst.h"
+#include "llvm/IR/PatternMatch.h"
 #include "llvm/Support/KnownBits.h"
 #include "llvm/Transforms/Scalar.h"
 #include "llvm/Transforms/Utils/Local.h"
 
 using namespace llvm;
+using namespace llvm::PatternMatch;
 
 static bool tryToImproveAlign(
     const DataLayout &DL, Instruction *I,
@@ -136,6 +138,25 @@ bool inferAlignment(Function &F, AssumptionCache &AC, DominatorTree &DT) {
                             InferFromBasePointer(PtrOp, OldAlign));
           });
     }
+
+    for (Instruction &I : BB) {
+      Value *PtrOp;
+      ConstantInt *Const;
+      if (match(&I,
+                m_c_And(m_PtrToInt(m_Value(PtrOp)), m_ConstantInt(Const)))) {
+        Align KnownAlign = InferFromKnownBits(I, PtrOp);
+        Align BaseAlign = PtrOp->getPointerAlignment(DL);
+        if (auto It = BestBasePointerAligns.find(PtrOp);
+            It != BestBasePointerAligns.end()) {
+          BaseAlign = std::max(BaseAlign, It->second);
+        }
+        Align ActualAlign = std::max(KnownAlign, BaseAlign);
+        if (Const->getValue().ult(ActualAlign.value())) {
+          I.replaceAllUsesWith(Constant::getNullValue(I.getType()));
+          Changed = true;
+        }
+      }
+    }
   }
 
   return Changed;
diff --git a/llvm/test/Transforms/InferAlignment/ptrtoint.ll b/llvm/test/Transforms/InferAlignment/ptrtoint.ll
index f5dbf9a5ad37c..b108be866eb8a 100644
--- a/llvm/test/Transforms/InferAlignment/ptrtoint.ll
+++ b/llvm/test/Transforms/InferAlignment/ptrtoint.ll
@@ -7,7 +7,7 @@ define i64 @base(ptr %0) {
 ; CHECK-NEXT:    [[V1:%.*]] = load i32, ptr [[TMP0]], align 4
 ; CHECK-NEXT:    [[V3:%.*]] = ptrtoint ptr [[TMP0]] to i64
 ; CHECK-NEXT:    [[V5:%.*]] = and i64 [[V3]], 2
-; CHECK-NEXT:    ret i64 [[V5]]
+; CHECK-NEXT:    ret i64 0
 ;
   %v1 = load i32, ptr %0, align 4
   %v3 = ptrtoint ptr %0 to i64
@@ -22,7 +22,7 @@ define i64 @best_alignment(ptr %0) {
 ; CHECK-NEXT:    [[V1_3:%.*]] = load i32, ptr [[TMP0]], align 16
 ; CHECK-NEXT:    [[V3:%.*]] = ptrtoint ptr [[TMP0]] to i64
 ; CHECK-NEXT:    [[V5:%.*]] = and i64 [[V3]], 15
-; CHECK-NEXT:    ret i64 [[V5]]
+; CHECK-NEXT:    ret i64 0
 ;
   %v1 = load i32, ptr %0, align 8
   %v2 = load i32, ptr %0, align 16



More information about the llvm-commits mailing list