@@ -1303,4 +1303,163 @@ define <2 x i1> @range_metadata_vec(ptr %p, <2 x i32> %x) {
1303
1303
ret <2 x i1 > %cmp
1304
1304
}
1305
1305
1306
+ define i1 @range_attr (i8 range(i8 1 , 0 ) %x , i8 %y ) {
1307
+ ; CHECK-LABEL: @range_attr(
1308
+ ; CHECK-NEXT: [[I:%.*]] = or i8 [[Y:%.*]], [[X:%.*]]
1309
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[I]], 0
1310
+ ; CHECK-NEXT: ret i1 [[CMP]]
1311
+ ;
1312
+ %or = or i8 %y , %x
1313
+ %cmp = icmp eq i8 %or , 0
1314
+ ret i1 %cmp
1315
+ }
1316
+
1317
+ define i1 @neg_range_attr (i8 range(i8 -1 , 1 ) %x , i8 %y ) {
1318
+ ; CHECK-LABEL: @neg_range_attr(
1319
+ ; CHECK-NEXT: [[I:%.*]] = or i8 [[Y:%.*]], [[X:%.*]]
1320
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[I]], 0
1321
+ ; CHECK-NEXT: ret i1 [[CMP]]
1322
+ ;
1323
+ %or = or i8 %y , %x
1324
+ %cmp = icmp eq i8 %or , 0
1325
+ ret i1 %cmp
1326
+ }
1327
+
1328
+ declare range(i8 1 , 0 ) i8 @returns_non_zero_range_helper ()
1329
+ declare range(i8 -1 , 1 ) i8 @returns_contain_zero_range_helper ()
1330
+
1331
+ define i1 @range_return (i8 %y ) {
1332
+ ; CHECK-LABEL: @range_return(
1333
+ ; CHECK-NEXT: [[I:%.*]] = call i8 @returns_non_zero_range_helper()
1334
+ ; CHECK-NEXT: [[OR:%.*]] = or i8 [[Y:%.*]], [[I]]
1335
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[OR]], 0
1336
+ ; CHECK-NEXT: ret i1 [[CMP]]
1337
+ ;
1338
+ %x = call i8 @returns_non_zero_range_helper ()
1339
+ %or = or i8 %y , %x
1340
+ %cmp = icmp eq i8 %or , 0
1341
+ ret i1 %cmp
1342
+ }
1343
+
1344
+ define i1 @neg_range_return (i8 %y ) {
1345
+ ; CHECK-LABEL: @neg_range_return(
1346
+ ; CHECK-NEXT: [[I:%.*]] = call i8 @returns_contain_zero_range_helper()
1347
+ ; CHECK-NEXT: [[OR:%.*]] = or i8 [[Y:%.*]], [[I]]
1348
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[OR]], 0
1349
+ ; CHECK-NEXT: ret i1 [[CMP]]
1350
+ ;
1351
+ %x = call i8 @returns_contain_zero_range_helper ()
1352
+ %or = or i8 %y , %x
1353
+ %cmp = icmp eq i8 %or , 0
1354
+ ret i1 %cmp
1355
+ }
1356
+
1357
+ declare i8 @returns_i8_helper ()
1358
+
1359
+ define i1 @range_call (i8 %y ) {
1360
+ ; CHECK-LABEL: @range_call(
1361
+ ; CHECK-NEXT: [[I:%.*]] = call range(i8 1, 0) i8 @returns_i8_helper()
1362
+ ; CHECK-NEXT: [[OR:%.*]] = or i8 [[Y:%.*]], [[I]]
1363
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[OR]], 0
1364
+ ; CHECK-NEXT: ret i1 [[CMP]]
1365
+ ;
1366
+ %x = call range(i8 1 , 0 ) i8 @returns_i8_helper ()
1367
+ %or = or i8 %y , %x
1368
+ %cmp = icmp eq i8 %or , 0
1369
+ ret i1 %cmp
1370
+ }
1371
+
1372
+ define i1 @neg_range_call (i8 %y ) {
1373
+ ; CHECK-LABEL: @neg_range_call(
1374
+ ; CHECK-NEXT: [[I:%.*]] = call range(i8 -1, 1) i8 @returns_i8_helper()
1375
+ ; CHECK-NEXT: [[OR:%.*]] = or i8 [[Y:%.*]], [[I]]
1376
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[OR]], 0
1377
+ ; CHECK-NEXT: ret i1 [[CMP]]
1378
+ ;
1379
+ %x = call range(i8 -1 , 1 ) i8 @returns_i8_helper ()
1380
+ %or = or i8 %y , %x
1381
+ %cmp = icmp eq i8 %or , 0
1382
+ ret i1 %cmp
1383
+ }
1384
+
1385
+ define <2 x i1 > @range_attr_vec (<2 x i8 > range(i8 1 , 0 ) %x , <2 x i8 > %y ) {
1386
+ ; CHECK-LABEL: @range_attr_vec(
1387
+ ; CHECK-NEXT: [[OR:%.*]] = or <2 x i8> [[Y:%.*]], [[X:%.*]]
1388
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i8> [[OR]], zeroinitializer
1389
+ ; CHECK-NEXT: ret <2 x i1> [[CMP]]
1390
+ ;
1391
+ %or = or <2 x i8 > %y , %x
1392
+ %cmp = icmp ne <2 x i8 > %or , zeroinitializer
1393
+ ret <2 x i1 > %cmp
1394
+ }
1395
+
1396
+ define <2 x i1 > @neg_range_attr_vec (<2 x i8 > range(i8 -1 , 1 ) %x , <2 x i8 > %y ) {
1397
+ ; CHECK-LABEL: @neg_range_attr_vec(
1398
+ ; CHECK-NEXT: [[OR:%.*]] = or <2 x i8> [[Y:%.*]], [[X:%.*]]
1399
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i8> [[OR]], zeroinitializer
1400
+ ; CHECK-NEXT: ret <2 x i1> [[CMP]]
1401
+ ;
1402
+ %or = or <2 x i8 > %y , %x
1403
+ %cmp = icmp ne <2 x i8 > %or , zeroinitializer
1404
+ ret <2 x i1 > %cmp
1405
+ }
1406
+
1407
+ declare range(i8 1 , 0 ) <2 x i8 > @returns_non_zero_range_helper_vec ()
1408
+ declare range(i8 -1 , 1 ) <2 x i8 > @returns_contain_zero_range_helper_vec ()
1409
+
1410
+ define <2 x i1 > @range_return_vec (<2 x i8 > %y ) {
1411
+ ; CHECK-LABEL: @range_return_vec(
1412
+ ; CHECK-NEXT: [[I:%.*]] = call <2 x i8> @returns_non_zero_range_helper_vec()
1413
+ ; CHECK-NEXT: [[OR:%.*]] = or <2 x i8> [[Y:%.*]], [[I]]
1414
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i8> [[OR]], zeroinitializer
1415
+ ; CHECK-NEXT: ret <2 x i1> [[CMP]]
1416
+ ;
1417
+ %x = call <2 x i8 > @returns_non_zero_range_helper_vec ()
1418
+ %or = or <2 x i8 > %y , %x
1419
+ %cmp = icmp ne <2 x i8 > %or , zeroinitializer
1420
+ ret <2 x i1 > %cmp
1421
+ }
1422
+
1423
+ define <2 x i1 > @neg_range_return_vec (<2 x i8 > %y ) {
1424
+ ; CHECK-LABEL: @neg_range_return_vec(
1425
+ ; CHECK-NEXT: [[I:%.*]] = call <2 x i8> @returns_contain_zero_range_helper_vec()
1426
+ ; CHECK-NEXT: [[OR:%.*]] = or <2 x i8> [[Y:%.*]], [[I]]
1427
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i8> [[OR]], zeroinitializer
1428
+ ; CHECK-NEXT: ret <2 x i1> [[CMP]]
1429
+ ;
1430
+ %x = call <2 x i8 > @returns_contain_zero_range_helper_vec ()
1431
+ %or = or <2 x i8 > %y , %x
1432
+ %cmp = icmp ne <2 x i8 > %or , zeroinitializer
1433
+ ret <2 x i1 > %cmp
1434
+ }
1435
+
1436
+ declare <2 x i8 > @returns_i8_helper_vec ()
1437
+
1438
+ define <2 x i1 > @range_call_vec (<2 x i8 > %y ) {
1439
+ ; CHECK-LABEL: @range_call_vec(
1440
+ ; CHECK-NEXT: [[I:%.*]] = call range(i8 1, 0) <2 x i8> @returns_i8_helper_vec()
1441
+ ; CHECK-NEXT: [[OR:%.*]] = or <2 x i8> [[Y:%.*]], [[I]]
1442
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i8> [[OR]], zeroinitializer
1443
+ ; CHECK-NEXT: ret <2 x i1> [[CMP]]
1444
+ ;
1445
+ %x = call range(i8 1 , 0 ) <2 x i8 > @returns_i8_helper_vec ()
1446
+ %or = or <2 x i8 > %y , %x
1447
+ %cmp = icmp ne <2 x i8 > %or , zeroinitializer
1448
+ ret <2 x i1 > %cmp
1449
+ }
1450
+
1451
+ define <2 x i1 > @neg_range_call_vec (<2 x i8 > %y ) {
1452
+ ; CHECK-LABEL: @neg_range_call_vec(
1453
+ ; CHECK-NEXT: [[I:%.*]] = call range(i8 -1, 1) <2 x i8> @returns_i8_helper_vec()
1454
+ ; CHECK-NEXT: [[OR:%.*]] = or <2 x i8> [[Y:%.*]], [[I]]
1455
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i8> [[OR]], zeroinitializer
1456
+ ; CHECK-NEXT: ret <2 x i1> [[CMP]]
1457
+ ;
1458
+ %x = call range(i8 -1 , 1 ) <2 x i8 > @returns_i8_helper_vec ()
1459
+ %or = or <2 x i8 > %y , %x
1460
+ %cmp = icmp ne <2 x i8 > %or , zeroinitializer
1461
+ ret <2 x i1 > %cmp
1462
+ }
1463
+
1464
+
1306
1465
declare i32 @llvm.experimental.get.vector.length.i32 (i32 , i32 , i1 )
0 commit comments