@@ -109,6 +109,175 @@ entry:
109
109
ret i64 %z
110
110
}
111
111
112
+ define i8 @cttz_i8 (i8 %A ) {
113
+ ; SLOW-LABEL: @cttz_i8(
114
+ ; SLOW-NEXT: entry:
115
+ ; SLOW-NEXT: [[Z:%.*]] = call i8 @llvm.cttz.i8(i8 [[A:%.*]], i1 false)
116
+ ; SLOW-NEXT: ret i8 [[Z]]
117
+ ;
118
+ ; FAST_TZ-LABEL: @cttz_i8(
119
+ ; FAST_TZ-NEXT: entry:
120
+ ; FAST_TZ-NEXT: [[Z:%.*]] = call i8 @llvm.cttz.i8(i8 [[A:%.*]], i1 false)
121
+ ; FAST_TZ-NEXT: ret i8 [[Z]]
122
+ ;
123
+ ; FAST_LZ-LABEL: @cttz_i8(
124
+ ; FAST_LZ-NEXT: entry:
125
+ ; FAST_LZ-NEXT: [[Z:%.*]] = call i8 @llvm.cttz.i8(i8 [[A:%.*]], i1 false)
126
+ ; FAST_LZ-NEXT: ret i8 [[Z]]
127
+ ;
128
+ ; DEBUGINFO-LABEL: @cttz_i8(
129
+ ; DEBUGINFO-NEXT: entry:
130
+ ; DEBUGINFO-NEXT: [[Z:%.*]] = call i8 @llvm.cttz.i8(i8 [[A:%.*]], i1 false), !dbg [[DBG22:![0-9]+]]
131
+ ; DEBUGINFO-NEXT: #dbg_value(i8 [[Z]], [[META20:![0-9]+]], !DIExpression(), [[DBG22]])
132
+ ; DEBUGINFO-NEXT: ret i8 [[Z]], !dbg [[DBG23:![0-9]+]]
133
+ ;
134
+ entry:
135
+ %z = call i8 @llvm.cttz.i8 (i8 %A , i1 false )
136
+ ret i8 %z
137
+ }
138
+
139
+ define i8 @ctlz_i8 (i8 %A ) {
140
+ ; SLOW-LABEL: @ctlz_i8(
141
+ ; SLOW-NEXT: entry:
142
+ ; SLOW-NEXT: [[A_FR:%.*]] = freeze i8 [[A:%.*]]
143
+ ; SLOW-NEXT: [[CMPZ:%.*]] = icmp eq i8 [[A_FR]], 0
144
+ ; SLOW-NEXT: br i1 [[CMPZ]], label [[COND_END:%.*]], label [[COND_FALSE:%.*]]
145
+ ; SLOW: cond.false:
146
+ ; SLOW-NEXT: [[Z:%.*]] = call i8 @llvm.ctlz.i8(i8 [[A_FR]], i1 true)
147
+ ; SLOW-NEXT: br label [[COND_END]]
148
+ ; SLOW: cond.end:
149
+ ; SLOW-NEXT: [[CTZ:%.*]] = phi i8 [ 8, [[ENTRY:%.*]] ], [ [[Z]], [[COND_FALSE]] ]
150
+ ; SLOW-NEXT: ret i8 [[CTZ]]
151
+ ;
152
+ ; FAST_TZ-LABEL: @ctlz_i8(
153
+ ; FAST_TZ-NEXT: entry:
154
+ ; FAST_TZ-NEXT: [[A_FR:%.*]] = freeze i8 [[A:%.*]]
155
+ ; FAST_TZ-NEXT: [[CMPZ:%.*]] = icmp eq i8 [[A_FR]], 0
156
+ ; FAST_TZ-NEXT: br i1 [[CMPZ]], label [[COND_END:%.*]], label [[COND_FALSE:%.*]]
157
+ ; FAST_TZ: cond.false:
158
+ ; FAST_TZ-NEXT: [[Z:%.*]] = call i8 @llvm.ctlz.i8(i8 [[A_FR]], i1 true)
159
+ ; FAST_TZ-NEXT: br label [[COND_END]]
160
+ ; FAST_TZ: cond.end:
161
+ ; FAST_TZ-NEXT: [[CTZ:%.*]] = phi i8 [ 8, [[ENTRY:%.*]] ], [ [[Z]], [[COND_FALSE]] ]
162
+ ; FAST_TZ-NEXT: ret i8 [[CTZ]]
163
+ ;
164
+ ; FAST_LZ-LABEL: @ctlz_i8(
165
+ ; FAST_LZ-NEXT: entry:
166
+ ; FAST_LZ-NEXT: [[Z:%.*]] = call i8 @llvm.ctlz.i8(i8 [[A:%.*]], i1 false)
167
+ ; FAST_LZ-NEXT: ret i8 [[Z]]
168
+ ;
169
+ ; DEBUGINFO-LABEL: @ctlz_i8(
170
+ ; DEBUGINFO-NEXT: entry:
171
+ ; DEBUGINFO-NEXT: [[A_FR:%.*]] = freeze i8 [[A:%.*]], !dbg [[DBG27:![0-9]+]]
172
+ ; DEBUGINFO-NEXT: [[CMPZ:%.*]] = icmp eq i8 [[A_FR]], 0, !dbg [[DBG27]]
173
+ ; DEBUGINFO-NEXT: br i1 [[CMPZ]], label [[COND_END:%.*]], label [[COND_FALSE:%.*]], !dbg [[DBG27]]
174
+ ; DEBUGINFO: cond.false:
175
+ ; DEBUGINFO-NEXT: [[Z:%.*]] = call i8 @llvm.ctlz.i8(i8 [[A_FR]], i1 true), !dbg [[DBG27]]
176
+ ; DEBUGINFO-NEXT: br label [[COND_END]], !dbg [[DBG28:![0-9]+]]
177
+ ; DEBUGINFO: cond.end:
178
+ ; DEBUGINFO-NEXT: [[CTZ:%.*]] = phi i8 [ 8, [[ENTRY:%.*]] ], [ [[Z]], [[COND_FALSE]] ], !dbg [[DBG28]]
179
+ ; DEBUGINFO-NEXT: #dbg_value(i8 [[CTZ]], [[META26:![0-9]+]], !DIExpression(), [[DBG27]])
180
+ ; DEBUGINFO-NEXT: ret i8 [[CTZ]], !dbg [[DBG28]]
181
+ ;
182
+ entry:
183
+ %z = call i8 @llvm.ctlz.i8 (i8 %A , i1 false )
184
+ ret i8 %z
185
+ }
186
+
187
+ ; As the operand will be promoted by the DAG legalizer, no despeculation when counting
188
+ ; ones.
189
+
190
+ define i8 @ctto_i8_no_despeculation (i8 %A ) {
191
+ ; SLOW-LABEL: @ctto_i8_no_despeculation(
192
+ ; SLOW-NEXT: entry:
193
+ ; SLOW-NEXT: [[A_NOT:%.*]] = xor i8 [[A:%.*]], -1
194
+ ; SLOW-NEXT: [[Z:%.*]] = call i8 @llvm.cttz.i8(i8 [[A_NOT]], i1 false)
195
+ ; SLOW-NEXT: ret i8 [[Z]]
196
+ ;
197
+ ; FAST_TZ-LABEL: @ctto_i8_no_despeculation(
198
+ ; FAST_TZ-NEXT: entry:
199
+ ; FAST_TZ-NEXT: [[A_NOT:%.*]] = xor i8 [[A:%.*]], -1
200
+ ; FAST_TZ-NEXT: [[Z:%.*]] = call i8 @llvm.cttz.i8(i8 [[A_NOT]], i1 false)
201
+ ; FAST_TZ-NEXT: ret i8 [[Z]]
202
+ ;
203
+ ; FAST_LZ-LABEL: @ctto_i8_no_despeculation(
204
+ ; FAST_LZ-NEXT: entry:
205
+ ; FAST_LZ-NEXT: [[A_NOT:%.*]] = xor i8 [[A:%.*]], -1
206
+ ; FAST_LZ-NEXT: [[Z:%.*]] = call i8 @llvm.cttz.i8(i8 [[A_NOT]], i1 false)
207
+ ; FAST_LZ-NEXT: ret i8 [[Z]]
208
+ ;
209
+ ; DEBUGINFO-LABEL: @ctto_i8_no_despeculation(
210
+ ; DEBUGINFO-NEXT: entry:
211
+ ; DEBUGINFO-NEXT: [[A_NOT:%.*]] = xor i8 [[A:%.*]], -1, !dbg [[DBG33:![0-9]+]]
212
+ ; DEBUGINFO-NEXT: #dbg_value(i8 [[A_NOT]], [[META31:![0-9]+]], !DIExpression(), [[DBG33]])
213
+ ; DEBUGINFO-NEXT: [[Z:%.*]] = call i8 @llvm.cttz.i8(i8 [[A_NOT]], i1 false), !dbg [[DBG34:![0-9]+]]
214
+ ; DEBUGINFO-NEXT: #dbg_value(i8 [[Z]], [[META32:![0-9]+]], !DIExpression(), [[DBG34]])
215
+ ; DEBUGINFO-NEXT: ret i8 [[Z]], !dbg [[DBG35:![0-9]+]]
216
+ ;
217
+ entry:
218
+ %A.not = xor i8 %A , -1
219
+ %z = call i8 @llvm.cttz.i8 (i8 %A.not , i1 false )
220
+ ret i8 %z
221
+ }
222
+
223
+ ; despeculation occurs because with CTLZ i8, the DAG legalization is Custom.
224
+
225
+ define i8 @ctlo_i8 (i8 %A ) {
226
+ ; SLOW-LABEL: @ctlo_i8(
227
+ ; SLOW-NEXT: entry:
228
+ ; SLOW-NEXT: [[A_NOT:%.*]] = xor i8 [[A:%.*]], -1
229
+ ; SLOW-NEXT: [[A_NOT_FR:%.*]] = freeze i8 [[A_NOT]]
230
+ ; SLOW-NEXT: [[CMPZ:%.*]] = icmp eq i8 [[A_NOT_FR]], 0
231
+ ; SLOW-NEXT: br i1 [[CMPZ]], label [[COND_END:%.*]], label [[COND_FALSE:%.*]]
232
+ ; SLOW: cond.false:
233
+ ; SLOW-NEXT: [[Z:%.*]] = call i8 @llvm.ctlz.i8(i8 [[A_NOT_FR]], i1 true)
234
+ ; SLOW-NEXT: br label [[COND_END]]
235
+ ; SLOW: cond.end:
236
+ ; SLOW-NEXT: [[CTZ:%.*]] = phi i8 [ 8, [[ENTRY:%.*]] ], [ [[Z]], [[COND_FALSE]] ]
237
+ ; SLOW-NEXT: ret i8 [[CTZ]]
238
+ ;
239
+ ; FAST_TZ-LABEL: @ctlo_i8(
240
+ ; FAST_TZ-NEXT: entry:
241
+ ; FAST_TZ-NEXT: [[A_NOT:%.*]] = xor i8 [[A:%.*]], -1
242
+ ; FAST_TZ-NEXT: [[A_NOT_FR:%.*]] = freeze i8 [[A_NOT]]
243
+ ; FAST_TZ-NEXT: [[CMPZ:%.*]] = icmp eq i8 [[A_NOT_FR]], 0
244
+ ; FAST_TZ-NEXT: br i1 [[CMPZ]], label [[COND_END:%.*]], label [[COND_FALSE:%.*]]
245
+ ; FAST_TZ: cond.false:
246
+ ; FAST_TZ-NEXT: [[Z:%.*]] = call i8 @llvm.ctlz.i8(i8 [[A_NOT_FR]], i1 true)
247
+ ; FAST_TZ-NEXT: br label [[COND_END]]
248
+ ; FAST_TZ: cond.end:
249
+ ; FAST_TZ-NEXT: [[CTZ:%.*]] = phi i8 [ 8, [[ENTRY:%.*]] ], [ [[Z]], [[COND_FALSE]] ]
250
+ ; FAST_TZ-NEXT: ret i8 [[CTZ]]
251
+ ;
252
+ ; FAST_LZ-LABEL: @ctlo_i8(
253
+ ; FAST_LZ-NEXT: entry:
254
+ ; FAST_LZ-NEXT: [[A_NOT:%.*]] = xor i8 [[A:%.*]], -1
255
+ ; FAST_LZ-NEXT: [[Z:%.*]] = call i8 @llvm.ctlz.i8(i8 [[A_NOT]], i1 false)
256
+ ; FAST_LZ-NEXT: ret i8 [[Z]]
257
+ ;
258
+ ; DEBUGINFO-LABEL: @ctlo_i8(
259
+ ; DEBUGINFO-NEXT: entry:
260
+ ; DEBUGINFO-NEXT: [[A_NOT:%.*]] = xor i8 [[A:%.*]], -1, !dbg [[DBG40:![0-9]+]]
261
+ ; DEBUGINFO-NEXT: #dbg_value(i8 [[A_NOT]], [[META38:![0-9]+]], !DIExpression(), [[DBG40]])
262
+ ; DEBUGINFO-NEXT: [[A_NOT_FR:%.*]] = freeze i8 [[A_NOT]], !dbg [[DBG41:![0-9]+]]
263
+ ; DEBUGINFO-NEXT: [[CMPZ:%.*]] = icmp eq i8 [[A_NOT_FR]], 0, !dbg [[DBG41]]
264
+ ; DEBUGINFO-NEXT: br i1 [[CMPZ]], label [[COND_END:%.*]], label [[COND_FALSE:%.*]], !dbg [[DBG41]]
265
+ ; DEBUGINFO: cond.false:
266
+ ; DEBUGINFO-NEXT: [[Z:%.*]] = call i8 @llvm.ctlz.i8(i8 [[A_NOT_FR]], i1 true), !dbg [[DBG41]]
267
+ ; DEBUGINFO-NEXT: br label [[COND_END]], !dbg [[DBG42:![0-9]+]]
268
+ ; DEBUGINFO: cond.end:
269
+ ; DEBUGINFO-NEXT: [[CTZ:%.*]] = phi i8 [ 8, [[ENTRY:%.*]] ], [ [[Z]], [[COND_FALSE]] ], !dbg [[DBG42]]
270
+ ; DEBUGINFO-NEXT: #dbg_value(i8 [[CTZ]], [[META39:![0-9]+]], !DIExpression(), [[DBG41]])
271
+ ; DEBUGINFO-NEXT: ret i8 [[CTZ]], !dbg [[DBG42]]
272
+ ;
273
+ entry:
274
+ %A.not = xor i8 %A , -1
275
+ %z = call i8 @llvm.ctlz.i8 (i8 %A.not , i1 false )
276
+ ret i8 %z
277
+ }
278
+
112
279
declare i64 @llvm.cttz.i64 (i64 , i1 )
113
280
declare i64 @llvm.ctlz.i64 (i64 , i1 )
281
+ declare i8 @llvm.cttz.i8 (i8 , i1 )
282
+ declare i8 @llvm.ctlz.i8 (i8 , i1 )
114
283
0 commit comments