OLD | NEW |
1 ; RUN: opt < %s -S -loop-unroll -verify-loop-info | FileCheck %s | 1 ; RUN: opt < %s -S -loop-unroll -verify-loop-info | FileCheck %s |
2 ; | 2 ; |
3 ; Unit tests for LoopInfo::updateUnloop. | 3 ; Unit tests for LoopInfo::updateUnloop. |
4 | 4 |
5 declare i1 @check() nounwind | 5 declare i1 @check() nounwind |
6 | 6 |
7 ; Ensure that tail->inner is removed and rely on verify-loopinfo to | 7 ; Ensure that tail->inner is removed and rely on verify-loopinfo to |
8 ; check soundness. | 8 ; check soundness. |
9 ; | 9 ; |
10 ; CHECK: @skiplevelexit | 10 ; CHECK: @skiplevelexit |
11 ; CHECK: tail: | 11 ; CHECK: tail: |
12 ; CHECK-NOT: br | 12 ; CHECK-NOT: br |
13 ; CHECK: ret void | 13 ; CHECK: ret void |
14 define void @skiplevelexit() nounwind { | 14 define void @skiplevelexit() nounwind { |
15 entry: | 15 entry: |
16 br label %outer | 16 br label %outer |
17 | 17 |
18 outer: | 18 outer: |
19 br label %inner | 19 br label %inner |
20 | 20 |
21 inner: | 21 inner: |
22 %iv = phi i32 [ 0, %outer ], [ %inc, %tail ] | 22 %iv = phi i32 [ 0, %outer ], [ %inc, %tail ] |
23 %inc = add i32 %iv, 1 | 23 %inc = add i32 %iv, 1 |
24 call zeroext i1 @check() | 24 %wbucond = call zeroext i1 @check() |
25 br i1 true, label %outer.backedge, label %tail | 25 br i1 %wbucond, label %outer.backedge, label %tail |
26 | 26 |
27 tail: | 27 tail: |
28 br i1 false, label %inner, label %exit | 28 br i1 false, label %inner, label %exit |
29 | 29 |
30 outer.backedge: | 30 outer.backedge: |
31 br label %outer | 31 br label %outer |
32 | 32 |
33 exit: | 33 exit: |
34 ret void | 34 ret void |
35 } | 35 } |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
119 br label %return | 119 br label %return |
120 | 120 |
121 return: | 121 return: |
122 ret void | 122 ret void |
123 } | 123 } |
124 | 124 |
125 ; Remove the middle loop of a deeply nested loop tree. | 125 ; Remove the middle loop of a deeply nested loop tree. |
126 ; Ensure that only the middle loop is removed and rely on verify-loopinfo to | 126 ; Ensure that only the middle loop is removed and rely on verify-loopinfo to |
127 ; check soundness. | 127 ; check soundness. |
128 ; | 128 ; |
129 ; This test must be disabled until trip count computation can be optimized... | 129 ; CHECK: @unloopDeepNested |
130 ; rdar:14038809 [SCEV]: Optimize trip count computation for multi-exit loops. | |
131 ; CHECKFIXME: @unloopDeepNested | |
132 ; Inner-inner loop control. | 130 ; Inner-inner loop control. |
133 ; CHECKFIXME: while.cond.us.i: | 131 ; CHECK: while.cond.us.i: |
134 ; CHECKFIXME: br i1 %cmp.us.i, label %next_data.exit, label %while.body.us.i | 132 ; CHECK: br i1 %cmp.us.i, label %next_data.exit, label %while.body.us.i |
135 ; CHECKFIXME: if.then.us.i: | 133 ; CHECK: if.then.us.i: |
136 ; CHECKFIXME: br label %while.cond.us.i | 134 ; CHECK: br label %while.cond.us.i |
137 ; Inner loop tail. | 135 ; Inner loop tail. |
138 ; CHECKFIXME: if.else.i: | 136 ; CHECK: if.else.i: |
139 ; CHECKFIXME: br label %while.cond.outer.i | 137 ; CHECK: br label %while.cond.outer.i |
140 ; Middle loop control (removed). | 138 ; Middle loop control (removed). |
141 ; CHECKFIXME: valid_data.exit: | 139 ; CHECK: valid_data.exit: |
142 ; CHECKFIXME-NOT: br | 140 ; CHECK-NOT: br |
143 ; CHECKFIXME: %cmp = call zeroext i1 @check() | 141 ; CHECK: %cmp = call zeroext i1 @check() |
144 ; Outer loop control. | 142 ; Outer loop control. |
145 ; CHECKFIXME: copy_data.exit: | 143 ; CHECK: copy_data.exit: |
146 ; CHECKFIXME: br i1 %cmp38, label %if.then39, label %while.cond.outer | 144 ; CHECK: br i1 %cmp38, label %if.then39, label %while.cond.outer |
147 ; Outer-outer loop tail. | 145 ; Outer-outer loop tail. |
148 ; CHECKFIXME: while.cond.outer.outer.backedge: | 146 ; CHECK: while.cond.outer.outer.backedge: |
149 ; CHECKFIXME: br label %while.cond.outer.outer | 147 ; CHECK: br label %while.cond.outer.outer |
150 define void @unloopDeepNested() nounwind { | 148 define void @unloopDeepNested() nounwind { |
151 for.cond8.preheader.i: | 149 for.cond8.preheader.i: |
152 %cmp113.i = call zeroext i1 @check() | 150 %cmp113.i = call zeroext i1 @check() |
153 br i1 %cmp113.i, label %make_data.exit, label %for.body13.lr.ph.i | 151 br i1 %cmp113.i, label %make_data.exit, label %for.body13.lr.ph.i |
154 | 152 |
155 for.body13.lr.ph.i: | 153 for.body13.lr.ph.i: |
156 br label %make_data.exit | 154 br label %make_data.exit |
157 | 155 |
158 make_data.exit: | 156 make_data.exit: |
159 br label %while.cond.outer.outer | 157 br label %while.cond.outer.outer |
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
463 | 461 |
464 for.cond.i: ; preds = %for.cond.i, %for.bo
dy2 | 462 for.cond.i: ; preds = %for.cond.i, %for.bo
dy2 |
465 br i1 %tobool.i, label %for.cond.i, label %for.cond1.loopexit | 463 br i1 %tobool.i, label %for.cond.i, label %for.cond1.loopexit |
466 | 464 |
467 for.cond3: ; preds = %for.cond1 | 465 for.cond3: ; preds = %for.cond1 |
468 br i1 false, label %for.cond, label %if.end | 466 br i1 false, label %for.cond, label %if.end |
469 | 467 |
470 if.end: ; preds = %for.cond3 | 468 if.end: ; preds = %for.cond3 |
471 ret void | 469 ret void |
472 } | 470 } |
OLD | NEW |