69 lines · plain
1; RUN: opt < %s -passes='function(break-crit-edges,loop-simplify),loop-extract' -S | FileCheck %s2 3; This function has 2 simple loops and they should be extracted into 2 new functions.4define void @test3() {5; CHECK-LABEL: @test3(6; CHECK-NEXT: entry:7; CHECK-NEXT: br label %codeRepl18; CHECK: codeRepl1:9; CHECK-NEXT: call void @test3.loop.0()10; CHECK-NEXT: br label %loop.0.loop.1_crit_edge11; CHECK: loop.0.loop.1_crit_edge:12; CHECK-NEXT: br label %codeRepl13; CHECK: codeRepl:14; CHECK-NEXT: call void @test3.loop.1()15; CHECK-NEXT: br label %exit16; CHECK: exit:17; CHECK-NEXT: ret void18 19entry:20 br label %loop.021 22loop.0: ; preds = %loop.0, %entry23 %index.0 = phi i32 [ 10, %entry ], [ %next.0, %loop.0 ]24 tail call void @foo()25 %next.0 = add nsw i32 %index.0, -126 %repeat.0 = icmp sgt i32 %index.0, 127 br i1 %repeat.0, label %loop.0, label %loop.128 29loop.1: ; preds = %loop.0, %loop.130 %index.1 = phi i32 [ %next.1, %loop.1 ], [ 10, %loop.0 ]31 tail call void @foo()32 %next.1 = add nsw i32 %index.1, -133 %repeat.1 = icmp sgt i32 %index.1, 134 br i1 %repeat.1, label %loop.1, label %exit35 36exit: ; preds = %loop.137 ret void38}39 40declare void @foo()41 42; CHECK-LABEL: define internal void @test3.loop.1()43; CHECK-NEXT: newFuncRoot:44; CHECK-NEXT: br label %loop.145; CHECK: loop.1:46; CHECK-NEXT: %index.1 = phi i32 [ %next.1, %loop.1.loop.1_crit_edge ], [ 10, %newFuncRoot ]47; CHECK-NEXT: tail call void @foo()48; CHECK-NEXT: %next.1 = add nsw i32 %index.1, -149; CHECK-NEXT: %repeat.1 = icmp sgt i32 %index.1, 150; CHECK-NEXT: br i1 %repeat.1, label %loop.1.loop.1_crit_edge, label %exit.exitStub51; CHECK: loop.1.loop.1_crit_edge:52; CHECK-NEXT: br label %loop.153; CHECK: exit.exitStub:54; CHECK-NEXT: ret void55 56; CHECK-LABEL: define internal void @test3.loop.0()57; CHECK-NEXT: newFuncRoot:58; CHECK-NEXT: br label %loop.059; CHECK: loop.0:60; CHECK-NEXT: %index.0 = phi i32 [ 10, %newFuncRoot ], [ %next.0, %loop.0.loop.0_crit_edge ]61; CHECK-NEXT: tail call void @foo()62; CHECK-NEXT: %next.0 = add nsw i32 %index.0, -163; CHECK-NEXT: %repeat.0 = icmp sgt i32 %index.0, 164; CHECK-NEXT: br i1 %repeat.0, label %loop.0.loop.0_crit_edge, label %loop.0.loop.1_crit_edge.exitStub65; CHECK: loop.0.loop.0_crit_edge:66; CHECK-NEXT: br label %loop.067; CHECK: loop.0.loop.1_crit_edge.exitStub:68; CHECK-NEXT: ret void69