e40c639190783e84054bb3eaf1756018b8ca63b4
[oota-llvm.git] / test / Transforms / CorrelatedValuePropagation / range.ll
1 ; RUN: opt -correlated-propagation -S < %s | FileCheck %s
2
3 declare i32 @foo()
4
5 define i32 @test1(i32 %a) nounwind {
6   %a.off = add i32 %a, -8
7   %cmp = icmp ult i32 %a.off, 8
8   br i1 %cmp, label %then, label %else
9
10 then:
11   %dead = icmp eq i32 %a, 7
12   br i1 %dead, label %end, label %else
13
14 else:
15   ret i32 1
16
17 end:
18   ret i32 2
19
20 ; CHECK-LABEL: @test1(
21 ; CHECK: then:
22 ; CHECK-NEXT: br i1 false, label %end, label %else
23 }
24
25 define i32 @test2(i32 %a) nounwind {
26   %a.off = add i32 %a, -8
27   %cmp = icmp ult i32 %a.off, 8
28   br i1 %cmp, label %then, label %else
29
30 then:
31   %dead = icmp ugt i32 %a, 15
32   br i1 %dead, label %end, label %else
33
34 else:
35   ret i32 1
36
37 end:
38   ret i32 2
39
40 ; CHECK-LABEL: @test2(
41 ; CHECK: then:
42 ; CHECK-NEXT: br i1 false, label %end, label %else
43 }
44
45 ; CHECK-LABEL: @test3(
46 define i32 @test3(i32 %c) nounwind {
47   %cmp = icmp slt i32 %c, 2
48   br i1 %cmp, label %if.then, label %if.end
49
50 if.then:
51   ret i32 1
52
53 if.end:
54   %cmp1 = icmp slt i32 %c, 3
55   br i1 %cmp1, label %if.then2, label %if.end8
56
57 ; CHECK: if.then2
58 if.then2:
59   %cmp2 = icmp eq i32 %c, 2
60 ; CHECK: br i1 true
61   br i1 %cmp2, label %if.then4, label %if.end6
62
63 ; CHECK: if.end6
64 if.end6:
65   ret i32 2
66
67 if.then4:
68   ret i32 3
69
70 if.end8:
71   ret i32 4
72 }
73
74 ; CHECK-LABEL: @test4(
75 define i32 @test4(i32 %c) nounwind {
76   switch i32 %c, label %sw.default [
77     i32 1, label %sw.bb
78     i32 2, label %sw.bb
79     i32 4, label %sw.bb
80   ]
81
82 ; CHECK: sw.bb
83 sw.bb:
84   %cmp = icmp sge i32 %c, 1
85 ; CHECK: br i1 true
86   br i1 %cmp, label %if.then, label %if.end
87
88 if.then:
89   br label %return
90
91 if.end:
92   br label %return
93
94 sw.default:
95   br label %return
96
97 return:
98   %retval.0 = phi i32 [ 42, %sw.default ], [ 4, %if.then ], [ 9, %if.end ]
99   ret i32 %retval.0
100 }
101
102 ; CHECK-LABEL: @test5(
103 define i1 @test5(i32 %c) nounwind {
104   %cmp = icmp slt i32 %c, 5
105   br i1 %cmp, label %if.then, label %if.end
106
107 if.then:
108   %cmp1 = icmp eq i32 %c, 4
109   br i1 %cmp1, label %if.end, label %if.end8
110
111 if.end:
112   ret i1 true
113
114 if.end8:
115   %cmp2 = icmp eq i32 %c, 3
116   %cmp3 = icmp eq i32 %c, 4
117   %cmp4 = icmp eq i32 %c, 6
118 ; CHECK: %or = or i1 false, false
119   %or = or i1 %cmp3, %cmp4
120 ; CHECK: ret i1 %cmp2
121   ret i1 %cmp2
122 }
123
124 ; CHECK-LABEL: @test6(
125 define i1 @test6(i32 %c) nounwind {
126   %cmp = icmp ule i32 %c, 7
127   br i1 %cmp, label %if.then, label %if.end
128
129 if.then:
130 ; CHECK: icmp eq i32 %c, 6
131 ; CHECK: br i1
132   switch i32 %c, label %if.end [
133     i32 6, label %sw.bb
134     i32 8, label %sw.bb
135   ]
136
137 if.end:
138   ret i1 true
139
140 sw.bb:
141   %cmp2 = icmp eq i32 %c, 6
142 ; CHECK: ret i1 true
143   ret i1 %cmp2
144 }
145
146 ; CHECK-LABEL: @test7(
147 define i1 @test7(i32 %c) nounwind {
148 entry:
149  switch i32 %c, label %sw.default [
150    i32 6, label %sw.bb
151    i32 7, label %sw.bb
152  ]
153
154 sw.bb:
155  ret i1 true
156
157 sw.default:
158  %cmp5 = icmp eq i32 %c, 5
159  %cmp6 = icmp eq i32 %c, 6
160  %cmp7 = icmp eq i32 %c, 7
161  %cmp8 = icmp eq i32 %c, 8
162 ; CHECK: %or = or i1 %cmp5, false
163  %or = or i1 %cmp5, %cmp6
164 ; CHECK: %or2 = or i1 false, %cmp8
165  %or2 = or i1 %cmp7, %cmp8
166  ret i1 false
167 }