merge two tests.
[oota-llvm.git] / test / Transforms / JumpThreading / basic.ll
1 ; RUN: opt < %s -jump-threading -S | FileCheck %s
2 ; There should be no uncond branches left.
3 ; RUN: opt < %s -jump-threading -S | not grep {br label}
4
5 declare i32 @f1()
6 declare i32 @f2()
7 declare void @f3()
8
9 define i32 @test1(i1 %cond) {
10 ; CHECK: @test1
11
12         br i1 %cond, label %T1, label %F1
13
14 T1:
15         %v1 = call i32 @f1()
16         br label %Merge
17
18 F1:
19         %v2 = call i32 @f2()
20         br label %Merge
21
22 Merge:
23         %A = phi i1 [true, %T1], [false, %F1]
24         %B = phi i32 [%v1, %T1], [%v2, %F1]
25         br i1 %A, label %T2, label %F2
26
27 T2:
28 ; CHECK: T2:
29 ; CHECK: ret i32 %v1
30         call void @f3()
31         ret i32 %B
32
33 F2:
34 ; CHECK: F2:
35 ; CHECK: ret i32 %v2
36         ret i32 %B
37 }
38
39
40 ;; cond is known false on Entry -> F1 edge!
41 define i32 @test2(i1 %cond) {
42 ; CHECK: @test2
43 Entry:
44         br i1 %cond, label %T1, label %F1
45
46 T1:
47 ; CHECK: %v1 = call i32 @f1()
48 ; CHECK: ret i32 47
49         %v1 = call i32 @f1()
50         br label %Merge
51
52 F1:
53         br i1 %cond, label %Merge, label %F2
54
55 Merge:
56         %B = phi i32 [47, %T1], [192, %F1]
57         ret i32 %B
58
59 F2:
60         call void @f3()
61         ret i32 12
62 }
63
64
65 ; Undef handling.
66 define i32 @test3(i1 %cond) {
67 ; CHECK: @test3
68 ; CHECK-NEXT: T1:
69 ; CHECK-NEXT: ret i32 42
70         br i1 undef, label %T1, label %F1
71
72 T1:
73         ret i32 42
74
75 F1:
76         ret i32 17
77 }