; RUN: opt < %s -lcssa -S -o - | FileCheck %s target triple = "x86_64-unknown-linux-gnu" ; PR28424 ; Here LCSSA adds phi-nodes for %x into the loop exits. Then, SSAUpdater needs ; to insert phi-nodes to merge these values. That creates a new def, which in ; its turn needs another LCCSA phi-node, and this test ensures that we insert ; it. ; CHECK-LABEL: @foo1 define internal i32 @foo1() { entry: br label %header header: %x = add i32 0, 1 br i1 undef, label %if, label %loopexit1 if: br i1 undef, label %latch, label %loopexit2 latch: br i1 undef, label %header, label %loopexit3 ; CHECK: loopexit1: ; CHECK: %x.lcssa = phi i32 [ %x, %header ] loopexit1: br label %loop_with_insert_point ; CHECK: loopexit2: ; CHECK: %x.lcssa1 = phi i32 [ %x, %if ] loopexit2: br label %exit ; CHECK: loopexit3: ; CHECK: %x.lcssa2 = phi i32 [ %x, %latch ] loopexit3: br label %loop_with_insert_point ; CHECK: loop_with_insert_point: ; CHECK: %x4 = phi i32 [ %x4, %loop_with_insert_point ], [ %x.lcssa2, %loopexit3 ], [ %x.lcssa, %loopexit1 ] loop_with_insert_point: br i1 undef, label %loop_with_insert_point, label %bb ; CHECK: bb: ; CHECK: %x4.lcssa = phi i32 [ %x4, %loop_with_insert_point ] bb: br label %exit ; CHECK: exit: ; CHECK: %x3 = phi i32 [ %x4.lcssa, %bb ], [ %x.lcssa1, %loopexit2 ] exit: ret i32 %x } ; CHECK-LABEL: @foo2 define internal i32 @foo2() { entry: br label %header header: %x = add i32 0, 1 br i1 undef, label %latch, label %loopexit1 latch: br i1 undef, label %header, label %loopexit2 ; CHECK: loopexit1: ; CHECK: %x.lcssa = phi i32 [ %x, %header ] loopexit1: br label %loop_with_insert_point ; CHECK: loopexit2: ; CHECK: %x.lcssa1 = phi i32 [ %x, %latch ] loopexit2: br label %loop_with_insert_point ; CHECK: loop_with_insert_point: ; CHECK: %x2 = phi i32 [ %x2, %loop_with_insert_point ], [ %x.lcssa1, %loopexit2 ], [ %x.lcssa, %loopexit1 ] loop_with_insert_point: br i1 undef, label %loop_with_insert_point, label %exit ; CHECK: exit: ; CHECK: %x2.lcssa = phi i32 [ %x2, %loop_with_insert_point ] exit: ret i32 %x }