@@ -1287,6 +1287,8 @@ define i32 @call_undef_musttail() {
1287
1287
1288
1288
; This is not the builtin fmax, so we don't know anything about its behavior.
1289
1289
1290
+ declare float @fmaxf (float , float )
1291
+
1290
1292
define float @nobuiltin_fmax () {
1291
1293
; CHECK-LABEL: @nobuiltin_fmax(
1292
1294
; CHECK-NEXT: [[M:%.*]] = call float @fmaxf(float 0.000000e+00, float 1.000000e+00) [[ATTR3:#.*]]
@@ -1298,6 +1300,62 @@ define float @nobuiltin_fmax() {
1298
1300
ret float %r
1299
1301
}
1300
1302
1301
- declare float @fmaxf (float , float )
1303
+
1304
+ declare i32 @llvm.ctpop.i32 (i32 )
1305
+ declare <3 x i33 > @llvm.ctpop.v3i33 (<3 x i33 >)
1306
+ declare i1 @llvm.ctpop.i1 (i1 )
1307
+
1308
+ define i32 @ctpop_lowbit (i32 %x ) {
1309
+ ; CHECK-LABEL: @ctpop_lowbit(
1310
+ ; CHECK-NEXT: [[B:%.*]] = and i32 [[X:%.*]], 1
1311
+ ; CHECK-NEXT: [[R:%.*]] = call i32 @llvm.ctpop.i32(i32 [[B]])
1312
+ ; CHECK-NEXT: ret i32 [[R]]
1313
+ ;
1314
+ %b = and i32 %x , 1
1315
+ %r = call i32 @llvm.ctpop.i32 (i32 %b )
1316
+ ret i32 %r
1317
+ }
1318
+
1319
+ define i32 @ctpop_pow2 (i32 %x ) {
1320
+ ; CHECK-LABEL: @ctpop_pow2(
1321
+ ; CHECK-NEXT: [[B:%.*]] = and i32 [[X:%.*]], 4
1322
+ ; CHECK-NEXT: [[R:%.*]] = call i32 @llvm.ctpop.i32(i32 [[B]])
1323
+ ; CHECK-NEXT: ret i32 [[R]]
1324
+ ;
1325
+ %b = and i32 %x , 4
1326
+ %r = call i32 @llvm.ctpop.i32 (i32 %b )
1327
+ ret i32 %r
1328
+ }
1329
+
1330
+ define <3 x i33 > @ctpop_signbit (<3 x i33 > %x ) {
1331
+ ; CHECK-LABEL: @ctpop_signbit(
1332
+ ; CHECK-NEXT: [[B:%.*]] = lshr <3 x i33> [[X:%.*]], <i33 32, i33 32, i33 32>
1333
+ ; CHECK-NEXT: [[R:%.*]] = tail call <3 x i33> @llvm.ctpop.v3i33(<3 x i33> [[B]])
1334
+ ; CHECK-NEXT: ret <3 x i33> [[R]]
1335
+ ;
1336
+ %b = lshr <3 x i33 > %x , <i33 32 , i33 32 , i33 32 >
1337
+ %r = tail call <3 x i33 > @llvm.ctpop.v3i33 (<3 x i33 > %b )
1338
+ ret <3 x i33 > %r
1339
+ }
1340
+
1341
+ define <3 x i33 > @ctpop_notsignbit (<3 x i33 > %x ) {
1342
+ ; CHECK-LABEL: @ctpop_notsignbit(
1343
+ ; CHECK-NEXT: [[B:%.*]] = lshr <3 x i33> [[X:%.*]], <i33 31, i33 31, i33 31>
1344
+ ; CHECK-NEXT: [[R:%.*]] = tail call <3 x i33> @llvm.ctpop.v3i33(<3 x i33> [[B]])
1345
+ ; CHECK-NEXT: ret <3 x i33> [[R]]
1346
+ ;
1347
+ %b = lshr <3 x i33 > %x , <i33 31 , i33 31 , i33 31 >
1348
+ %r = tail call <3 x i33 > @llvm.ctpop.v3i33 (<3 x i33 > %b )
1349
+ ret <3 x i33 > %r
1350
+ }
1351
+
1352
+ define i1 @ctpop_bool (i1 %x ) {
1353
+ ; CHECK-LABEL: @ctpop_bool(
1354
+ ; CHECK-NEXT: [[R:%.*]] = tail call i1 @llvm.ctpop.i1(i1 [[X:%.*]])
1355
+ ; CHECK-NEXT: ret i1 [[R]]
1356
+ ;
1357
+ %r = tail call i1 @llvm.ctpop.i1 (i1 %x )
1358
+ ret i1 %r
1359
+ }
1302
1360
1303
1361
attributes #0 = { nobuiltin readnone }
0 commit comments