[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