mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
365ebcbf1a
This pass is being added in order to make the information available to BasicAA, which can't do caching of this information itself, but possibly this information may be useful for other passes. Incorporates code based on Daniel Berlin's implementation of Tarjan's algorithm. Differential Revision: https://reviews.llvm.org/D47893 llvm-svn: 335857
143 lines
3.6 KiB
LLVM
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
|
|
}
|