1- ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: -p - -version 5
1+ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
22; RUN: opt -passes='loop(simple-loop-unswitch<nontrivial>),verify<loops>' -simple-loop-unswitch-guards -S < %s | FileCheck %s
33; RUN: opt -passes='simple-loop-unswitch<nontrivial>' -simple-loop-unswitch-guards -S < %s | FileCheck %s
44; RUN: opt -passes='loop-mssa(simple-loop-unswitch<nontrivial>),verify<loops>' -simple-loop-unswitch-guards -verify-memoryssa -verify-loop-info -S < %s | FileCheck %s
55
66declare void @llvm.experimental.guard (i1 , ...)
77
88define void @test_simple_case (i1 %cond , i32 %N ) {
9- ; CHECK-LABEL: @test_simple_case(
10- ; CHECK-NEXT: entry:
11- ; CHECK-NEXT: br i1 [[COND:%.*]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]]
12- ; CHECK: entry.split.us:
13- ; CHECK-NEXT: br label [[LOOP_US:%.*]]
14- ; CHECK: loop.us:
15- ; CHECK-NEXT: [[IV_US:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT_US]] ], [ [[IV_NEXT_US:%.*]], [[GUARDED_US:%.*]] ]
16- ; CHECK-NEXT: br label [[GUARDED_US]]
17- ; CHECK: guarded.us:
9+ ; CHECK-LABEL: define void @test_simple_case(
10+ ; CHECK-SAME: i1 [[COND:%.*]], i32 [[N:%.*]]) {
11+ ; CHECK-NEXT: [[ENTRY:.*:]]
12+ ; CHECK-NEXT: br i1 [[COND]], label %[[ENTRY_SPLIT_US:.*]], label %[[ENTRY_SPLIT:.*]]
13+ ; CHECK: [[ENTRY_SPLIT_US]]:
14+ ; CHECK-NEXT: br label %[[LOOP_US:.*]]
15+ ; CHECK: [[LOOP_US]]:
16+ ; CHECK-NEXT: [[IV_US:%.*]] = phi i32 [ 0, %[[ENTRY_SPLIT_US]] ], [ [[IV_NEXT_US:%.*]], %[[GUARDED_US:.*]] ]
17+ ; CHECK-NEXT: br label %[[GUARDED_US]]
18+ ; CHECK: [[GUARDED_US]]:
1819; CHECK-NEXT: [[IV_NEXT_US]] = add i32 [[IV_US]], 1
19- ; CHECK-NEXT: [[LOOP_COND_US:%.*]] = icmp slt i32 [[IV_NEXT_US]], [[N:%.*]]
20- ; CHECK-NEXT: br i1 [[LOOP_COND_US]], label [[LOOP_US]], label [[EXIT_SPLIT_US:%.*]]
21- ; CHECK: deopt:
20+ ; CHECK-NEXT: [[LOOP_COND_US:%.*]] = icmp slt i32 [[IV_NEXT_US]], [[N]]
21+ ; CHECK-NEXT: br i1 [[LOOP_COND_US]], label %[[LOOP_US]], label %[[EXIT_SPLIT_US:.*]]
22+ ; CHECK: [[EXIT_SPLIT_US]]:
23+ ; CHECK-NEXT: br label %[[EXIT:.*]]
24+ ; CHECK: [[ENTRY_SPLIT]]:
25+ ; CHECK-NEXT: br label %[[LOOP:.*]]
26+ ; CHECK: [[LOOP]]:
27+ ; CHECK-NEXT: br label %[[DEOPT:.*]]
28+ ; CHECK: [[DEOPT]]:
2229; CHECK-NEXT: call void (i1, ...) @llvm.experimental.guard(i1 false) [ "deopt"() ]
2330; CHECK-NEXT: unreachable
31+ ; CHECK: [[EXIT]]:
32+ ; CHECK-NEXT: ret void
2433;
2534
2635entry:
@@ -38,29 +47,44 @@ exit:
3847}
3948
4049define void @test_two_guards (i1 %cond1 , i1 %cond2 , i32 %N ) {
41- ; CHECK-LABEL: @test_two_guards(
42- ; CHECK-NEXT: entry:
43- ; CHECK-NEXT: br i1 [[COND1:%.*]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]]
44- ; CHECK: entry.split.us:
45- ; CHECK-NEXT: br i1 [[COND2:%.*]], label [[ENTRY_SPLIT_US_SPLIT_US:%.*]], label [[ENTRY_SPLIT_US_SPLIT:%.*]]
46- ; CHECK: entry.split.us.split.us:
47- ; CHECK-NEXT: br label [[LOOP_US_US:%.*]]
48- ; CHECK: loop.us.us:
49- ; CHECK-NEXT: [[IV_US_US:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT_US_SPLIT_US]] ], [ [[IV_NEXT_US_US:%.*]], [[GUARDED_US2:%.*]] ]
50- ; CHECK-NEXT: br label [[GUARDED_US_US:%.*]]
51- ; CHECK: guarded.us.us:
52- ; CHECK-NEXT: br label [[GUARDED_US2]]
53- ; CHECK: guarded.us2:
50+ ; CHECK-LABEL: define void @test_two_guards(
51+ ; CHECK-SAME: i1 [[COND1:%.*]], i1 [[COND2:%.*]], i32 [[N:%.*]]) {
52+ ; CHECK-NEXT: [[ENTRY:.*:]]
53+ ; CHECK-NEXT: br i1 [[COND1]], label %[[ENTRY_SPLIT_US:.*]], label %[[ENTRY_SPLIT:.*]]
54+ ; CHECK: [[ENTRY_SPLIT_US]]:
55+ ; CHECK-NEXT: br i1 [[COND2]], label %[[ENTRY_SPLIT_US_SPLIT_US:.*]], label %[[ENTRY_SPLIT_US_SPLIT:.*]]
56+ ; CHECK: [[ENTRY_SPLIT_US_SPLIT_US]]:
57+ ; CHECK-NEXT: br label %[[LOOP_US_US:.*]]
58+ ; CHECK: [[LOOP_US_US]]:
59+ ; CHECK-NEXT: [[IV_US_US:%.*]] = phi i32 [ 0, %[[ENTRY_SPLIT_US_SPLIT_US]] ], [ [[IV_NEXT_US_US:%.*]], %[[GUARDED_US2:.*]] ]
60+ ; CHECK-NEXT: br label %[[GUARDED_US_US:.*]]
61+ ; CHECK: [[GUARDED_US_US]]:
62+ ; CHECK-NEXT: br label %[[GUARDED_US2]]
63+ ; CHECK: [[GUARDED_US2]]:
5464; CHECK-NEXT: [[IV_NEXT_US_US]] = add i32 [[IV_US_US]], 1
55- ; CHECK-NEXT: [[LOOP_COND_US_US:%.*]] = icmp slt i32 [[IV_NEXT_US_US]], [[N:%.*]]
56- ; CHECK-NEXT: br i1 [[LOOP_COND_US_US]], label [[LOOP_US_US]], label [[EXIT_SPLIT_US_SPLIT_US:%.*]]
57- ; CHECK: deopt1:
65+ ; CHECK-NEXT: [[LOOP_COND_US_US:%.*]] = icmp slt i32 [[IV_NEXT_US_US]], [[N]]
66+ ; CHECK-NEXT: br i1 [[LOOP_COND_US_US]], label %[[LOOP_US_US]], label %[[EXIT_SPLIT_US_SPLIT_US:.*]]
67+ ; CHECK: [[EXIT_SPLIT_US_SPLIT_US]]:
68+ ; CHECK-NEXT: br label %[[EXIT_SPLIT_US:.*]]
69+ ; CHECK: [[ENTRY_SPLIT_US_SPLIT]]:
70+ ; CHECK-NEXT: br label %[[LOOP_US:.*]]
71+ ; CHECK: [[LOOP_US]]:
72+ ; CHECK-NEXT: br label %[[GUARDED_US:.*]]
73+ ; CHECK: [[GUARDED_US]]:
74+ ; CHECK-NEXT: br label %[[DEOPT1:.*]]
75+ ; CHECK: [[DEOPT1]]:
5876; CHECK-NEXT: call void (i1, ...) @llvm.experimental.guard(i1 false) [ "deopt"() ]
5977; CHECK-NEXT: unreachable
60- ; CHECK: deopt:
78+ ; CHECK: [[EXIT_SPLIT_US]]:
79+ ; CHECK-NEXT: br label %[[EXIT:.*]]
80+ ; CHECK: [[ENTRY_SPLIT]]:
81+ ; CHECK-NEXT: br label %[[LOOP:.*]]
82+ ; CHECK: [[LOOP]]:
83+ ; CHECK-NEXT: br label %[[DEOPT:.*]]
84+ ; CHECK: [[DEOPT]]:
6185; CHECK-NEXT: call void (i1, ...) @llvm.experimental.guard(i1 false) [ "deopt"() ]
6286; CHECK-NEXT: unreachable
63- ; CHECK: exit :
87+ ; CHECK: [[EXIT]] :
6488; CHECK-NEXT: ret void
6589;
6690
@@ -80,35 +104,46 @@ exit:
80104}
81105
82106define void @test_conditional_guards (i1 %cond , i32 %N ) {
83- ; CHECK-LABEL: @test_conditional_guards(
84- ; CHECK-NEXT: entry:
85- ; CHECK-NEXT: [[FROZEN:%.+]] = freeze i1 [[COND:%.*]]
86- ; CHECK-NEXT: br i1 [[FROZEN]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]]
87- ; CHECK: entry.split.us:
88- ; CHECK-NEXT: br label [[LOOP_US:%.*]]
89- ; CHECK: loop.us:
90- ; CHECK-NEXT: [[IV_US:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT_US]] ], [ [[IV_NEXT_US:%.*]], [[BACKEDGE_US:%.*]] ]
107+ ; CHECK-LABEL: define void @test_conditional_guards(
108+ ; CHECK-SAME: i1 [[COND:%.*]], i32 [[N:%.*]]) {
109+ ; CHECK-NEXT: [[ENTRY:.*:]]
110+ ; CHECK-NEXT: [[COND_FR:%.*]] = freeze i1 [[COND]]
111+ ; CHECK-NEXT: br i1 [[COND_FR]], label %[[ENTRY_SPLIT_US:.*]], label %[[ENTRY_SPLIT:.*]]
112+ ; CHECK: [[ENTRY_SPLIT_US]]:
113+ ; CHECK-NEXT: br label %[[LOOP_US:.*]]
114+ ; CHECK: [[LOOP_US]]:
115+ ; CHECK-NEXT: [[IV_US:%.*]] = phi i32 [ 0, %[[ENTRY_SPLIT_US]] ], [ [[IV_NEXT_US:%.*]], %[[BACKEDGE_US:.*]] ]
91116; CHECK-NEXT: [[CONDITION_US:%.*]] = icmp eq i32 [[IV_US]], 123
92- ; CHECK-NEXT: br i1 [[CONDITION_US]], label [[GUARD_US:% .*]], label [[BACKEDGE_US]]
93- ; CHECK: guard.us :
94- ; CHECK-NEXT: br label [[GUARDED_US:% .*]]
95- ; CHECK: backedge.us :
117+ ; CHECK-NEXT: br i1 [[CONDITION_US]], label % [[GUARD_US:.*]], label % [[BACKEDGE_US]]
118+ ; CHECK: [[GUARD_US]] :
119+ ; CHECK-NEXT: br label % [[GUARDED_US:.*]]
120+ ; CHECK: [[BACKEDGE_US]] :
96121; CHECK-NEXT: [[IV_NEXT_US]] = add i32 [[IV_US]], 1
97- ; CHECK-NEXT: [[LOOP_COND_US:%.*]] = icmp slt i32 [[IV_NEXT_US]], [[N:%.*]]
98- ; CHECK-NEXT: br i1 [[LOOP_COND_US]], label [[LOOP_US]], label [[EXIT_SPLIT_US:%.*]]
99- ; CHECK: loop:
100- ; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT]] ], [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ]
122+ ; CHECK-NEXT: [[LOOP_COND_US:%.*]] = icmp slt i32 [[IV_NEXT_US]], [[N]]
123+ ; CHECK-NEXT: br i1 [[LOOP_COND_US]], label %[[LOOP_US]], label %[[EXIT_SPLIT_US:.*]]
124+ ; CHECK: [[GUARDED_US]]:
125+ ; CHECK-NEXT: br label %[[BACKEDGE_US]]
126+ ; CHECK: [[EXIT_SPLIT_US]]:
127+ ; CHECK-NEXT: br label %[[EXIT:.*]]
128+ ; CHECK: [[ENTRY_SPLIT]]:
129+ ; CHECK-NEXT: br label %[[LOOP:.*]]
130+ ; CHECK: [[LOOP]]:
131+ ; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, %[[ENTRY_SPLIT]] ], [ [[IV_NEXT:%.*]], %[[BACKEDGE:.*]] ]
101132; CHECK-NEXT: [[CONDITION:%.*]] = icmp eq i32 [[IV]], 123
102- ; CHECK-NEXT: br i1 [[CONDITION]], label [[GUARD:% .*]], label [[BACKEDGE]]
103- ; CHECK: guard :
104- ; CHECK-NEXT: br label [[DEOPT:% .*]]
105- ; CHECK: deopt :
133+ ; CHECK-NEXT: br i1 [[CONDITION]], label % [[GUARD:.*]], label % [[BACKEDGE]]
134+ ; CHECK: [[GUARD]] :
135+ ; CHECK-NEXT: br label % [[DEOPT:.*]]
136+ ; CHECK: [[DEOPT]] :
106137; CHECK-NEXT: call void (i1, ...) @llvm.experimental.guard(i1 false) [ "deopt"() ]
107138; CHECK-NEXT: unreachable
108- ; CHECK: backedge :
139+ ; CHECK: [[BACKEDGE]] :
109140; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1
110141; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp slt i32 [[IV_NEXT]], [[N]]
111- ; CHECK-NEXT: br i1 [[LOOP_COND]], label %loop, label [[EXIT_SPLIT:%.*]]
142+ ; CHECK-NEXT: br i1 [[LOOP_COND]], label %[[LOOP]], label %[[EXIT_SPLIT:.*]]
143+ ; CHECK: [[EXIT_SPLIT]]:
144+ ; CHECK-NEXT: br label %[[EXIT]]
145+ ; CHECK: [[EXIT]]:
146+ ; CHECK-NEXT: ret void
112147;
113148
114149entry:
@@ -133,53 +168,54 @@ exit:
133168}
134169
135170define void @test_nested_loop (i1 %cond , i32 %N , i1 %arg ) {
136- ; CHECK-LABEL: define void @test_nested_loop(i1 %cond, i32 %N, i1 %arg) {
137- ; CHECK-NEXT: entry:
138- ; CHECK-NEXT: br i1 %cond, label %entry.split, label %outer_loop.split
139- ; CHECK: entry.split:
140- ; CHECK-NEXT: br i1 %arg, label %entry.split.split.us, label %entry.split.split
141- ; CHECK: entry.split.split.us:
142- ; CHECK-NEXT: br label %outer_loop.us
143- ; CHECK: outer_loop.us:
144- ; CHECK-NEXT: br label %outer_loop.split.us.us
145- ; CHECK: outer_backedge.us:
146- ; CHECK-NEXT: br label %outer_loop.us
147- ; CHECK: outer_loop.split.us.us:
148- ; CHECK-NEXT: br label %loop.us.us
149- ; CHECK: loop.us.us:
150- ; CHECK-NEXT: %iv.us.us = phi i32 [ 0, %outer_loop.split.us.us ], [ %iv.next.us.us, %guarded.us.us ]
151- ; CHECK-NEXT: br label %guarded.us.us
152- ; CHECK: guarded.us.us:
153- ; CHECK-NEXT: %iv.next.us.us = add i32 %iv.us.us, 1
154- ; CHECK-NEXT: %loop.cond.us.us = icmp slt i32 %iv.next.us.us, %N
155- ; CHECK-NEXT: br i1 %loop.cond.us.us, label %loop.us.us, label %outer_backedge.split.us.us
156- ; CHECK: outer_backedge.split.us.us:
157- ; CHECK-NEXT: br label %outer_backedge.us
158- ; CHECK: entry.split.split:
159- ; CHECK-NEXT: br label %outer_loop
160- ; CHECK: outer_loop:
161- ; CHECK-NEXT: br label %outer_loop.split.us
162- ; CHECK: outer_loop.split.us:
163- ; CHECK-NEXT: br label %loop.us
164- ; CHECK: loop.us:
165- ; CHECK-NEXT: %iv.us = phi i32 [ 0, %outer_loop.split.us ], [ %iv.next.us, %guarded.us ]
166- ; CHECK-NEXT: br label %guarded.us
167- ; CHECK: guarded.us:
168- ; CHECK-NEXT: %iv.next.us = add i32 %iv.us, 1
169- ; CHECK-NEXT: %loop.cond.us = icmp slt i32 %iv.next.us, %N
170- ; CHECK-NEXT: br i1 %loop.cond.us, label %loop.us, label %outer_backedge.split.us
171- ; CHECK: outer_backedge.split.us:
172- ; CHECK-NEXT: br label %outer_backedge
173- ; CHECK: outer_loop.split:
174- ; CHECK-NEXT: br label %loop
175- ; CHECK: loop:
176- ; CHECK-NEXT: br label %deopt
177- ; CHECK: deopt:
171+ ; CHECK-LABEL: define void @test_nested_loop(
172+ ; CHECK-SAME: i1 [[COND:%.*]], i32 [[N:%.*]], i1 [[ARG:%.*]]) {
173+ ; CHECK-NEXT: [[ENTRY:.*:]]
174+ ; CHECK-NEXT: br i1 [[COND]], label %[[ENTRY_SPLIT:.*]], label %[[OUTER_LOOP_SPLIT:.*]]
175+ ; CHECK: [[ENTRY_SPLIT]]:
176+ ; CHECK-NEXT: br i1 [[ARG]], label %[[ENTRY_SPLIT_SPLIT_US:.*]], label %[[ENTRY_SPLIT_SPLIT:.*]]
177+ ; CHECK: [[ENTRY_SPLIT_SPLIT_US]]:
178+ ; CHECK-NEXT: br label %[[OUTER_LOOP_US:.*]]
179+ ; CHECK: [[OUTER_LOOP_US]]:
180+ ; CHECK-NEXT: br label %[[OUTER_LOOP_SPLIT_US_US:.*]]
181+ ; CHECK: [[OUTER_BACKEDGE_US:.*]]:
182+ ; CHECK-NEXT: br label %[[OUTER_LOOP_US]]
183+ ; CHECK: [[OUTER_LOOP_SPLIT_US_US]]:
184+ ; CHECK-NEXT: br label %[[LOOP_US_US:.*]]
185+ ; CHECK: [[LOOP_US_US]]:
186+ ; CHECK-NEXT: [[IV_US_US:%.*]] = phi i32 [ 0, %[[OUTER_LOOP_SPLIT_US_US]] ], [ [[IV_NEXT_US_US:%.*]], %[[GUARDED_US_US:.*]] ]
187+ ; CHECK-NEXT: br label %[[GUARDED_US_US]]
188+ ; CHECK: [[GUARDED_US_US]]:
189+ ; CHECK-NEXT: [[IV_NEXT_US_US]] = add i32 [[IV_US_US]], 1
190+ ; CHECK-NEXT: [[LOOP_COND_US_US:%.*]] = icmp slt i32 [[IV_NEXT_US_US]], [[N]]
191+ ; CHECK-NEXT: br i1 [[LOOP_COND_US_US]], label %[[LOOP_US_US]], label %[[OUTER_BACKEDGE_SPLIT_US_US:.*]]
192+ ; CHECK: [[OUTER_BACKEDGE_SPLIT_US_US]]:
193+ ; CHECK-NEXT: br label %[[OUTER_BACKEDGE_US]]
194+ ; CHECK: [[ENTRY_SPLIT_SPLIT]]:
195+ ; CHECK-NEXT: br label %[[OUTER_LOOP:.*]]
196+ ; CHECK: [[OUTER_LOOP]]:
197+ ; CHECK-NEXT: br label %[[OUTER_LOOP_SPLIT_US:.*]]
198+ ; CHECK: [[OUTER_LOOP_SPLIT_US]]:
199+ ; CHECK-NEXT: br label %[[LOOP_US:.*]]
200+ ; CHECK: [[LOOP_US]]:
201+ ; CHECK-NEXT: [[IV_US:%.*]] = phi i32 [ 0, %[[OUTER_LOOP_SPLIT_US]] ], [ [[IV_NEXT_US:%.*]], %[[GUARDED_US:.*]] ]
202+ ; CHECK-NEXT: br label %[[GUARDED_US]]
203+ ; CHECK: [[GUARDED_US]]:
204+ ; CHECK-NEXT: [[IV_NEXT_US]] = add i32 [[IV_US]], 1
205+ ; CHECK-NEXT: [[LOOP_COND_US:%.*]] = icmp slt i32 [[IV_NEXT_US]], [[N]]
206+ ; CHECK-NEXT: br i1 [[LOOP_COND_US]], label %[[LOOP_US]], label %[[OUTER_BACKEDGE_SPLIT_US:.*]]
207+ ; CHECK: [[OUTER_BACKEDGE_SPLIT_US]]:
208+ ; CHECK-NEXT: br label %[[OUTER_BACKEDGE:.*]]
209+ ; CHECK: [[OUTER_LOOP_SPLIT]]:
210+ ; CHECK-NEXT: br label %[[LOOP:.*]]
211+ ; CHECK: [[LOOP]]:
212+ ; CHECK-NEXT: br label %[[DEOPT:.*]]
213+ ; CHECK: [[DEOPT]]:
178214; CHECK-NEXT: call void (i1, ...) @llvm.experimental.guard(i1 false) [ "deopt"() ]
179215; CHECK-NEXT: unreachable
180- ; CHECK: outer_backedge :
181- ; CHECK-NEXT: br label %exit
182- ; CHECK: exit :
216+ ; CHECK: [[OUTER_BACKEDGE]] :
217+ ; CHECK-NEXT: br label %[[EXIT:.*]]
218+ ; CHECK: [[EXIT]] :
183219; CHECK-NEXT: ret void
184220;
185221
@@ -204,17 +240,50 @@ exit:
204240}
205241
206242define void @test_sibling_loops (i1 %cond1 , i1 %cond2 , i32 %N ) {
207- ; CHECK-LABEL: @test_sibling_loops(
208- ; CHECK-NEXT: entry:
209- ; CHECK-NEXT: br i1 [[COND1:%.*]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]]
210- ; CHECK: [[IV1_US:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT_US]] ], [ [[IV1_NEXT_US:%.*]], [[GUARDED_US:%.*]] ]
211- ; CHECK-NEXT: br label [[GUARDED_US]]
212- ; CHECK: call void (i1, ...) @llvm.experimental.guard(i1 false) [ "deopt"() ]
243+ ; CHECK-LABEL: define void @test_sibling_loops(
244+ ; CHECK-SAME: i1 [[COND1:%.*]], i1 [[COND2:%.*]], i32 [[N:%.*]]) {
245+ ; CHECK-NEXT: [[ENTRY:.*:]]
246+ ; CHECK-NEXT: br i1 [[COND1]], label %[[ENTRY_SPLIT_US:.*]], label %[[ENTRY_SPLIT:.*]]
247+ ; CHECK: [[ENTRY_SPLIT_US]]:
248+ ; CHECK-NEXT: br label %[[LOOP1_US:.*]]
249+ ; CHECK: [[LOOP1_US]]:
250+ ; CHECK-NEXT: [[IV1_US:%.*]] = phi i32 [ 0, %[[ENTRY_SPLIT_US]] ], [ [[IV1_NEXT_US:%.*]], %[[GUARDED_US:.*]] ]
251+ ; CHECK-NEXT: br label %[[GUARDED_US]]
252+ ; CHECK: [[GUARDED_US]]:
253+ ; CHECK-NEXT: [[IV1_NEXT_US]] = add i32 [[IV1_US]], 1
254+ ; CHECK-NEXT: [[LOOP1_COND_US:%.*]] = icmp slt i32 [[IV1_NEXT_US]], [[N]]
255+ ; CHECK-NEXT: br i1 [[LOOP1_COND_US]], label %[[LOOP1_US]], label %[[BETWEEN_SPLIT_US:.*]]
256+ ; CHECK: [[BETWEEN_SPLIT_US]]:
257+ ; CHECK-NEXT: br label %[[BETWEEN:.*]]
258+ ; CHECK: [[ENTRY_SPLIT]]:
259+ ; CHECK-NEXT: br label %[[LOOP1:.*]]
260+ ; CHECK: [[LOOP1]]:
261+ ; CHECK-NEXT: br label %[[DEOPT:.*]]
262+ ; CHECK: [[DEOPT]]:
263+ ; CHECK-NEXT: call void (i1, ...) @llvm.experimental.guard(i1 false) [ "deopt"() ]
213264; CHECK-NEXT: unreachable
214- ; CHECK: [[IV2_US:%.*]] = phi i32 [ 0, [[BETWEEN:%.*]] ], [ [[IV1_NEXT_US2:%.*]], [[GUARDED_US2:%.*]] ]
215- ; CHECK-NEXT: br label [[GUARDED_US2]]
216- ; CHECK: call void (i1, ...) @llvm.experimental.guard(i1 false) [ "deopt"() ]
265+ ; CHECK: [[BETWEEN]]:
266+ ; CHECK-NEXT: br i1 [[COND2]], label %[[BETWEEN_SPLIT_US2:.*]], label %[[BETWEEN_SPLIT:.*]]
267+ ; CHECK: [[BETWEEN_SPLIT_US2]]:
268+ ; CHECK-NEXT: br label %[[LOOP2_US:.*]]
269+ ; CHECK: [[LOOP2_US]]:
270+ ; CHECK-NEXT: [[IV2_US:%.*]] = phi i32 [ 0, %[[BETWEEN_SPLIT_US2]] ], [ [[IV2_NEXT_US:%.*]], %[[GUARDED_US3:.*]] ]
271+ ; CHECK-NEXT: br label %[[GUARDED_US3]]
272+ ; CHECK: [[GUARDED_US3]]:
273+ ; CHECK-NEXT: [[IV2_NEXT_US]] = add i32 [[IV2_US]], 1
274+ ; CHECK-NEXT: [[LOOP2_COND_US:%.*]] = icmp slt i32 [[IV2_NEXT_US]], [[N]]
275+ ; CHECK-NEXT: br i1 [[LOOP2_COND_US]], label %[[LOOP2_US]], label %[[EXIT_SPLIT_US:.*]]
276+ ; CHECK: [[EXIT_SPLIT_US]]:
277+ ; CHECK-NEXT: br label %[[EXIT:.*]]
278+ ; CHECK: [[BETWEEN_SPLIT]]:
279+ ; CHECK-NEXT: br label %[[LOOP2:.*]]
280+ ; CHECK: [[LOOP2]]:
281+ ; CHECK-NEXT: br label %[[DEOPT1:.*]]
282+ ; CHECK: [[DEOPT1]]:
283+ ; CHECK-NEXT: call void (i1, ...) @llvm.experimental.guard(i1 false) [ "deopt"() ]
217284; CHECK-NEXT: unreachable
285+ ; CHECK: [[EXIT]]:
286+ ; CHECK-NEXT: ret void
218287;
219288
220289entry:
@@ -242,11 +311,21 @@ exit:
242311}
243312
244313; Check that we don't do anything because of cleanuppad.
245- ; CHECK-LABEL: @test_cleanuppad(
246- ; CHECK: call void (i1, ...) @llvm.experimental.guard(i1 %cond) [ "deopt"() ]
247- ; CHECK-NOT: call void (i1, ...) @llvm.experimental.guard(
248314define void @test_cleanuppad (i1 %cond , i32 %N ) personality ptr @__CxxFrameHandler3 {
249-
315+ ; CHECK-LABEL: define void @test_cleanuppad(
316+ ; CHECK-SAME: i1 [[COND:%.*]], i32 [[N:%.*]]) personality ptr @__CxxFrameHandler3 {
317+ ; CHECK-NEXT: [[ENTRY:.*]]:
318+ ; CHECK-NEXT: br label %[[LOOP:.*]]
319+ ; CHECK: [[LOOP]]:
320+ ; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
321+ ; CHECK-NEXT: call void (i1, ...) @llvm.experimental.guard(i1 [[COND]]) [ "deopt"() ]
322+ ; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1
323+ ; CHECK-NEXT: invoke void @may_throw(i32 [[IV]])
324+ ; CHECK-NEXT: to label %[[LOOP]] unwind label %[[EXIT:.*]]
325+ ; CHECK: [[EXIT]]:
326+ ; CHECK-NEXT: [[CP:%.*]] = cleanuppad within none []
327+ ; CHECK-NEXT: cleanupret from [[CP]] unwind to caller
328+ ;
250329entry:
251330 br label %loop
252331
0 commit comments