[llvm] [InstCombine] Handle trunc to i1 in align assume. (PR #122949)
Andreas Jonson via llvm-commits
llvm-commits at lists.llvm.org
Tue Jan 14 22:54:57 PST 2025
https://github.com/andjo403 updated https://github.com/llvm/llvm-project/pull/122949
>From 0c3e8d3cad6969a03c1c4bbfdd3cd5f871fa282b Mon Sep 17 00:00:00 2001
From: Andreas Jonson <andjo403 at hotmail.com>
Date: Sun, 12 Jan 2025 11:10:09 +0100
Subject: [PATCH 1/2] [InstCombine] Handle trunc to i1 in align assume.
---
.../InstCombine/InstCombineCalls.cpp | 11 ++++++-----
llvm/test/Transforms/InstCombine/assume.ll | 19 ++++++++++++-------
2 files changed, 18 insertions(+), 12 deletions(-)
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
index dd5a4ba5a4724a..4972b987c95608 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
@@ -3253,12 +3253,13 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
// call void @llvm.assume(i1 %D)
// into
// call void @llvm.assume(i1 true) [ "align"(i32* [[A]], i64 Constant + 1)]
- uint64_t AlignMask;
+ uint64_t AlignMask = 1;
if (EnableKnowledgeRetention &&
- match(IIOperand,
- m_SpecificICmp(ICmpInst::ICMP_EQ,
- m_And(m_Value(A), m_ConstantInt(AlignMask)),
- m_Zero()))) {
+ (match(IIOperand,
+ m_SpecificICmp(ICmpInst::ICMP_EQ,
+ m_And(m_Value(A), m_ConstantInt(AlignMask)),
+ m_Zero())) ||
+ match(IIOperand, m_Not(m_Trunc(m_Value(A)))))) {
if (isPowerOf2_64(AlignMask + 1)) {
uint64_t Offset = 0;
match(A, m_Add(m_Value(A), m_ConstantInt(Offset)));
diff --git a/llvm/test/Transforms/InstCombine/assume.ll b/llvm/test/Transforms/InstCombine/assume.ll
index 2d7bc49b6dcaee..c21f8457e82d14 100644
--- a/llvm/test/Transforms/InstCombine/assume.ll
+++ b/llvm/test/Transforms/InstCombine/assume.ll
@@ -35,13 +35,18 @@ define i32 @foo1(ptr %a) #0 {
}
define i32 @align_assume_trunc_cond(ptr %a) #0 {
-; CHECK-LABEL: @align_assume_trunc_cond(
-; CHECK-NEXT: [[T0:%.*]] = load i32, ptr [[A:%.*]], align 4
-; CHECK-NEXT: [[PTRINT:%.*]] = ptrtoint ptr [[A]] to i64
-; CHECK-NEXT: [[TRUNC:%.*]] = trunc i64 [[PTRINT]] to i1
-; CHECK-NEXT: [[MASKCOND:%.*]] = xor i1 [[TRUNC]], true
-; CHECK-NEXT: tail call void @llvm.assume(i1 [[MASKCOND]])
-; CHECK-NEXT: ret i32 [[T0]]
+; DEFAULT-LABEL: @align_assume_trunc_cond(
+; DEFAULT-NEXT: [[T0:%.*]] = load i32, ptr [[A:%.*]], align 4
+; DEFAULT-NEXT: [[PTRINT:%.*]] = ptrtoint ptr [[A]] to i64
+; DEFAULT-NEXT: [[TRUNC:%.*]] = trunc i64 [[PTRINT]] to i1
+; DEFAULT-NEXT: [[MASKCOND:%.*]] = xor i1 [[TRUNC]], true
+; DEFAULT-NEXT: tail call void @llvm.assume(i1 [[MASKCOND]])
+; DEFAULT-NEXT: ret i32 [[T0]]
+;
+; BUNDLES-LABEL: @align_assume_trunc_cond(
+; BUNDLES-NEXT: [[T0:%.*]] = load i32, ptr [[A:%.*]], align 4
+; BUNDLES-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i64 2) ]
+; BUNDLES-NEXT: ret i32 [[T0]]
;
%t0 = load i32, ptr %a, align 4
%ptrint = ptrtoint ptr %a to i64
>From 2dfa8b7ec68703dc9862964963c736c341f5be97 Mon Sep 17 00:00:00 2001
From: Andreas Jonson <andjo403 at hotmail.com>
Date: Wed, 15 Jan 2025 07:54:42 +0100
Subject: [PATCH 2/2] fixup! [InstCombine] Handle trunc to i1 in align assume.
---
llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
index 4972b987c95608..67b7ec3ae3c9ec 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
@@ -3255,11 +3255,11 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
// call void @llvm.assume(i1 true) [ "align"(i32* [[A]], i64 Constant + 1)]
uint64_t AlignMask = 1;
if (EnableKnowledgeRetention &&
- (match(IIOperand,
+ (match(IIOperand, m_Not(m_Trunc(m_Value(A)))) ||
+ match(IIOperand,
m_SpecificICmp(ICmpInst::ICMP_EQ,
m_And(m_Value(A), m_ConstantInt(AlignMask)),
- m_Zero())) ||
- match(IIOperand, m_Not(m_Trunc(m_Value(A)))))) {
+ m_Zero())))) {
if (isPowerOf2_64(AlignMask + 1)) {
uint64_t Offset = 0;
match(A, m_Add(m_Value(A), m_ConstantInt(Offset)));
More information about the llvm-commits
mailing list