diff options
Diffstat (limited to 'llvm/test/Analysis/PhiValues/basic.ll')
-rw-r--r-- | llvm/test/Analysis/PhiValues/basic.ll | 282 |
1 files changed, 282 insertions, 0 deletions
diff --git a/llvm/test/Analysis/PhiValues/basic.ll b/llvm/test/Analysis/PhiValues/basic.ll new file mode 100644 index 00000000000..ca013828368 --- /dev/null +++ b/llvm/test/Analysis/PhiValues/basic.ll @@ -0,0 +1,282 @@ +; 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 +} |