; RUN: opt < %s -passes='print<phi-values>' -disable-output 2>&1 | FileCheck %s ; This test uses a long chain of phis that take themselves as an operand, which causes ; phi values analysis to segfault if it's not careful about that kind of thing. ; CHECK-LABEL: PHI Values for function: fn define void @fn(i32* %arg) { entry: br label %while1.cond while1.cond: ; CHECK: PHI %phi1 has values: ; CHECK: i32* %arg %phi1 = phi i32* [ %arg, %entry ], [ %phi2, %while1.then ] br i1 undef, label %while1.end, label %while1.body while1.body: br i1 undef, label %while1.then, label %while1.if while1.if: br label %while1.then while1.then: ; CHECK: PHI %phi2 has values: ; CHECK: i32* %arg %phi2 = phi i32* [ %arg, %while1.if ], [ %phi1, %while1.body ] br label %while1.cond while1.end: br label %while2.cond1 while2.cond1: ; CHECK: PHI %phi3 has values: ; CHECK: i32* %arg %phi3 = phi i32* [ %phi1, %while1.end ], [ %phi5, %while2.then ] br i1 undef, label %while2.end, label %while2.body1 while2.body1: br i1 undef, label %while2.cond2, label %while2.then while2.cond2: ; CHECK: PHI %phi4 has values: ; CHECK: i32* %arg %phi4 = phi i32* [ %phi3, %while2.body1 ], [ %phi4, %while2.if ] br i1 undef, label %while2.then, label %while2.if while2.if: br label %while2.cond2 while2.then: ; CHECK: PHI %phi5 has values: ; CHECK: i32* %arg %phi5 = phi i32* [ %phi3, %while2.body1 ], [ %phi4, %while2.cond2 ] br label %while2.cond1 while2.end: br label %while3.cond1 while3.cond1: ; CHECK: PHI %phi6 has values: ; CHECK: i32* %arg %phi6 = phi i32* [ %phi3, %while2.end ], [ %phi7, %while3.cond2 ] br i1 undef, label %while3.end, label %while3.cond2 while3.cond2: ; CHECK: PHI %phi7 has values: ; CHECK: i32* %arg %phi7 = phi i32* [ %phi6, %while3.cond1 ], [ %phi7, %while3.body ] br i1 undef, label %while3.cond1, label %while3.body while3.body: br label %while3.cond2 while3.end: br label %while4.cond1 while4.cond1: ; CHECK: PHI %phi8 has values: ; CHECK: i32* %arg %phi8 = phi i32* [ %phi6, %while3.end ], [ %phi10, %while4.then ] br i1 undef, label %while4.end, label %while4.if while4.if: br i1 undef, label %while4.cond2, label %while4.then while4.cond2: ; CHECK: PHI %phi9 has values: ; CHECK: i32* %arg %phi9 = phi i32* [ %phi8, %while4.if ], [ %phi9, %while4.body ] br i1 undef, label %while4.then, label %while4.body while4.body: br label %while4.cond2 while4.then: ; CHECK: PHI %phi10 has values: ; CHECK: i32* %arg %phi10 = phi i32* [ %phi8, %while4.if ], [ %phi9, %while4.cond2 ] br label %while4.cond1 while4.end: br label %while5.cond while5.cond: ; CHECK: PHI %phi11 has values: ; CHECK: i32* %arg %phi11 = phi i32* [ %phi8, %while4.end ], [ %phi13, %while5.then ] br i1 undef, label %while5.end, label %while5.body1 while5.body1: br i1 undef, label %while5.if, label %while5.then while5.if: ; CHECK: PHI %phi12 has values: ; CHECK: i32* %arg %phi12 = phi i32* [ %phi11, %while5.body1 ], [ %phi12, %while5.body2 ] br i1 undef, label %while5.then, label %while5.body2 while5.body2: br label %while5.if while5.then: ; CHECK: PHI %phi13 has values: ; CHECK: i32* %arg %phi13 = phi i32* [ %phi11, %while5.body1 ], [ %phi12, %while5.if ] br label %while5.cond while5.end: br label %while6.cond1 while6.cond1: ; CHECK: PHI %phi14 has values: ; CHECK: i32* %arg %phi14 = phi i32* [ %phi11, %while5.end ], [ %phi14, %while6.cond1 ] br i1 undef, label %while6.cond2, label %while6.cond1 while6.cond2: ; CHECK: PHI %phi15 has values: ; CHECK: i32* %arg %phi15 = phi i32* [ %phi14, %while6.cond1 ], [ %phi15, %while6.cond2 ] br label %while6.cond2 }