llvm-project/llvm/test/Analysis/PhiValues/long_phi_chain.ll

143 lines
3.6 KiB
LLVM

; 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
}