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