Skip to content

Commit 0290a77

Browse files
[SimplifyCFG] Added condition assumption for unreachable blocks
Summary: PR41688 Reviewers: spatel, efriedma, craig.topper, hfinkel, reames Reviewed By: hfinkel Subscribers: javed.absar, dmgreen, fhahn, hfinkel, reames, nikic, lebedev.ri, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D61409 llvm-svn: 361707
1 parent 40fa52b commit 0290a77

File tree

7 files changed

+44
-11
lines changed

7 files changed

+44
-11
lines changed

llvm/lib/Transforms/Utils/SimplifyCFG.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -4205,10 +4205,13 @@ bool SimplifyCFGOpt::SimplifyUnreachable(UnreachableInst *UI) {
42054205
Changed = true;
42064206
}
42074207
} else {
4208+
Value* Cond = BI->getCondition();
42084209
if (BI->getSuccessor(0) == BB) {
4210+
Builder.CreateAssumption(Builder.CreateNot(Cond));
42094211
Builder.CreateBr(BI->getSuccessor(1));
42104212
EraseTerminatorAndDCECond(BI);
42114213
} else if (BI->getSuccessor(1) == BB) {
4214+
Builder.CreateAssumption(Cond);
42124215
Builder.CreateBr(BI->getSuccessor(0));
42134216
EraseTerminatorAndDCECond(BI);
42144217
Changed = true;

llvm/test/Analysis/ValueTracking/select-pattern.ll

+2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
define void @PR36045(i1 %t, i32* %b) {
99
; CHECK-LABEL: @PR36045(
1010
; CHECK-NEXT: entry:
11+
; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[T:%.*]], true
12+
; CHECK-NEXT: call void @llvm.assume(i1 [[TMP0]])
1113
; CHECK-NEXT: ret void
1214
;
1315
entry:

llvm/test/Transforms/CallSiteSplitting/split-loop.ll

+9
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ define i16 @test1() {
55
; CHECK-LABEL: @test1(
66
; CHECK-NEXT: entry:
77
; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 undef, i16 1, i16 0
8+
; CHECK-NEXT: [[TOBOOL18:%.*]] = icmp ne i16 [[SPEC_SELECT]], 0
9+
; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[TOBOOL18]], true
10+
; CHECK-NEXT: call void @llvm.assume(i1 [[TMP0]])
811
; CHECK-NEXT: br label [[FOR_COND12:%.*]]
912
; CHECK: for.cond12:
1013
; CHECK-NEXT: call void @callee(i16 [[SPEC_SELECT]])
@@ -27,6 +30,9 @@ define i16 @test2() {
2730
; CHECK-LABEL: @test2(
2831
; CHECK-NEXT: entry:
2932
; CHECK-NEXT: [[S:%.*]] = select i1 undef, i16 1, i16 0
33+
; CHECK-NEXT: [[TOBOOL18:%.*]] = icmp ne i16 [[S]], 0
34+
; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[TOBOOL18]], true
35+
; CHECK-NEXT: call void @llvm.assume(i1 [[TMP0]])
3036
; CHECK-NEXT: br label [[FOR_COND12:%.*]]
3137
; CHECK: for.cond12:
3238
; CHECK-NEXT: call void @callee(i16 [[S]])
@@ -53,6 +59,9 @@ define i16 @test3() {
5359
; CHECK-LABEL: @test3(
5460
; CHECK-NEXT: entry:
5561
; CHECK-NEXT: [[S:%.*]] = select i1 undef, i16 1, i16 0
62+
; CHECK-NEXT: [[TOBOOL18:%.*]] = icmp ne i16 [[S]], 0
63+
; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[TOBOOL18]], true
64+
; CHECK-NEXT: call void @llvm.assume(i1 [[TMP0]])
5665
; CHECK-NEXT: br label [[FOR_COND12:%.*]]
5766
; CHECK: for.cond12:
5867
; CHECK-NEXT: call void @callee(i16 [[S]])

llvm/test/Transforms/LoopVectorize/if-pred-stores.ll

+10
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,8 @@ for.end:
197197
define void @bug18724(i1 %cond) {
198198
; UNROLL-LABEL: @bug18724(
199199
; UNROLL-NEXT: entry:
200+
; UNROLL-NEXT: [[TMP0:%.*]] = xor i1 [[COND:%.*]], true
201+
; UNROLL-NEXT: call void @llvm.assume(i1 [[TMP0]])
200202
; UNROLL-NEXT: br label [[FOR_BODY14:%.*]]
201203
; UNROLL: for.body14:
202204
; UNROLL-NEXT: [[INDVARS_IV3:%.*]] = phi i64 [ [[INDVARS_IV_NEXT4:%.*]], [[FOR_INC23:%.*]] ], [ undef, [[ENTRY:%.*]] ]
@@ -211,6 +213,9 @@ define void @bug18724(i1 %cond) {
211213
; UNROLL: for.inc23:
212214
; UNROLL-NEXT: [[INEWCHUNKS_2]] = phi i32 [ [[INC21]], [[IF_THEN18]] ], [ [[INEWCHUNKS_120]], [[FOR_BODY14]] ]
213215
; UNROLL-NEXT: [[INDVARS_IV_NEXT4]] = add nsw i64 [[INDVARS_IV3]], 1
216+
; UNROLL-NEXT: [[TMP1:%.*]] = trunc i64 [[INDVARS_IV3]] to i32
217+
; UNROLL-NEXT: [[CMP13:%.*]] = icmp slt i32 [[TMP1]], 0
218+
; UNROLL-NEXT: call void @llvm.assume(i1 [[CMP13]])
214219
; UNROLL-NEXT: br label [[FOR_BODY14]]
215220
;
216221
; UNROLL-NOSIMPLIFY-LABEL: @bug18724(
@@ -287,6 +292,8 @@ define void @bug18724(i1 %cond) {
287292
;
288293
; VEC-LABEL: @bug18724(
289294
; VEC-NEXT: entry:
295+
; VEC-NEXT: [[TMP0:%.*]] = xor i1 [[COND:%.*]], true
296+
; VEC-NEXT: call void @llvm.assume(i1 [[TMP0]])
290297
; VEC-NEXT: br label [[FOR_BODY14:%.*]]
291298
; VEC: for.body14:
292299
; VEC-NEXT: [[INDVARS_IV3:%.*]] = phi i64 [ [[INDVARS_IV_NEXT4:%.*]], [[FOR_INC23:%.*]] ], [ undef, [[ENTRY:%.*]] ]
@@ -301,6 +308,9 @@ define void @bug18724(i1 %cond) {
301308
; VEC: for.inc23:
302309
; VEC-NEXT: [[INEWCHUNKS_2]] = phi i32 [ [[INC21]], [[IF_THEN18]] ], [ [[INEWCHUNKS_120]], [[FOR_BODY14]] ]
303310
; VEC-NEXT: [[INDVARS_IV_NEXT4]] = add nsw i64 [[INDVARS_IV3]], 1
311+
; VEC-NEXT: [[TMP1:%.*]] = trunc i64 [[INDVARS_IV3]] to i32
312+
; VEC-NEXT: [[CMP13:%.*]] = icmp slt i32 [[TMP1]], 0
313+
; VEC-NEXT: call void @llvm.assume(i1 [[CMP13]])
304314
; VEC-NEXT: br label [[FOR_BODY14]]
305315
;
306316
entry:

llvm/test/Transforms/SimplifyCFG/PR30210.ll

+3-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ define i32 @test1(i1 %B) {
1010
; CHECK-NEXT: entry:
1111
; CHECK-NEXT: br label [[FOR_COND_US:%.*]]
1212
; CHECK: for.cond.us:
13+
; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[B:%.*]], true
14+
; CHECK-NEXT: call void @llvm.assume(i1 [[TMP0]])
1315
; CHECK-NEXT: br label [[FOR_COND_US]]
1416
;
1517
entry:
@@ -35,4 +37,4 @@ for.cond5: ; preds = %for.cond5, %for.con
3537
for.end: ; preds = %for.cond5
3638
%load = load i32, i32* %call, align 4
3739
br label %for.cond4
38-
}
40+
}

llvm/test/Transforms/SimplifyCFG/UnreachableEliminate.ll

+11-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
define void @test1(i1 %C, i1* %BP) {
55
; CHECK-LABEL: @test1(
66
; CHECK-NEXT: entry:
7+
; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[C:%.*]], true
8+
; CHECK-NEXT: call void @llvm.assume(i1 [[TMP0]])
79
; CHECK-NEXT: ret void
810
;
911
entry:
@@ -62,6 +64,8 @@ T:
6264
define void @test5(i1 %cond, i8* %ptr) {
6365
; CHECK-LABEL: @test5(
6466
; CHECK-NEXT: entry:
67+
; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[COND:%.*]], true
68+
; CHECK-NEXT: call void @llvm.assume(i1 [[TMP0]])
6569
; CHECK-NEXT: store i8 2, i8* [[PTR:%.*]], align 8
6670
; CHECK-NEXT: ret void
6771
;
@@ -107,6 +111,8 @@ bb2:
107111
define void @test6(i1 %cond, i8* %ptr) {
108112
; CHECK-LABEL: @test6(
109113
; CHECK-NEXT: entry:
114+
; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[COND:%.*]], true
115+
; CHECK-NEXT: call void @llvm.assume(i1 [[TMP0]])
110116
; CHECK-NEXT: store i8 2, i8* [[PTR:%.*]], align 8
111117
; CHECK-NEXT: ret void
112118
;
@@ -145,6 +151,8 @@ bb2:
145151
define i32 @test7(i1 %X) {
146152
; CHECK-LABEL: @test7(
147153
; CHECK-NEXT: entry:
154+
; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[X:%.*]], true
155+
; CHECK-NEXT: call void @llvm.assume(i1 [[TMP0]])
148156
; CHECK-NEXT: ret i32 0
149157
;
150158
entry:
@@ -162,6 +170,8 @@ else:
162170
define void @test8(i1 %X, void ()* %Y) {
163171
; CHECK-LABEL: @test8(
164172
; CHECK-NEXT: entry:
173+
; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[X:%.*]], true
174+
; CHECK-NEXT: call void @llvm.assume(i1 [[TMP0]])
165175
; CHECK-NEXT: call void [[Y:%.*]]()
166176
; CHECK-NEXT: ret void
167177
;
@@ -196,4 +206,4 @@ else:
196206
ret void
197207
}
198208

199-
attributes #0 = { "null-pointer-is-valid"="true" }
209+
attributes #0 = { "null-pointer-is-valid"="true" }

llvm/test/Transforms/SimplifyCFG/unreachable_assume.ll

+6-9
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
22
; RUN: opt %s -simplifycfg -instcombine -S | FileCheck %s
33

4-
; TODO: ABS call should be optimized away
54
define i32 @assume1(i32 %p) {
65
; CHECK-LABEL: @assume1(
76
; CHECK-NEXT: entry:
8-
; CHECK-NEXT: [[TMP0:%.*]] = icmp slt i32 [[P:%.*]], 0
9-
; CHECK-NEXT: [[NEG:%.*]] = sub nsw i32 0, [[P]]
10-
; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[TMP0]], i32 [[NEG]], i32 [[P]]
11-
; CHECK-NEXT: ret i32 [[TMP1]]
7+
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[P:%.*]], 0
8+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
9+
; CHECK-NEXT: ret i32 [[P]]
1210
;
1311
entry:
1412
%cmp = icmp sle i32 %p, 0
@@ -26,10 +24,9 @@ if.end:
2624
define i32 @assume2(i32 %p) {
2725
; CHECK-LABEL: @assume2(
2826
; CHECK-NEXT: entry:
29-
; CHECK-NEXT: [[TMP0:%.*]] = icmp slt i32 [[P:%.*]], 0
30-
; CHECK-NEXT: [[NEG:%.*]] = sub nsw i32 0, [[P]]
31-
; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[TMP0]], i32 [[NEG]], i32 [[P]]
32-
; CHECK-NEXT: ret i32 [[TMP1]]
27+
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[P:%.*]], 0
28+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
29+
; CHECK-NEXT: ret i32 [[P]]
3330
;
3431
entry:
3532
%cmp = icmp sgt i32 %p, 0

0 commit comments

Comments
 (0)