mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 04:32:44 +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
283 lines
5.5 KiB
LLVM
283 lines
5.5 KiB
LLVM
; RUN: opt < %s -passes='print<phi-values>' -disable-output 2>&1 | FileCheck %s
|
|
|
|
@X = common global i32 0
|
|
|
|
; CHECK-LABEL: PHI Values for function: simple
|
|
define void @simple(i32* %ptr) {
|
|
entry:
|
|
br i1 undef, label %if, label %else
|
|
|
|
if:
|
|
br label %end
|
|
|
|
else:
|
|
br label %end
|
|
|
|
end:
|
|
; CHECK: PHI %phi1 has values:
|
|
; CHECK-DAG: i32 0
|
|
; CHECK-DAG: i32 1
|
|
%phi1 = phi i32 [ 0, %if ], [ 1, %else ]
|
|
; CHECK: PHI %phi2 has values:
|
|
; CHECK-DAG: @X
|
|
; CHECK-DAG: %ptr
|
|
%phi2 = phi i32* [ @X, %if ], [ %ptr, %else ]
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: PHI Values for function: chain
|
|
define void @chain() {
|
|
entry:
|
|
br i1 undef, label %if1, label %else1
|
|
|
|
if1:
|
|
br label %middle
|
|
|
|
else1:
|
|
br label %middle
|
|
|
|
middle:
|
|
; CHECK: PHI %phi1 has values:
|
|
; CHECK-DAG: i32 0
|
|
; CHECK-DAG: i32 1
|
|
%phi1 = phi i32 [ 0, %if1 ], [ 1, %else1 ]
|
|
br i1 undef, label %if2, label %else2
|
|
|
|
if2:
|
|
br label %end
|
|
|
|
else2:
|
|
br label %end
|
|
|
|
end:
|
|
; CHECK: PHI %phi2 has values:
|
|
; CHECK-DAG: i32 0
|
|
; CHECK-DAG: i32 1
|
|
; CHECK-DAG: i32 2
|
|
%phi2 = phi i32 [ %phi1, %if2 ], [ 2, %else2 ]
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: PHI Values for function: no_values
|
|
define void @no_values() {
|
|
entry:
|
|
ret void
|
|
|
|
unreachable:
|
|
; CHECK: PHI %phi has values:
|
|
; CHECK-DAG: NONE
|
|
%phi = phi i32 [ %phi, %unreachable ]
|
|
br label %unreachable
|
|
}
|
|
|
|
; CHECK-LABEL: PHI Values for function: simple_loop
|
|
define void @simple_loop() {
|
|
entry:
|
|
br label %loop
|
|
|
|
loop:
|
|
; CHECK: PHI %phi has values:
|
|
; CHECK-DAG: i32 0
|
|
%phi = phi i32 [ 0, %entry ], [ %phi, %loop ]
|
|
br i1 undef, label %loop, label %end
|
|
|
|
end:
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: PHI Values for function: complex_loop
|
|
define void @complex_loop() {
|
|
entry:
|
|
br i1 undef, label %loop, label %end
|
|
|
|
loop:
|
|
; CHECK: PHI %phi1 has values:
|
|
; CHECK-DAG: i32 0
|
|
; CHECK-DAG: i32 1
|
|
%phi1 = phi i32 [ 0, %entry ], [ %phi2, %then ]
|
|
br i1 undef, label %if, label %else
|
|
|
|
if:
|
|
br label %then
|
|
|
|
else:
|
|
br label %then
|
|
|
|
then:
|
|
; CHECK: PHI %phi2 has values:
|
|
; CHECK-DAG: i32 0
|
|
; CHECK-DAG: i32 1
|
|
%phi2 = phi i32 [ %phi1, %if ], [ 1, %else ]
|
|
br i1 undef, label %loop, label %end
|
|
|
|
end:
|
|
; CHECK: PHI %phi3 has values:
|
|
; CHECK-DAG: i32 0
|
|
; CHECK-DAG: i32 1
|
|
; CHECK-DAG: i32 2
|
|
%phi3 = phi i32 [ 2, %entry ], [ %phi2, %then ]
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: PHI Values for function: strange_loop
|
|
define void @strange_loop() {
|
|
entry:
|
|
br i1 undef, label %ifelse, label %inloop
|
|
|
|
loop:
|
|
; CHECK: PHI %phi1 has values:
|
|
; CHECK-DAG: i32 0
|
|
; CHECK-DAG: i32 1
|
|
; CHECK-DAG: i32 2
|
|
; CHECK-DAG: i32 3
|
|
%phi1 = phi i32 [ %phi3, %if ], [ 0, %else ], [ %phi2, %inloop ]
|
|
br i1 undef, label %inloop, label %end
|
|
|
|
inloop:
|
|
; CHECK: PHI %phi2 has values:
|
|
; CHECK-DAG: i32 0
|
|
; CHECK-DAG: i32 1
|
|
; CHECK-DAG: i32 2
|
|
; CHECK-DAG: i32 3
|
|
%phi2 = phi i32 [ %phi1, %loop ], [ 1, %entry ]
|
|
br i1 undef, label %ifelse, label %loop
|
|
|
|
ifelse:
|
|
; CHECK: PHI %phi3 has values:
|
|
; CHECK-DAG: i32 2
|
|
; CHECK-DAG: i32 3
|
|
%phi3 = phi i32 [ 2, %entry ], [ 3, %inloop ]
|
|
br i1 undef, label %if, label %else
|
|
|
|
if:
|
|
br label %loop
|
|
|
|
else:
|
|
br label %loop
|
|
|
|
end:
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: PHI Values for function: mutual_loops
|
|
define void @mutual_loops() {
|
|
entry:
|
|
br i1 undef, label %loop1, label %loop2
|
|
|
|
loop1:
|
|
; CHECK: PHI %phi1 has values:
|
|
; CHECK-DAG: 0
|
|
; CHECK-DAG: 1
|
|
; CHECK-DAG: 2
|
|
; CHECK-DAG: 3
|
|
; CHECK-DAG: 4
|
|
%phi1 = phi i32 [ 0, %entry ], [ %phi2, %loop1.then ], [ %phi3, %loop2.if ]
|
|
br i1 undef, label %loop1.if, label %loop1.else
|
|
|
|
loop1.if:
|
|
br i1 undef, label %loop1.then, label %loop2
|
|
|
|
loop1.else:
|
|
br label %loop1.then
|
|
|
|
loop1.then:
|
|
; CHECK: PHI %phi2 has values:
|
|
; CHECK-DAG: 0
|
|
; CHECK-DAG: 1
|
|
; CHECK-DAG: 2
|
|
; CHECK-DAG: 3
|
|
; CHECK-DAG: 4
|
|
%phi2 = phi i32 [ 1, %loop1.if ], [ %phi1, %loop1.else ]
|
|
br i1 undef, label %loop1, label %end
|
|
|
|
loop2:
|
|
; CHECK: PHI %phi3 has values:
|
|
; CHECK-DAG: 2
|
|
; CHECK-DAG: 3
|
|
; CHECK-DAG: 4
|
|
%phi3 = phi i32 [ 2, %entry ], [ %phi4, %loop2.then ], [ 3, %loop1.if ]
|
|
br i1 undef, label %loop2.if, label %loop2.else
|
|
|
|
loop2.if:
|
|
br i1 undef, label %loop2.then, label %loop1
|
|
|
|
loop2.else:
|
|
br label %loop2.then
|
|
|
|
loop2.then:
|
|
; CHECK: PHI %phi4 has values:
|
|
; CHECK-DAG: 2
|
|
; CHECK-DAG: 3
|
|
; CHECK-DAG: 4
|
|
%phi4 = phi i32 [ 4, %loop2.if ], [ %phi3, %loop2.else ]
|
|
br i1 undef, label %loop2, label %end
|
|
|
|
end:
|
|
; CHECK: PHI %phi5 has values:
|
|
; CHECK-DAG: 0
|
|
; CHECK-DAG: 1
|
|
; CHECK-DAG: 2
|
|
; CHECK-DAG: 3
|
|
; CHECK-DAG: 4
|
|
%phi5 = phi i32 [ %phi2, %loop1.then ], [ %phi4, %loop2.then ]
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: PHI Values for function: nested_loops_several_values
|
|
define void @nested_loops_several_values() {
|
|
entry:
|
|
br label %loop1
|
|
|
|
loop1:
|
|
; CHECK: PHI %phi1 has values:
|
|
; CHECK-DAG: i32 0
|
|
; CHECK-DAG: %add
|
|
%phi1 = phi i32 [ 0, %entry ], [ %phi2, %loop2 ]
|
|
br i1 undef, label %loop2, label %end
|
|
|
|
loop2:
|
|
; CHECK: PHI %phi2 has values:
|
|
; CHECK-DAG: i32 0
|
|
; CHECK-DAG: %add
|
|
%phi2 = phi i32 [ %phi1, %loop1 ], [ %phi3, %loop3 ]
|
|
br i1 undef, label %loop3, label %loop1
|
|
|
|
loop3:
|
|
; CHECK: PHI %phi3 has values:
|
|
; CHECK-DAG: i32 0
|
|
; CHECK-DAG: %add
|
|
%phi3 = phi i32 [ %add, %loop3 ], [ %phi2, %loop2 ]
|
|
%add = add i32 %phi3, 1
|
|
br i1 undef, label %loop3, label %loop2
|
|
|
|
end:
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: PHI Values for function: nested_loops_one_value
|
|
define void @nested_loops_one_value() {
|
|
entry:
|
|
br label %loop1
|
|
|
|
loop1:
|
|
; CHECK: PHI %phi1 has values:
|
|
; CHECK-DAG: i32 0
|
|
%phi1 = phi i32 [ 0, %entry ], [ %phi2, %loop2 ]
|
|
br i1 undef, label %loop2, label %end
|
|
|
|
loop2:
|
|
; CHECK: PHI %phi2 has values:
|
|
; CHECK-DAG: i32 0
|
|
%phi2 = phi i32 [ %phi1, %loop1 ], [ %phi3, %loop3 ]
|
|
br i1 undef, label %loop3, label %loop1
|
|
|
|
loop3:
|
|
; CHECK: PHI %phi3 has values:
|
|
; CHECK-DAG: i32 0
|
|
%phi3 = phi i32 [ 0, %loop3 ], [ %phi2, %loop2 ]
|
|
br i1 undef, label %loop3, label %loop2
|
|
|
|
end:
|
|
ret void
|
|
}
|