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