1; RUN: opt < %s -mergereturn -loop-extract -enable-new-pm=0 -S | FileCheck %s
2
3; This test used to enter an infinite loop, until out of memory (PR3082).
4
5define void @test() {
6; CHECK-LABEL: define void @test()
7; CHECK-NEXT:  entry:
8; CHECK-NEXT:    br label %codeRepl
9; CHECK:       codeRepl:
10; CHECK-NEXT:    %targetBlock = call i1 @test.loopentry()
11; CHECK-NEXT:    br i1 %targetBlock, label %exit.1, label %exit.0
12; CHECK:       exit.0:
13; CHECK-NEXT:    br label %UnifiedReturnBlock
14; CHECK:       exit.1:
15; CHECK-NEXT:    br label %UnifiedReturnBlock
16; CHECK:       UnifiedReturnBlock:
17; CHECK-NEXT:    ret void
18
19entry:
20  br label %loopentry
21
22loopentry:                                        ; preds = %loopexit, %entry
23  br i1 undef, label %exit.1, label %loopexit
24
25loopexit:                                         ; preds = %loopentry
26  br i1 undef, label %loopentry, label %exit.0
27
28exit.0:                                           ; preds = %loopexit
29  ret void
30
31exit.1:                                           ; preds = %loopentry
32  ret void
33}
34
35; CHECK-LABEL: define internal i1 @test.loopentry()
36; CHECK-NEXT:  newFuncRoot:
37; CHECK-NEXT:    br label %loopentry
38; CHECK:       loopentry:
39; CHECK-NEXT:    br i1 true, label %exit.1.exitStub, label %loopexit
40; CHECK:       loopexit:
41; CHECK-NEXT:    br i1 false, label %loopexit.loopentry_crit_edge, label %exit.0.exitStub
42; CHECK:       loopexit.loopentry_crit_edge:
43; CHECK-NEXT:    br label %loopentry
44; CHECK:       exit.1.exitStub:
45; CHECK-NEXT:    ret i1 true
46; CHECK:       exit.0.exitStub:
47; CHECK-NEXT:    ret i1 false
48