Skip to content

Commit 7180453

Browse files
committed
pre-commit tests for range attributes in valuetracking
1 parent 87d14b1 commit 7180453

File tree

3 files changed

+437
-0
lines changed

3 files changed

+437
-0
lines changed

llvm/test/Analysis/ValueTracking/known-non-zero.ll

Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1303,4 +1303,163 @@ 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: [[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+
13061465
declare i32 @llvm.experimental.get.vector.length.i32(i32, i32, i1)

llvm/test/Transforms/InstSimplify/icmp-constant.ll

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1140,3 +1140,137 @@ define <2 x i1> @heterogeneous_constvector(<2 x i8> %x) {
11401140
%c = icmp ult <2 x i8> %x, <i8 undef, i8 poison>
11411141
ret <2 x i1> %c
11421142
}
1143+
1144+
define i1 @icmp_eq_constant_range_attr(i8 range(i8 0, 10) %i) {
1145+
; CHECK-LABEL: @icmp_eq_constant_range_attr(
1146+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[I:%.*]], 10
1147+
; CHECK-NEXT: ret i1 [[CMP]]
1148+
;
1149+
%cmp = icmp eq i8 %i, 10
1150+
ret i1 %cmp
1151+
}
1152+
1153+
define i1 @neg_icmp_eq_constant_range_attr(i8 range(i8 0, 11) %i) {
1154+
; CHECK-LABEL: @neg_icmp_eq_constant_range_attr(
1155+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[I:%.*]], 10
1156+
; CHECK-NEXT: ret i1 [[CMP]]
1157+
;
1158+
%cmp = icmp eq i8 %i, 10
1159+
ret i1 %cmp
1160+
}
1161+
1162+
declare range(i8 1, 0) i8 @returns_non_ten_range_helper()
1163+
declare range(i8 -1, 1) i8 @returns_contain_ten_range_helper()
1164+
1165+
define i1 @icmp_eq_constant_range_return() {
1166+
; CHECK-LABEL: @icmp_eq_constant_range_return(
1167+
; CHECK-NEXT: [[I:%.*]] = call i8 @returns_non_ten_range_helper()
1168+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[I]], 10
1169+
; CHECK-NEXT: ret i1 [[CMP]]
1170+
;
1171+
%i = call i8 @returns_non_ten_range_helper()
1172+
%cmp = icmp eq i8 %i, 10
1173+
ret i1 %cmp
1174+
}
1175+
1176+
define i1 @neg_icmp_eq_constant_range_return() {
1177+
; CHECK-LABEL: @neg_icmp_eq_constant_range_return(
1178+
; CHECK-NEXT: [[I:%.*]] = call i8 @returns_contain_ten_range_helper()
1179+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[I]], 10
1180+
; CHECK-NEXT: ret i1 [[CMP]]
1181+
;
1182+
%i = call i8 @returns_contain_ten_range_helper()
1183+
%cmp = icmp eq i8 %i, 10
1184+
ret i1 %cmp
1185+
}
1186+
1187+
declare i8 @returns_i8_helper()
1188+
1189+
define i1 @icmp_eq_constant_range_call() {
1190+
; CHECK-LABEL: @icmp_eq_constant_range_call(
1191+
; CHECK-NEXT: [[I:%.*]] = call range(i8 0, 10) i8 @returns_i8_helper()
1192+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[I]], 10
1193+
; CHECK-NEXT: ret i1 [[CMP]]
1194+
;
1195+
%i = call range(i8 0, 10) i8 @returns_i8_helper()
1196+
%cmp = icmp eq i8 %i, 10
1197+
ret i1 %cmp
1198+
}
1199+
1200+
define i1 @neg_icmp_eq_constant_range_call() {
1201+
; CHECK-LABEL: @neg_icmp_eq_constant_range_call(
1202+
; CHECK-NEXT: [[I:%.*]] = call range(i8 0, 11) i8 @returns_i8_helper()
1203+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[I]], 10
1204+
; CHECK-NEXT: ret i1 [[CMP]]
1205+
;
1206+
%i = call range(i8 0, 11) i8 @returns_i8_helper()
1207+
%cmp = icmp eq i8 %i, 10
1208+
ret i1 %cmp
1209+
}
1210+
1211+
define <2 x i1> @icmp_eq_constant_range_attr_vec(<2 x i8> range(i8 0, 10) %i) {
1212+
; CHECK-LABEL: @icmp_eq_constant_range_attr_vec(
1213+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[I:%.*]], <i8 10, i8 10>
1214+
; CHECK-NEXT: ret <2 x i1> [[CMP]]
1215+
;
1216+
%cmp = icmp eq <2 x i8> %i, <i8 10, i8 10>
1217+
ret <2 x i1> %cmp
1218+
}
1219+
1220+
define <2 x i1> @neg_icmp_eq_constant_range_attr_vec(<2 x i8> range(i8 0, 11) %i) {
1221+
; CHECK-LABEL: @neg_icmp_eq_constant_range_attr_vec(
1222+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[I:%.*]], <i8 10, i8 10>
1223+
; CHECK-NEXT: ret <2 x i1> [[CMP]]
1224+
;
1225+
%cmp = icmp eq <2 x i8> %i, <i8 10, i8 10>
1226+
ret <2 x i1> %cmp
1227+
}
1228+
1229+
declare range(i8 0, 10) <2 x i8> @returns_non_ten_range_helper_vec()
1230+
declare range(i8 0, 11) <2 x i8> @returns_contain_ten_range_helper_vec()
1231+
1232+
define <2 x i1> @icmp_eq_constant_range_return_vec() {
1233+
; CHECK-LABEL: @icmp_eq_constant_range_return_vec(
1234+
; CHECK-NEXT: [[I:%.*]] = call <2 x i8> @returns_non_ten_range_helper_vec()
1235+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[I]], <i8 10, i8 10>
1236+
; CHECK-NEXT: ret <2 x i1> [[CMP]]
1237+
;
1238+
%i = call <2 x i8> @returns_non_ten_range_helper_vec()
1239+
%cmp = icmp eq <2 x i8> %i, <i8 10, i8 10>
1240+
ret <2 x i1> %cmp
1241+
}
1242+
1243+
define <2 x i1> @neg_icmp_eq_constant_range_return_vec() {
1244+
; CHECK-LABEL: @neg_icmp_eq_constant_range_return_vec(
1245+
; CHECK-NEXT: [[I:%.*]] = call <2 x i8> @returns_contain_ten_range_helper_vec()
1246+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[I]], <i8 10, i8 10>
1247+
; CHECK-NEXT: ret <2 x i1> [[CMP]]
1248+
;
1249+
%i = call <2 x i8> @returns_contain_ten_range_helper_vec()
1250+
%cmp = icmp eq <2 x i8> %i, <i8 10, i8 10>
1251+
ret <2 x i1> %cmp
1252+
}
1253+
1254+
declare <2 x i8> @returns_i8_helper_vec()
1255+
1256+
define <2 x i1> @icmp_eq_constant_range_call_vec() {
1257+
; CHECK-LABEL: @icmp_eq_constant_range_call_vec(
1258+
; CHECK-NEXT: [[I:%.*]] = call range(i8 0, 10) <2 x i8> @returns_i8_helper_vec()
1259+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[I]], <i8 10, i8 10>
1260+
; CHECK-NEXT: ret <2 x i1> [[CMP]]
1261+
;
1262+
%i = call range(i8 0, 10) <2 x i8> @returns_i8_helper_vec()
1263+
%cmp = icmp eq <2 x i8> %i, <i8 10, i8 10>
1264+
ret <2 x i1> %cmp
1265+
}
1266+
1267+
define <2 x i1> @neg_icmp_eq_constant_range_call_vec() {
1268+
; CHECK-LABEL: @neg_icmp_eq_constant_range_call_vec(
1269+
; CHECK-NEXT: [[I:%.*]] = call range(i8 0, 11) <2 x i8> @returns_i8_helper_vec()
1270+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i8> [[I]], <i8 10, i8 10>
1271+
; CHECK-NEXT: ret <2 x i1> [[CMP]]
1272+
;
1273+
%i = call range(i8 0, 11) <2 x i8> @returns_i8_helper_vec()
1274+
%cmp = icmp eq <2 x i8> %i, <i8 10, i8 10>
1275+
ret <2 x i1> %cmp
1276+
}

0 commit comments

Comments
 (0)