[CodeGenPrepare] Removed duplicate logic. SimplifyCFG already knows how to speculate...
[oota-llvm.git] / test / Transforms / SimplifyCFG / R600 / cttz-ctlz.ll
1 ; RUN: opt -S -simplifycfg -mtriple=r600-unknown-unknown -mcpu=SI < %s | FileCheck -check-prefix=SI -check-prefix=ALL %s
2 ; RUN: opt -S -simplifycfg -mtriple=r600-unknown-unknown -mcpu=tonga < %s | FileCheck -check-prefix=SI -check-prefix=ALL %s
3
4
5 define i64 @test1(i64 %A) {
6 ; ALL-LABEL: @test1(
7 ; SI: [[ICMP:%[A-Za-z0-9]+]] = icmp eq i64 %A, 0
8 ; SI-NEXT: [[CTLZ:%[A-Za-z0-9]+]] = tail call i64 @llvm.ctlz.i64(i64 %A, i1 true)
9 ; SI-NEXT: [[SEL:%[A-Za-z0-9.]+]] = select i1 [[ICMP]], i64 64, i64 [[CTLZ]]
10 ; SI-NEXT: ret i64 [[SEL]]
11 entry:
12   %tobool = icmp eq i64 %A, 0
13   br i1 %tobool, label %cond.end, label %cond.true
14
15 cond.true:                                        ; preds = %entry
16   %0 = tail call i64 @llvm.ctlz.i64(i64 %A, i1 true)
17   br label %cond.end
18
19 cond.end:                                         ; preds = %entry, %cond.true
20   %cond = phi i64 [ %0, %cond.true ], [ 64, %entry ]
21   ret i64 %cond
22 }
23
24
25 define i32 @test2(i32 %A) {
26 ; ALL-LABEL: @test2(
27 ; SI: [[ICMP:%[A-Za-z0-9]+]] = icmp eq i32 %A, 0
28 ; SI-NEXT: [[CTLZ:%[A-Za-z0-9]+]] = tail call i32 @llvm.ctlz.i32(i32 %A, i1 true)
29 ; SI-NEXT: [[SEL:%[A-Za-z0-9.]+]] = select i1 [[ICMP]], i32 32, i32 [[CTLZ]]
30 ; SI-NEXT: ret i32 [[SEL]]
31 entry:
32   %tobool = icmp eq i32 %A, 0
33   br i1 %tobool, label %cond.end, label %cond.true
34
35 cond.true:                                        ; preds = %entry
36   %0 = tail call i32 @llvm.ctlz.i32(i32 %A, i1 true)
37   br label %cond.end
38
39 cond.end:                                         ; preds = %entry, %cond.true
40   %cond = phi i32 [ %0, %cond.true ], [ 32, %entry ]
41   ret i32 %cond
42 }
43
44
45 define signext i16 @test3(i16 signext %A) {
46 ; ALL-LABEL: @test3(
47 ; SI: [[ICMP:%[A-Za-z0-9]+]] = icmp eq i16 %A, 0
48 ; SI-NEXT: [[CTLZ:%[A-Za-z0-9]+]] = tail call i16 @llvm.ctlz.i16(i16 %A, i1 true)
49 ; SI-NEXT: [[SEL:%[A-Za-z0-9.]+]] = select i1 [[ICMP]], i16 16, i16 [[CTLZ]]
50 ; SI-NEXT: ret i16 [[SEL]]
51 entry:
52   %tobool = icmp eq i16 %A, 0
53   br i1 %tobool, label %cond.end, label %cond.true
54
55 cond.true:                                        ; preds = %entry
56   %0 = tail call i16 @llvm.ctlz.i16(i16 %A, i1 true)
57   br label %cond.end
58
59 cond.end:                                         ; preds = %entry, %cond.true
60   %cond = phi i16 [ %0, %cond.true ], [ 16, %entry ]
61   ret i16 %cond
62 }
63
64
65 define i64 @test1b(i64 %A) {
66 ; ALL-LABEL: @test1b(
67 ; SI: [[ICMP:%[A-Za-z0-9]+]] = icmp eq i64 %A, 0
68 ; SI-NEXT: [[CTTZ:%[A-Za-z0-9]+]] = tail call i64 @llvm.cttz.i64(i64 %A, i1 true)
69 ; SI-NEXT: [[SEL:%[A-Za-z0-9.]+]] = select i1 [[ICMP]], i64 64, i64 [[CTTZ]]
70 ; SI-NEXT: ret i64 [[SEL]]
71 entry:
72   %tobool = icmp eq i64 %A, 0
73   br i1 %tobool, label %cond.end, label %cond.true
74
75 cond.true:                                        ; preds = %entry
76   %0 = tail call i64 @llvm.cttz.i64(i64 %A, i1 true)
77   br label %cond.end
78
79 cond.end:                                         ; preds = %entry, %cond.true
80   %cond = phi i64 [ %0, %cond.true ], [ 64, %entry ]
81   ret i64 %cond
82 }
83
84
85 define i32 @test2b(i32 %A) {
86 ; ALL-LABEL: @test2b(
87 ; SI: [[ICMP:%[A-Za-z0-9]+]] = icmp eq i32 %A, 0
88 ; SI-NEXT: [[CTTZ:%[A-Za-z0-9]+]] = tail call i32 @llvm.cttz.i32(i32 %A, i1 true)
89 ; SI-NEXT: [[SEL:%[A-Za-z0-9.]+]] = select i1 [[ICMP]], i32 32, i32 [[CTTZ]]
90 ; SI-NEXT: ret i32 [[SEL]]
91 entry:
92   %tobool = icmp eq i32 %A, 0
93   br i1 %tobool, label %cond.end, label %cond.true
94
95 cond.true:                                        ; preds = %entry
96   %0 = tail call i32 @llvm.cttz.i32(i32 %A, i1 true)
97   br label %cond.end
98
99 cond.end:                                         ; preds = %entry, %cond.true
100   %cond = phi i32 [ %0, %cond.true ], [ 32, %entry ]
101   ret i32 %cond
102 }
103
104
105 define signext i16 @test3b(i16 signext %A) {
106 ; ALL-LABEL: @test3b(
107 ; SI: [[ICMP:%[A-Za-z0-9]+]] = icmp eq i16 %A, 0
108 ; SI-NEXT: [[CTTZ:%[A-Za-z0-9]+]] = tail call i16 @llvm.cttz.i16(i16 %A, i1 true)
109 ; SI-NEXT: [[SEL:%[A-Za-z0-9.]+]] = select i1 [[ICMP]], i16 16, i16 [[CTTZ]]
110 ; SI-NEXT: ret i16 [[SEL]]
111 entry:
112   %tobool = icmp eq i16 %A, 0
113   br i1 %tobool, label %cond.end, label %cond.true
114
115 cond.true:                                        ; preds = %entry
116   %0 = tail call i16 @llvm.cttz.i16(i16 %A, i1 true)
117   br label %cond.end
118
119 cond.end:                                         ; preds = %entry, %cond.true
120   %cond = phi i16 [ %0, %cond.true ], [ 16, %entry ]
121   ret i16 %cond
122 }
123
124
125 define i64 @test1c(i64 %A) {
126 ; ALL-LABEL: @test1c(
127 ; ALL: [[ICMP:%[A-Za-z0-9]+]] = icmp eq i64 %A, 0
128 ; ALL-NEXT: [[CTLZ:%[A-Za-z0-9]+]] = tail call i64 @llvm.ctlz.i64(i64 %A, i1 true)
129 ; ALL-NEXT: [[SEL:%[A-Za-z0-9.]+]] = select i1 [[ICMP]], i64 63, i64 [[CTLZ]]
130 ; ALL-NEXT: ret i64 [[SEL]]
131 entry:
132   %tobool = icmp eq i64 %A, 0
133   br i1 %tobool, label %cond.end, label %cond.true
134
135 cond.true:                                        ; preds = %entry
136   %0 = tail call i64 @llvm.ctlz.i64(i64 %A, i1 true)
137   br label %cond.end
138
139 cond.end:                                         ; preds = %entry, %cond.true
140   %cond = phi i64 [ %0, %cond.true ], [ 63, %entry ]
141   ret i64 %cond
142 }
143
144 define i32 @test2c(i32 %A) {
145 ; ALL-LABEL: @test2c(
146 ; ALL: [[ICMP:%[A-Za-z0-9]+]] = icmp eq i32 %A, 0
147 ; ALL-NEXT: [[CTLZ:%[A-Za-z0-9]+]] = tail call i32 @llvm.ctlz.i32(i32 %A, i1 true)
148 ; ALL-NEXT: [[SEL:%[A-Za-z0-9.]+]] = select i1 [[ICMP]], i32 31, i32 [[CTLZ]]
149 ; ALL-NEXT: ret i32 [[SEL]]
150 entry:
151   %tobool = icmp eq i32 %A, 0
152   br i1 %tobool, label %cond.end, label %cond.true
153
154 cond.true:                                        ; preds = %entry
155   %0 = tail call i32 @llvm.ctlz.i32(i32 %A, i1 true)
156   br label %cond.end
157
158 cond.end:                                         ; preds = %entry, %cond.true
159   %cond = phi i32 [ %0, %cond.true ], [ 31, %entry ]
160   ret i32 %cond
161 }
162
163
164 define signext i16 @test3c(i16 signext %A) {
165 ; ALL-LABEL: @test3c(
166 ; ALL: [[ICMP:%[A-Za-z0-9]+]] = icmp eq i16 %A, 0
167 ; ALL-NEXT: [[CTLZ:%[A-Za-z0-9]+]] = tail call i16 @llvm.ctlz.i16(i16 %A, i1 true)
168 ; ALL-NEXT: [[SEL:%[A-Za-z0-9.]+]] = select i1 [[ICMP]], i16 15, i16 [[CTLZ]]
169 ; ALL-NEXT: ret i16 [[SEL]]
170 entry:
171   %tobool = icmp eq i16 %A, 0
172   br i1 %tobool, label %cond.end, label %cond.true
173
174 cond.true:                                        ; preds = %entry
175   %0 = tail call i16 @llvm.ctlz.i16(i16 %A, i1 true)
176   br label %cond.end
177
178 cond.end:                                         ; preds = %entry, %cond.true
179   %cond = phi i16 [ %0, %cond.true ], [ 15, %entry ]
180   ret i16 %cond
181 }
182
183
184 define i64 @test1d(i64 %A) {
185 ; ALL-LABEL: @test1d(
186 ; ALL: [[ICMP:%[A-Za-z0-9]+]] = icmp eq i64 %A, 0
187 ; ALL-NEXT: [[CTTZ:%[A-Za-z0-9]+]] = tail call i64 @llvm.cttz.i64(i64 %A, i1 true)
188 ; ALL-NEXT: [[SEL:%[A-Za-z0-9.]+]] = select i1 [[ICMP]], i64 63, i64 [[CTTZ]]
189 ; ALL-NEXT: ret i64 [[SEL]]
190 entry:
191   %tobool = icmp eq i64 %A, 0
192   br i1 %tobool, label %cond.end, label %cond.true
193
194 cond.true:                                        ; preds = %entry
195   %0 = tail call i64 @llvm.cttz.i64(i64 %A, i1 true)
196   br label %cond.end
197
198 cond.end:                                         ; preds = %entry, %cond.true
199   %cond = phi i64 [ %0, %cond.true ], [ 63, %entry ]
200   ret i64 %cond
201 }
202
203
204 define i32 @test2d(i32 %A) {
205 ; ALL-LABEL: @test2d(
206 ; ALL: [[ICMP:%[A-Za-z0-9]+]] = icmp eq i32 %A, 0
207 ; ALL-NEXT: [[CTTZ:%[A-Za-z0-9]+]] = tail call i32 @llvm.cttz.i32(i32 %A, i1 true)
208 ; ALL-NEXT: [[SEL:%[A-Za-z0-9.]+]] = select i1 [[ICMP]], i32 31, i32 [[CTTZ]]
209 ; ALL-NEXT: ret i32 [[SEL]]
210 entry:
211   %tobool = icmp eq i32 %A, 0
212   br i1 %tobool, label %cond.end, label %cond.true
213
214 cond.true:                                        ; preds = %entry
215   %0 = tail call i32 @llvm.cttz.i32(i32 %A, i1 true)
216   br label %cond.end
217
218 cond.end:                                         ; preds = %entry, %cond.true
219   %cond = phi i32 [ %0, %cond.true ], [ 31, %entry ]
220   ret i32 %cond
221 }
222
223
224 define signext i16 @test3d(i16 signext %A) {
225 ; ALL-LABEL: @test3d(
226 ; ALL: [[ICMP:%[A-Za-z0-9]+]] = icmp eq i16 %A, 0
227 ; ALL-NEXT: [[CTTZ:%[A-Za-z0-9]+]] = tail call i16 @llvm.cttz.i16(i16 %A, i1 true)
228 ; ALL-NEXT: [[SEL:%[A-Za-z0-9.]+]] = select i1 [[ICMP]], i16 15, i16 [[CTTZ]]
229 ; ALL-NEXT: ret i16 [[SEL]]
230 entry:
231   %tobool = icmp eq i16 %A, 0
232   br i1 %tobool, label %cond.end, label %cond.true
233
234 cond.true:                                        ; preds = %entry
235   %0 = tail call i16 @llvm.cttz.i16(i16 %A, i1 true)
236   br label %cond.end
237
238 cond.end:                                         ; preds = %entry, %cond.true
239   %cond = phi i16 [ %0, %cond.true ], [ 15, %entry ]
240   ret i16 %cond
241 }
242
243
244 declare i64 @llvm.ctlz.i64(i64, i1)
245 declare i32 @llvm.ctlz.i32(i32, i1)
246 declare i16 @llvm.ctlz.i16(i16, i1)
247 declare i64 @llvm.cttz.i64(i64, i1)
248 declare i32 @llvm.cttz.i32(i32, i1)
249 declare i16 @llvm.cttz.i16(i16, i1)