xref: /llvm-project/llvm/test/Transforms/CodeExtractor/LoopExtractor_infinite.ll (revision 58ca7078ce188af21ea5f924573cb00bdb63cbb6)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --include-generated-funcs
2; RUN: opt < %s -passes=loop-extract -S | FileCheck %s
3
4; This test used to enter an infinite loop, until out of memory (PR3082).
5
6define void @test(i1 %arg) {
7
8entry:
9  br label %loopentry
10
11loopentry:
12  br i1 %arg, label %exit.1, label %loopexit
13
14loopexit:
15  br i1 %arg, label %loopentry, label %exit.0
16
17exit.0:
18  br label %unified
19
20exit.1:
21  br label %unified
22
23unified:
24  ret void
25}
26; CHECK-LABEL: define {{[^@]+}}@test
27; CHECK-SAME: (i1 [[ARG:%.*]]) {
28; CHECK-NEXT:  entry:
29; CHECK-NEXT:    br label [[CODEREPL:%.*]]
30; CHECK:       codeRepl:
31; CHECK-NEXT:    [[TARGETBLOCK:%.*]] = call i1 @test.loopentry(i1 [[ARG]])
32; CHECK-NEXT:    br i1 [[TARGETBLOCK]], label [[EXIT_1:%.*]], label [[EXIT_0:%.*]]
33; CHECK:       exit.0:
34; CHECK-NEXT:    br label [[UNIFIED:%.*]]
35; CHECK:       exit.1:
36; CHECK-NEXT:    br label [[UNIFIED]]
37; CHECK:       unified:
38; CHECK-NEXT:    ret void
39;
40;
41; CHECK-LABEL: define {{[^@]+}}@test.loopentry
42; CHECK-SAME: (i1 [[ARG:%.*]]) {
43; CHECK-NEXT:  newFuncRoot:
44; CHECK-NEXT:    br label [[LOOPENTRY:%.*]]
45; CHECK:       loopentry:
46; CHECK-NEXT:    br i1 [[ARG]], label [[EXIT_1_EXITSTUB:%.*]], label [[LOOPEXIT:%.*]]
47; CHECK:       loopexit:
48; CHECK-NEXT:    br i1 [[ARG]], label [[LOOPENTRY]], label [[EXIT_0_EXITSTUB:%.*]]
49; CHECK:       exit.1.exitStub:
50; CHECK-NEXT:    ret i1 true
51; CHECK:       exit.0.exitStub:
52; CHECK-NEXT:    ret i1 false
53;
54