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