Skip to content

Commit bc73157

Browse files
committed
Revert "[InstCombine] Always fold alignment assumptions into operand bundles (#177597)"
This reverts commit b74e1bc. Makes clang assert: #177597 (comment)
1 parent 1ccb4a2 commit bc73157

4 files changed

Lines changed: 62 additions & 20 deletions

File tree

llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3685,7 +3685,8 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
36853685
// into
36863686
// call void @llvm.assume(i1 true) [ "align"(i32* [[A]], i64 Constant + 1)]
36873687
uint64_t AlignMask = 1;
3688-
if ((match(IIOperand, m_Not(m_Trunc(m_Value(A)))) ||
3688+
if (EnableKnowledgeRetention &&
3689+
(match(IIOperand, m_Not(m_Trunc(m_Value(A)))) ||
36893690
match(IIOperand,
36903691
m_SpecificICmp(ICmpInst::ICMP_EQ,
36913692
m_And(m_Value(A), m_ConstantInt(AlignMask)),

llvm/test/Transforms/InstCombine/assume-loop-align.ll

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,14 @@ target triple = "x86_64-unknown-linux-gnu"
1010
define void @foo(ptr %a, ptr %b) #0 {
1111
; CHECK-LABEL: @foo(
1212
; CHECK-NEXT: entry:
13-
; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[A:%.*]], i64 64) ]
14-
; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[B:%.*]], i64 64) ]
13+
; CHECK-NEXT: [[PTRINT:%.*]] = ptrtoint ptr [[A:%.*]] to i64
14+
; CHECK-NEXT: [[MASKEDPTR:%.*]] = and i64 [[PTRINT]], 63
15+
; CHECK-NEXT: [[MASKCOND:%.*]] = icmp eq i64 [[MASKEDPTR]], 0
16+
; CHECK-NEXT: tail call void @llvm.assume(i1 [[MASKCOND]])
17+
; CHECK-NEXT: [[PTRINT1:%.*]] = ptrtoint ptr [[B:%.*]] to i64
18+
; CHECK-NEXT: [[MASKEDPTR2:%.*]] = and i64 [[PTRINT1]], 63
19+
; CHECK-NEXT: [[MASKCOND3:%.*]] = icmp eq i64 [[MASKEDPTR2]], 0
20+
; CHECK-NEXT: tail call void @llvm.assume(i1 [[MASKCOND3]])
1521
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
1622
; CHECK: for.body:
1723
; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]

llvm/test/Transforms/InstCombine/assume.ll

Lines changed: 48 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,18 @@ declare void @llvm.assume(i1) #1
1111
; Check that the assume has not been removed:
1212

1313
define i32 @align_to_bundle(ptr %a) #0 {
14-
; CHECK-LABEL: @align_to_bundle(
15-
; CHECK-NEXT: [[T0:%.*]] = load i32, ptr [[A:%.*]], align 4
16-
; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i64 32) ]
17-
; CHECK-NEXT: ret i32 [[T0]]
14+
; DEFAULT-LABEL: @align_to_bundle(
15+
; DEFAULT-NEXT: [[T0:%.*]] = load i32, ptr [[A:%.*]], align 4
16+
; DEFAULT-NEXT: [[PTRINT:%.*]] = ptrtoint ptr [[A]] to i64
17+
; DEFAULT-NEXT: [[MASKEDPTR:%.*]] = and i64 [[PTRINT]], 31
18+
; DEFAULT-NEXT: [[MASKCOND:%.*]] = icmp eq i64 [[MASKEDPTR]], 0
19+
; DEFAULT-NEXT: tail call void @llvm.assume(i1 [[MASKCOND]])
20+
; DEFAULT-NEXT: ret i32 [[T0]]
21+
;
22+
; BUNDLES-LABEL: @align_to_bundle(
23+
; BUNDLES-NEXT: [[T0:%.*]] = load i32, ptr [[A:%.*]], align 4
24+
; BUNDLES-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i64 32) ]
25+
; BUNDLES-NEXT: ret i32 [[T0]]
1826
;
1927
%t0 = load i32, ptr %a, align 4
2028
%ptrint = ptrtoint ptr %a to i64
@@ -25,10 +33,18 @@ define i32 @align_to_bundle(ptr %a) #0 {
2533
}
2634

2735
define i32 @align_to_bundle_ptrtoaddr(ptr %a) #0 {
28-
; CHECK-LABEL: @align_to_bundle_ptrtoaddr(
29-
; CHECK-NEXT: [[T0:%.*]] = load i32, ptr [[A:%.*]], align 4
30-
; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i64 32) ]
31-
; CHECK-NEXT: ret i32 [[T0]]
36+
; DEFAULT-LABEL: @align_to_bundle_ptrtoaddr(
37+
; DEFAULT-NEXT: [[T0:%.*]] = load i32, ptr [[A:%.*]], align 4
38+
; DEFAULT-NEXT: [[PTRINT:%.*]] = ptrtoaddr ptr [[A]] to i64
39+
; DEFAULT-NEXT: [[MASKEDPTR:%.*]] = and i64 [[PTRINT]], 31
40+
; DEFAULT-NEXT: [[MASKCOND:%.*]] = icmp eq i64 [[MASKEDPTR]], 0
41+
; DEFAULT-NEXT: tail call void @llvm.assume(i1 [[MASKCOND]])
42+
; DEFAULT-NEXT: ret i32 [[T0]]
43+
;
44+
; BUNDLES-LABEL: @align_to_bundle_ptrtoaddr(
45+
; BUNDLES-NEXT: [[T0:%.*]] = load i32, ptr [[A:%.*]], align 4
46+
; BUNDLES-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i64 32) ]
47+
; BUNDLES-NEXT: ret i32 [[T0]]
3248
;
3349
%t0 = load i32, ptr %a, align 4
3450
%ptrint = ptrtoaddr ptr %a to i64
@@ -39,10 +55,18 @@ define i32 @align_to_bundle_ptrtoaddr(ptr %a) #0 {
3955
}
4056

