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