| 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 |