Skip to content

Commit 2570e35

Browse files
authored
[InstCombine] Handle trunc to i1 in align assume. (#122949)
proof: https://alive2.llvm.org/ce/z/EyAUA4
1 parent 34d5072 commit 2570e35

File tree

2 files changed

+18
-12
lines changed

2 files changed

+18
-12
lines changed

llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp

+6-5
Original file line numberDiff line numberDiff line change
@@ -3253,12 +3253,13 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
32533253
// call void @llvm.assume(i1 %D)
32543254
// into
32553255
// call void @llvm.assume(i1 true) [ "align"(i32* [[A]], i64 Constant + 1)]
3256-
uint64_t AlignMask;
3256+
uint64_t AlignMask = 1;
32573257
if (EnableKnowledgeRetention &&
3258-
match(IIOperand,
3259-
m_SpecificICmp(ICmpInst::ICMP_EQ,
3260-
m_And(m_Value(A), m_ConstantInt(AlignMask)),
3261-
m_Zero()))) {
3258+
(match(IIOperand, m_Not(m_Trunc(m_Value(A)))) ||
3259+
match(IIOperand,
3260+
m_SpecificICmp(ICmpInst::ICMP_EQ,
3261+
m_And(m_Value(A), m_ConstantInt(AlignMask)),
3262+
m_Zero())))) {
32623263
if (isPowerOf2_64(AlignMask + 1)) {
32633264
uint64_t Offset = 0;
32643265
match(A, m_Add(m_Value(A), m_ConstantInt(Offset)));

llvm/test/Transforms/InstCombine/assume.ll

+12-7
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,18 @@ define i32 @foo1(ptr %a) #0 {
3535
}
3636

3737
define i32 @align_assume_trunc_cond(ptr %a) #0 {
38-
; CHECK-LABEL: @align_assume_trunc_cond(
39-
; CHECK-NEXT: [[T0:%.*]] = load i32, ptr [[A:%.*]], align 4
40-
; CHECK-NEXT: [[PTRINT:%.*]] = ptrtoint ptr [[A]] to i64
41-
; CHECK-NEXT: [[TRUNC:%.*]] = trunc i64 [[PTRINT]] to i1
42-
; CHECK-NEXT: [[MASKCOND:%.*]] = xor i1 [[TRUNC]], true
43-
; CHECK-NEXT: tail call void @llvm.assume(i1 [[MASKCOND]])
44-
; CHECK-NEXT: ret i32 [[T0]]
38+
; DEFAULT-LABEL: @align_assume_trunc_cond(
39+
; DEFAULT-NEXT: [[T0:%.*]] = load i32, ptr [[A:%.*]], align 4
40+
; DEFAULT-NEXT: [[PTRINT:%.*]] = ptrtoint ptr [[A]] to i64
41+
; DEFAULT-NEXT: [[TRUNC:%.*]] = trunc i64 [[PTRINT]] to i1
42+
; DEFAULT-NEXT: [[MASKCOND:%.*]] = xor i1 [[TRUNC]], true
43+
; DEFAULT-NEXT: tail call void @llvm.assume(i1 [[MASKCOND]])
44+
; DEFAULT-NEXT: ret i32 [[T0]]
45+
;
46+
; BUNDLES-LABEL: @align_assume_trunc_cond(
47+
; BUNDLES-NEXT: [[T0:%.*]] = load i32, ptr [[A:%.*]], align 4
48+
; BUNDLES-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i64 2) ]
49+
; BUNDLES-NEXT: ret i32 [[T0]]
4550
;
4651
%t0 = load i32, ptr %a, align 4
4752
%ptrint = ptrtoint ptr %a to i64

0 commit comments

Comments
 (0)