4157
define i32 @align_assume_trunc_cond(ptr %a) #0 {
42-
; CHECK-LABEL: @align_assume_trunc_cond(
43-
; CHECK-NEXT: [[T0:%.*]] = load i32, ptr [[A:%.*]], align 4
44-
; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i64 2) ]
45-
; CHECK-NEXT: ret i32 [[T0]]
58+
; DEFAULT-LABEL: @align_assume_trunc_cond(
59+
; DEFAULT-NEXT: [[T0:%.*]] = load i32, ptr [[A:%.*]], align 4
60+
; DEFAULT-NEXT: [[PTRINT:%.*]] = ptrtoint ptr [[A]] to i64
61+
; DEFAULT-NEXT: [[TRUNC:%.*]] = trunc i64 [[PTRINT]] to i1
62+
; DEFAULT-NEXT: [[MASKCOND:%.*]] = xor i1 [[TRUNC]], true
63+
; DEFAULT-NEXT: tail call void @llvm.assume(i1 [[MASKCOND]])
64+
; DEFAULT-NEXT: ret i32 [[T0]]
65+
;
66+
; BUNDLES-LABEL: @align_assume_trunc_cond(
67+
; BUNDLES-NEXT: [[T0:%.*]] = load i32, ptr [[A:%.*]], align 4
68+
; BUNDLES-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i64 2) ]
69+
; BUNDLES-NEXT: ret i32 [[T0]]
4670
;
4771
%t0 = load i32, ptr %a, align 4
4872
%ptrint = ptrtoint ptr %a to i64
@@ -55,10 +79,18 @@ define i32 @align_assume_trunc_cond(ptr %a) #0 {
5579
; Same check as in @foo1, but make sure it works if the assume is first too.
5680

5781
define i32 @foo2(ptr %a) #0 {
58-
; CHECK-LABEL: @foo2(
59-
; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[A:%.*]], i64 32) ]
60-
; CHECK-NEXT: [[T0:%.*]] = load i32, ptr [[A]], align 4
61-
; CHECK-NEXT: ret i32 [[T0]]
82+
; DEFAULT-LABEL: @foo2(
83+
; DEFAULT-NEXT: [[PTRINT:%.*]] = ptrtoint ptr [[A:%.*]] to i64
84+
; DEFAULT-NEXT: [[MASKEDPTR:%.*]] = and i64 [[PTRINT]], 31
85+
; DEFAULT-NEXT: [[MASKCOND:%.*]] = icmp eq i64 [[MASKEDPTR]], 0
86+
; DEFAULT-NEXT: tail call void @llvm.assume(i1 [[MASKCOND]])
87+
; DEFAULT-NEXT: [[T0:%.*]] = load i32, ptr [[A]], align 4
88+
; DEFAULT-NEXT: ret i32 [[T0]]
89+
;
90+
; BUNDLES-LABEL: @foo2(
91+
; BUNDLES-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[A:%.*]], i64 32) ]
92+
; BUNDLES-NEXT: [[T0:%.*]] = load i32, ptr [[A]], align 4
93+
; BUNDLES-NEXT: ret i32 [[T0]]
6294
;
6395
%ptrint = ptrtoint ptr %a to i64
6496
%maskedptr = and i64 %ptrint, 31

llvm/test/Transforms/InstCombine/assume_inevitable.ll

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@ define i32 @assume_inevitable(ptr %a, ptr %b, ptr %c) {
1616
; CHECK-NEXT: [[M_A:%.*]] = call ptr @llvm.ptr.annotation.p0.p0(ptr nonnull [[M]], ptr nonnull @.str, ptr nonnull @.str1, i32 2, ptr null)
1717
; CHECK-NEXT: [[OBJSZ:%.*]] = call i64 @llvm.objectsize.i64.p0(ptr [[C:%.*]], i1 false, i1 false, i1 false)
1818
; CHECK-NEXT: store i64 [[OBJSZ]], ptr [[M_A]], align 4
19-
; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i64 32) ]
19+
; CHECK-NEXT: [[PTRINT:%.*]] = ptrtoint ptr [[A]] to i64
20+
; CHECK-NEXT: [[MASKEDPTR:%.*]] = and i64 [[PTRINT]], 31
21+
; CHECK-NEXT: [[MASKCOND:%.*]] = icmp eq i64 [[MASKEDPTR]], 0
22+
; CHECK-NEXT: tail call void @llvm.assume(i1 [[MASKCOND]])
2023
; CHECK-NEXT: ret i32 [[TMP0]]
2124
;
2225
entry:

0 commit comments

Comments
 (0)