Skip to content

Commit 48f1884

Browse files
committed
[DSE] Add additional tests with unreachable exits.
Adds tests for llvm#53800.
1 parent 55b525e commit 48f1884

File tree

1 file changed

+138
-0
lines changed

1 file changed

+138
-0
lines changed

llvm/test/Transforms/DeadStoreElimination/multiblock-unreachable.ll

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,3 +57,141 @@ bb50: ; preds = %bb43
5757
bb53: ; preds = %bb53, %bb50, %bb22, %bb
5858
br label %bb53
5959
}
60+
61+
declare void @exit()
62+
63+
define void @unreachable_exit_with_no_call(i64* noalias %ptr, i1 %c.1) {
64+
; CHECK-LABEL: @unreachable_exit_with_no_call(
65+
; CHECK-NEXT: entry:
66+
; CHECK-NEXT: store i64 1, i64* [[PTR:%.*]], align 8
67+
; CHECK-NEXT: br i1 [[C_1:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
68+
; CHECK: if.then:
69+
; CHECK-NEXT: unreachable
70+
; CHECK: if.end:
71+
; CHECK-NEXT: store i64 0, i64* [[PTR]], align 8
72+
; CHECK-NEXT: ret void
73+
;
74+
entry:
75+
store i64 1, i64* %ptr, align 8
76+
br i1 %c.1, label %if.then, label %if.end
77+
78+
if.then:
79+
unreachable
80+
81+
if.end:
82+
store i64 0, i64* %ptr, align 8
83+
ret void
84+
}
85+
86+
; Test for PR53800.
87+
define void @unreachable_exit_with_nounwind_call_pr53800(i64* noalias %ptr, i1 %c.1) {
88+
; CHECK-LABEL: @unreachable_exit_with_nounwind_call_pr53800(
89+
; CHECK-NEXT: entry:
90+
; CHECK-NEXT: store i64 1, i64* [[PTR:%.*]], align 8
91+
; CHECK-NEXT: br i1 [[C_1:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
92+
; CHECK: if.then:
93+
; CHECK-NEXT: tail call void @exit() #[[ATTR0:[0-9]+]]
94+
; CHECK-NEXT: unreachable
95+
; CHECK: if.end:
96+
; CHECK-NEXT: store i64 0, i64* [[PTR]], align 8
97+
; CHECK-NEXT: ret void
98+
;
99+
entry:
100+
store i64 1, i64* %ptr, align 8
101+
br i1 %c.1, label %if.then, label %if.end
102+
103+
if.then:
104+
tail call void @exit() nounwind
105+
unreachable
106+
107+
if.end:
108+
store i64 0, i64* %ptr, align 8
109+
ret void
110+
}
111+
112+
; The call @exit may read %ptr as it is not marked as noalias
113+
define void @unreachable_exit_and_call_may_read(i64* %ptr, i1 %c.1) {
114+
; CHECK-LABEL: @unreachable_exit_and_call_may_read(
115+
; CHECK-NEXT: entry:
116+
; CHECK-NEXT: store i64 1, i64* [[PTR:%.*]], align 8
117+
; CHECK-NEXT: br i1 [[C_1:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
118+
; CHECK: if.then:
119+
; CHECK-NEXT: tail call void @exit() #[[ATTR0]]
120+
; CHECK-NEXT: unreachable
121+
; CHECK: if.end:
122+
; CHECK-NEXT: store i64 0, i64* [[PTR]], align 8
123+
; CHECK-NEXT: ret void
124+
;
125+
entry:
126+
store i64 1, i64* %ptr, align 8
127+
br i1 %c.1, label %if.then, label %if.end
128+
129+
if.then:
130+
tail call void @exit() nounwind
131+
unreachable
132+
133+
if.end:
134+
store i64 0, i64* %ptr, align 8
135+
ret void
136+
}
137+
138+
define void @unreachable_exit_with_may_unwind_call(i64* noalias %ptr, i1 %c.1) {
139+
; CHECK-LABEL: @unreachable_exit_with_may_unwind_call(
140+
; CHECK-NEXT: entry:
141+
; CHECK-NEXT: store i64 1, i64* [[PTR:%.*]], align 8
142+
; CHECK-NEXT: br i1 [[C_1:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
143+
; CHECK: if.then:
144+
; CHECK-NEXT: tail call void @exit()
145+
; CHECK-NEXT: unreachable
146+
; CHECK: if.end:
147+
; CHECK-NEXT: store i64 0, i64* [[PTR]], align 8
148+
; CHECK-NEXT: ret void
149+
;
150+
entry:
151+
store i64 1, i64* %ptr, align 8
152+
br i1 %c.1, label %if.then, label %if.end
153+
154+
if.then:
155+
tail call void @exit()
156+
unreachable
157+
158+
if.end:
159+
store i64 0, i64* %ptr, align 8
160+
ret void
161+
}
162+
163+
; Cannot remove the store in entry, because it is not dead on the path to e.1
164+
define void @unreachable_exit_but_another_exit(i64* noalias %ptr, i1 %c.1, i32 %s, i1 %c.2) {
165+
; CHECK-LABEL: @unreachable_exit_but_another_exit(
166+
; CHECK-NEXT: entry:
167+
; CHECK-NEXT: store i64 1, i64* [[PTR:%.*]], align 8
168+
; CHECK-NEXT: br i1 [[C_1:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
169+
; CHECK: if.then:
170+
; CHECK-NEXT: br i1 [[C_2:%.*]], label [[E_0:%.*]], label [[E_1:%.*]]
171+
; CHECK: e.0:
172+
; CHECK-NEXT: tail call void @exit() #[[ATTR0]]
173+
; CHECK-NEXT: unreachable
174+
; CHECK: e.1:
175+
; CHECK-NEXT: ret void
176+
; CHECK: if.end:
177+
; CHECK-NEXT: store i64 0, i64* [[PTR]], align 8
178+
; CHECK-NEXT: ret void
179+
;
180+
entry:
181+
store i64 1, i64* %ptr, align 8
182+
br i1 %c.1, label %if.then, label %if.end
183+
184+
if.then:
185+
br i1 %c.2, label %e.0, label %e.1
186+
187+
e.0:
188+
tail call void @exit() nounwind
189+
unreachable
190+
191+
e.1:
192+
ret void
193+
194+
if.end:
195+
store i64 0, i64* %ptr, align 8
196+
ret void
197+
}

0 commit comments

Comments
 (0)