| ; RUN: opt < %s -passes='function(break-crit-edges,loop-simplify),loop-extract' -S | FileCheck %s |
| |
| ; This function has 2 simple loops and they should be extracted into 2 new functions. |
| define void @test3() { |
| ; CHECK-LABEL: @test3( |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: br label %codeRepl1 |
| ; CHECK: codeRepl1: |
| ; CHECK-NEXT: call void @test3.loop.0() |
| ; CHECK-NEXT: br label %loop.0.loop.1_crit_edge |
| ; CHECK: loop.0.loop.1_crit_edge: |
| ; CHECK-NEXT: br label %codeRepl |
| ; CHECK: codeRepl: |
| ; CHECK-NEXT: call void @test3.loop.1() |
| ; CHECK-NEXT: br label %exit |
| ; CHECK: exit: |
| ; CHECK-NEXT: ret void |
| |
| entry: |
| br label %loop.0 |
| |
| loop.0: ; preds = %loop.0, %entry |
| %index.0 = phi i32 [ 10, %entry ], [ %next.0, %loop.0 ] |
| tail call void @foo() |
| %next.0 = add nsw i32 %index.0, -1 |
| %repeat.0 = icmp sgt i32 %index.0, 1 |
| br i1 %repeat.0, label %loop.0, label %loop.1 |
| |
| loop.1: ; preds = %loop.0, %loop.1 |
| %index.1 = phi i32 [ %next.1, %loop.1 ], [ 10, %loop.0 ] |
| tail call void @foo() |
| %next.1 = add nsw i32 %index.1, -1 |
| %repeat.1 = icmp sgt i32 %index.1, 1 |
| br i1 %repeat.1, label %loop.1, label %exit |
| |
| exit: ; preds = %loop.1 |
| ret void |
| } |
| |
| declare void @foo() |
| |
| ; CHECK-LABEL: define internal void @test3.loop.1() |
| ; CHECK-NEXT: newFuncRoot: |
| ; CHECK-NEXT: br label %loop.1 |
| ; CHECK: loop.1: |
| ; CHECK-NEXT: %index.1 = phi i32 [ %next.1, %loop.1.loop.1_crit_edge ], [ 10, %newFuncRoot ] |
| ; CHECK-NEXT: tail call void @foo() |
| ; CHECK-NEXT: %next.1 = add nsw i32 %index.1, -1 |
| ; CHECK-NEXT: %repeat.1 = icmp sgt i32 %index.1, 1 |
| ; CHECK-NEXT: br i1 %repeat.1, label %loop.1.loop.1_crit_edge, label %exit.exitStub |
| ; CHECK: loop.1.loop.1_crit_edge: |
| ; CHECK-NEXT: br label %loop.1 |
| ; CHECK: exit.exitStub: |
| ; CHECK-NEXT: ret void |
| |
| ; CHECK-LABEL: define internal void @test3.loop.0() |
| ; CHECK-NEXT: newFuncRoot: |
| ; CHECK-NEXT: br label %loop.0 |
| ; CHECK: loop.0: |
| ; CHECK-NEXT: %index.0 = phi i32 [ 10, %newFuncRoot ], [ %next.0, %loop.0.loop.0_crit_edge ] |
| ; CHECK-NEXT: tail call void @foo() |
| ; CHECK-NEXT: %next.0 = add nsw i32 %index.0, -1 |
| ; CHECK-NEXT: %repeat.0 = icmp sgt i32 %index.0, 1 |
| ; CHECK-NEXT: br i1 %repeat.0, label %loop.0.loop.0_crit_edge, label %loop.0.loop.1_crit_edge.exitStub |
| ; CHECK: loop.0.loop.0_crit_edge: |
| ; CHECK-NEXT: br label %loop.0 |
| ; CHECK: loop.0.loop.1_crit_edge.exitStub: |
| ; CHECK-NEXT: ret void |