Remove an unused X86ISD node type.
[oota-llvm.git] / test / Transforms / SimplifyCFG / PredictNestedBranch.ll
1
2 ; RUN: opt < %s -simplifycfg -dce -S | FileCheck %s
3
4 ; Test that when == is true, all 6 comparisons evaluate to true or false
5 ; ie, a == b implies a > b is false, but a >= b is true, and so on
6 define void @testEqTrue(i32 %a, i32 %b) {
7 ; CHECK: @testEqTrue
8 ; CHECK: icmp eq i32 %a, %b
9 ; CHECK: call void @_Z1gi(i32 0)
10 ; a == b implies a == b
11 ; CHECK-NEXT: call void @_Z1gi(i32 1)
12 ; a == b implies a >= b
13 ; CHECK-NEXT: call void @_Z1gi(i32 3)
14 ; a == b implies a <= b
15 ; CHECK-NEXT: call void @_Z1gi(i32 4)
16 ; CHECK: ret void
17 entry:
18   %cmp = icmp eq i32 %a, %b
19   br i1 %cmp, label %if.then, label %if.end18
20
21 if.then:                                          ; preds = %entry
22   call void @_Z1gi(i32 0)
23   %cmp1 = icmp eq i32 %a, %b
24   br i1 %cmp1, label %if.then2, label %if.end
25
26 if.then2:                                         ; preds = %if.then
27   call void @_Z1gi(i32 1)
28   br label %if.end
29
30 if.end:                                           ; preds = %if.then2, %if.then
31   %cmp3 = icmp ne i32 %a, %b
32   br i1 %cmp3, label %if.then4, label %if.end5
33
34 if.then4:                                         ; preds = %if.end
35   call void @_Z1gi(i32 2)
36   br label %if.end5
37
38 if.end5:                                          ; preds = %if.then4, %if.end
39   %cmp6 = icmp sge i32 %a, %b
40   br i1 %cmp6, label %if.then7, label %if.end8
41
42 if.then7:                                         ; preds = %if.end5
43   call void @_Z1gi(i32 3)
44   br label %if.end8
45
46 if.end8:                                          ; preds = %if.then7, %if.end5
47   %cmp9 = icmp sle i32 %a, %b
48   br i1 %cmp9, label %if.then10, label %if.end11
49
50 if.then10:                                        ; preds = %if.end8
51   call void @_Z1gi(i32 4)
52   br label %if.end11
53
54 if.end11:                                         ; preds = %if.then10, %if.end8
55   %cmp12 = icmp sgt i32 %a, %b
56   br i1 %cmp12, label %if.then13, label %if.end14
57
58 if.then13:                                        ; preds = %if.end11
59   call void @_Z1gi(i32 5)
60   br label %if.end14
61
62 if.end14:                                         ; preds = %if.then13, %if.end11
63   %cmp15 = icmp slt i32 %a, %b
64   br i1 %cmp15, label %if.then16, label %if.end18
65
66 if.then16:                                        ; preds = %if.end14
67   call void @_Z1gi(i32 6)
68   br label %if.end18
69
70 if.end18:                                         ; preds = %if.end14, %if.then16, %entry
71   ret void
72 }
73
74 ; Test that when == is false, all 6 comparisons evaluate to true or false
75 ; ie, a == b implies a > b is false, but a >= b is true, and so on
76 define void @testEqFalse(i32 %a, i32 %b) {
77 ; CHECK: @testEqFalse
78 ; CHECK: icmp eq i32 %a, %b
79 ; CHECK: call void @_Z1gi(i32 0)
80 ; CHECK-NOT: call void @_Z1gi(i32 1)
81 ; CHECK-NOT: icmp ne
82 ; CHECK: call void @_Z1gi(i32 2)
83 ; CHECK: icmp sge
84 ; CHECK: call void @_Z1gi(i32 3)
85 ; CHECK: icmp sle
86 ; CHECK: call void @_Z1gi(i32 4)
87 ; CHECK: icmp sgt
88 ; CHECK: call void @_Z1gi(i32 5)
89 ; CHECK: icmp slt
90 ; CHECK: call void @_Z1gi(i32 6)
91 ; CHECK: ret void
92 entry:
93   %cmp = icmp eq i32 %a, %b
94   br i1 %cmp, label %if.then, label %if.else
95
96 if.then:                                          ; preds = %entry
97   call void @_Z1gi(i32 0)
98   br label %if.end18
99   
100 if.else:
101   %cmp1 = icmp eq i32 %a, %b
102   br i1 %cmp1, label %if.then2, label %if.end
103
104 if.then2:                                         ; preds = %if.then
105   call void @_Z1gi(i32 1)
106   br label %if.end
107
108 if.end:                                           ; preds = %if.then2, %if.then
109   %cmp3 = icmp ne i32 %a, %b
110   br i1 %cmp3, label %if.then4, label %if.end5
111
112 if.then4:                                         ; preds = %if.end
113   call void @_Z1gi(i32 2)
114   br label %if.end5
115
116 if.end5:                                          ; preds = %if.then4, %if.end
117   %cmp6 = icmp sge i32 %a, %b
118   br i1 %cmp6, label %if.then7, label %if.end8
119
120 if.then7:                                         ; preds = %if.end5
121   call void @_Z1gi(i32 3)
122   br label %if.end8
123
124 if.end8:                                          ; preds = %if.then7, %if.end5
125   %cmp9 = icmp sle i32 %a, %b
126   br i1 %cmp9, label %if.then10, label %if.end11
127
128 if.then10:                                        ; preds = %if.end8
129   call void @_Z1gi(i32 4)
130   br label %if.end11
131
132 if.end11:                                         ; preds = %if.then10, %if.end8
133   %cmp12 = icmp sgt i32 %a, %b
134   br i1 %cmp12, label %if.then13, label %if.end14
135
136 if.then13:                                        ; preds = %if.end11
137   call void @_Z1gi(i32 5)
138   br label %if.end14
139
140 if.end14:                                         ; preds = %if.then13, %if.end11
141   %cmp15 = icmp slt i32 %a, %b
142   br i1 %cmp15, label %if.then16, label %if.end18
143
144 if.then16:                                        ; preds = %if.end14
145   call void @_Z1gi(i32 6)
146   br label %if.end18
147
148 if.end18:                                         ; preds = %if.end14, %if.then16, %entry
149   ret void
150 }
151
152 declare void @_Z1gi(i32)