xref: /llvm-project/llvm/test/Transforms/CodeExtractor/LoopExtractor.ll (revision 0ca8ddd84d416b2b2b831fbc75ac8dbb77a12928)
1*0ca8ddd8SRoman Lebedev; RUN: opt < %s -passes='function(break-crit-edges,loop-simplify),loop-extract' -S | FileCheck %s
23b70ee27SEhud Katz
33b70ee27SEhud Katz; This function has 2 simple loops and they should be extracted into 2 new functions.
43b70ee27SEhud Katzdefine void @test3() {
53b70ee27SEhud Katz; CHECK-LABEL: @test3(
63b70ee27SEhud Katz; CHECK-NEXT:  entry:
73b70ee27SEhud Katz; CHECK-NEXT:    br label %codeRepl1
83b70ee27SEhud Katz; CHECK:       codeRepl1:
93b70ee27SEhud Katz; CHECK-NEXT:    call void @test3.loop.0()
103b70ee27SEhud Katz; CHECK-NEXT:    br label %loop.0.loop.1_crit_edge
113b70ee27SEhud Katz; CHECK:       loop.0.loop.1_crit_edge:
123b70ee27SEhud Katz; CHECK-NEXT:    br label %codeRepl
133b70ee27SEhud Katz; CHECK:       codeRepl:
143b70ee27SEhud Katz; CHECK-NEXT:    call void @test3.loop.1()
153b70ee27SEhud Katz; CHECK-NEXT:    br label %exit
163b70ee27SEhud Katz; CHECK:       exit:
173b70ee27SEhud Katz; CHECK-NEXT:    ret void
183b70ee27SEhud Katz
193b70ee27SEhud Katzentry:
203b70ee27SEhud Katz  br label %loop.0
213b70ee27SEhud Katz
223b70ee27SEhud Katzloop.0:                                           ; preds = %loop.0, %entry
233b70ee27SEhud Katz  %index.0 = phi i32 [ 10, %entry ], [ %next.0, %loop.0 ]
243b70ee27SEhud Katz  tail call void @foo()
253b70ee27SEhud Katz  %next.0 = add nsw i32 %index.0, -1
263b70ee27SEhud Katz  %repeat.0 = icmp sgt i32 %index.0, 1
273b70ee27SEhud Katz  br i1 %repeat.0, label %loop.0, label %loop.1
283b70ee27SEhud Katz
293b70ee27SEhud Katzloop.1:                                           ; preds = %loop.0, %loop.1
303b70ee27SEhud Katz  %index.1 = phi i32 [ %next.1, %loop.1 ], [ 10, %loop.0 ]
313b70ee27SEhud Katz  tail call void @foo()
323b70ee27SEhud Katz  %next.1 = add nsw i32 %index.1, -1
333b70ee27SEhud Katz  %repeat.1 = icmp sgt i32 %index.1, 1
343b70ee27SEhud Katz  br i1 %repeat.1, label %loop.1, label %exit
353b70ee27SEhud Katz
363b70ee27SEhud Katzexit:                                             ; preds = %loop.1
373b70ee27SEhud Katz  ret void
383b70ee27SEhud Katz}
393b70ee27SEhud Katz
403b70ee27SEhud Katzdeclare void @foo()
413b70ee27SEhud Katz
423b70ee27SEhud Katz; CHECK-LABEL: define internal void @test3.loop.1()
433b70ee27SEhud Katz; CHECK-NEXT:  newFuncRoot:
443b70ee27SEhud Katz; CHECK-NEXT:    br label %loop.1
453b70ee27SEhud Katz; CHECK:       loop.1:
463b70ee27SEhud Katz; CHECK-NEXT:    %index.1 = phi i32 [ %next.1, %loop.1.loop.1_crit_edge ], [ 10, %newFuncRoot ]
473b70ee27SEhud Katz; CHECK-NEXT:    tail call void @foo()
483b70ee27SEhud Katz; CHECK-NEXT:    %next.1 = add nsw i32 %index.1, -1
493b70ee27SEhud Katz; CHECK-NEXT:    %repeat.1 = icmp sgt i32 %index.1, 1
503b70ee27SEhud Katz; CHECK-NEXT:    br i1 %repeat.1, label %loop.1.loop.1_crit_edge, label %exit.exitStub
513b70ee27SEhud Katz; CHECK:       loop.1.loop.1_crit_edge:
523b70ee27SEhud Katz; CHECK-NEXT:    br label %loop.1
532e192ab1SVyacheslav Zakharin; CHECK:       exit.exitStub:
542e192ab1SVyacheslav Zakharin; CHECK-NEXT:    ret void
553b70ee27SEhud Katz
563b70ee27SEhud Katz; CHECK-LABEL: define internal void @test3.loop.0()
573b70ee27SEhud Katz; CHECK-NEXT:  newFuncRoot:
583b70ee27SEhud Katz; CHECK-NEXT:    br label %loop.0
593b70ee27SEhud Katz; CHECK:       loop.0:
603b70ee27SEhud Katz; CHECK-NEXT:    %index.0 = phi i32 [ 10, %newFuncRoot ], [ %next.0, %loop.0.loop.0_crit_edge ]
613b70ee27SEhud Katz; CHECK-NEXT:    tail call void @foo()
623b70ee27SEhud Katz; CHECK-NEXT:    %next.0 = add nsw i32 %index.0, -1
633b70ee27SEhud Katz; CHECK-NEXT:    %repeat.0 = icmp sgt i32 %index.0, 1
643b70ee27SEhud Katz; CHECK-NEXT:    br i1 %repeat.0, label %loop.0.loop.0_crit_edge, label %loop.0.loop.1_crit_edge.exitStub
653b70ee27SEhud Katz; CHECK:       loop.0.loop.0_crit_edge:
663b70ee27SEhud Katz; CHECK-NEXT:    br label %loop.0
672e192ab1SVyacheslav Zakharin; CHECK:       loop.0.loop.1_crit_edge.exitStub:
682e192ab1SVyacheslav Zakharin; CHECK-NEXT:    ret void
69