Skip to content

Commit 4efdbef

Browse files
committed
[ValueTracking] Add tests for computing knownbits from (icmp upred (add/sub nuw X, Y), C); NFC
1 parent b865960 commit 4efdbef

File tree

1 file changed

+225
-0
lines changed

1 file changed

+225
-0
lines changed

llvm/test/Transforms/InstCombine/known-bits.ll

Lines changed: 225 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1195,5 +1195,230 @@ define i1 @extract_value_smul_fail(i8 %xx, i8 %yy) {
11951195
ret i1 %r
11961196
}
11971197

1198+
define i8 @test_icmp_add(i8 %n, i8 %n2, i8 %other) {
1199+
; CHECK-LABEL: @test_icmp_add(
1200+
; CHECK-NEXT: entry:
1201+
; CHECK-NEXT: [[N_ADD:%.*]] = add nuw i8 [[N:%.*]], [[N2:%.*]]
1202+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[N_ADD]], 32
1203+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
1204+
; CHECK: if.then:
1205+
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
1206+
; CHECK-NEXT: ret i8 [[R]]
1207+
; CHECK: if.else:
1208+
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
1209+
;
1210+
entry:
1211+
%n_add = add nuw i8 %n, %n2
1212+
%cmp = icmp ult i8 %n_add, 32
1213+
br i1 %cmp, label %if.then, label %if.else
1214+
1215+
if.then:
1216+
%r = and i8 %n, 32
1217+
ret i8 %r
1218+
1219+
if.else:
1220+
ret i8 %other
1221+
}
1222+
1223+
define i8 @test_icmp_add2(i8 %n, i8 %n2, i8 %other) {
1224+
; CHECK-LABEL: @test_icmp_add2(
1225+
; CHECK-NEXT: entry:
1226+
; CHECK-NEXT: [[N_ADD:%.*]] = add nuw i8 [[N:%.*]], [[N2:%.*]]
1227+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[N_ADD]], 14
1228+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
1229+
; CHECK: if.then:
1230+
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
1231+
; CHECK: if.else:
1232+
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
1233+
; CHECK-NEXT: ret i8 [[R]]
1234+
;
1235+
entry:
1236+
%n_add = add nuw i8 %n, %n2
1237+
%cmp = icmp uge i8 %n_add, 15
1238+
br i1 %cmp, label %if.then, label %if.else
1239+
1240+
if.then:
1241+
ret i8 %other
1242+
if.else:
1243+
%r = and i8 %n, 32
1244+
ret i8 %r
1245+
1246+
}
1247+
1248+
define i8 @test_icmp_add_fail_bad_range(i8 %n, i8 %n2, i8 %other) {
1249+
; CHECK-LABEL: @test_icmp_add_fail_bad_range(
1250+
; CHECK-NEXT: entry:
1251+
; CHECK-NEXT: [[N_ADD:%.*]] = add nuw i8 [[N:%.*]], [[N2:%.*]]
1252+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[N_ADD]], 33
1253+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
1254+
; CHECK: if.then:
1255+
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
1256+
; CHECK-NEXT: ret i8 [[R]]
1257+
; CHECK: if.else:
1258+
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
1259+
;
1260+
entry:
1261+
%n_add = add nuw i8 %n, %n2
1262+
%cmp = icmp ule i8 %n_add, 32
1263+
br i1 %cmp, label %if.then, label %if.else
1264+
1265+
if.then:
1266+
%r = and i8 %n, 32
1267+
ret i8 %r
1268+
1269+
if.else:
1270+
ret i8 %other
1271+
}
1272+
1273+
define i8 @test_icmp_add_fail_bad_pred(i8 %n, i8 %n2, i8 %other) {
1274+
; CHECK-LABEL: @test_icmp_add_fail_bad_pred(
1275+
; CHECK-NEXT: entry:
1276+
; CHECK-NEXT: [[N_ADD:%.*]] = add nuw i8 [[N:%.*]], [[N2:%.*]]
1277+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[N_ADD]], 32
1278+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
1279+
; CHECK: if.then:
1280+
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
1281+
; CHECK-NEXT: ret i8 [[R]]
1282+
; CHECK: if.else:
1283+
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
1284+
;
1285+
entry:
1286+
%n_add = add nuw i8 %n, %n2
1287+
%cmp = icmp ugt i8 %n_add, 32
1288+
br i1 %cmp, label %if.then, label %if.else
1289+
1290+
if.then:
1291+
%r = and i8 %n, 32
1292+
ret i8 %r
1293+
1294+
if.else:
1295+
ret i8 %other
1296+
}
1297+
1298+
define i8 @test_icmp_sub(i8 %n, i8 %n2, i8 %other) {
1299+
; CHECK-LABEL: @test_icmp_sub(
1300+
; CHECK-NEXT: entry:
1301+
; CHECK-NEXT: [[N_AND:%.*]] = sub nuw i8 [[N:%.*]], [[N2:%.*]]
1302+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[N_AND]], -33
1303+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
1304+
; CHECK: if.then:
1305+
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
1306+
; CHECK-NEXT: ret i8 [[R]]
1307+
; CHECK: if.else:
1308+
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
1309+
;
1310+
entry:
1311+
%n_sub = sub nuw i8 %n, %n2
1312+
%cmp = icmp ugt i8 %n_sub, 223
1313+
br i1 %cmp, label %if.then, label %if.else
1314+
1315+
if.then:
1316+
%r = and i8 %n, 32
1317+
ret i8 %r
1318+
1319+
if.else:
1320+
ret i8 %other
1321+
}
1322+
1323+
define i8 @test_icmp_sub_fail_wrong_arg(i8 %n, i8 %n2, i8 %other) {
1324+
; CHECK-LABEL: @test_icmp_sub_fail_wrong_arg(
1325+
; CHECK-NEXT: entry:
1326+
; CHECK-NEXT: [[N_AND:%.*]] = sub nuw i8 [[N1:%.*]], [[N:%.*]]
1327+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[N_AND]], -33
1328+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
1329+
; CHECK: if.then:
1330+
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
1331+
; CHECK-NEXT: ret i8 [[R]]
1332+
; CHECK: if.else:
1333+
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
1334+
;
1335+
entry:
1336+
%n_sub = sub nuw i8 %n, %n2
1337+
%cmp = icmp ugt i8 %n_sub, 223
1338+
br i1 %cmp, label %if.then, label %if.else
1339+
1340+
if.then:
1341+
%r = and i8 %n2, 32
1342+
ret i8 %r
1343+
1344+
if.else:
1345+
ret i8 %other
1346+
}
1347+
1348+
define i8 @test_icmp_sub2(i8 %n, i8 %n2, i8 %other) {
1349+
; CHECK-LABEL: @test_icmp_sub2(
1350+
; CHECK-NEXT: entry:
1351+
; CHECK-NEXT: [[N_SUB:%.*]] = sub nuw i8 [[N:%.*]], [[N2:%.*]]
1352+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[N_SUB]], -31
1353+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
1354+
; CHECK: if.then:
1355+
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
1356+
; CHECK: if.else:
1357+
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
1358+
; CHECK-NEXT: ret i8 [[R]]
1359+
;
1360+
entry:
1361+
%n_sub = sub nuw i8 %n, %n2
1362+
%cmp = icmp ule i8 %n_sub, 224
1363+
br i1 %cmp, label %if.then, label %if.else
1364+
1365+
if.then:
1366+
ret i8 %other
1367+
if.else:
1368+
%r = and i8 %n, 32
1369+
ret i8 %r
1370+
1371+
}
1372+
1373+
define i8 @test_icmp_sub_fail_bad_range(i8 %n, i8 %n2, i8 %other) {
1374+
; CHECK-LABEL: @test_icmp_sub_fail_bad_range(
1375+
; CHECK-NEXT: entry:
1376+
; CHECK-NEXT: [[N_SUB:%.*]] = sub nuw i8 [[N:%.*]], [[N2:%.*]]
1377+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[N_SUB]], -34
1378+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
1379+
; CHECK: if.then:
1380+
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
1381+
; CHECK-NEXT: ret i8 [[R]]
1382+
; CHECK: if.else:
1383+
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
1384+
;
1385+
entry:
1386+
%n_sub = sub nuw i8 %n, %n2
1387+
%cmp = icmp uge i8 %n_sub, 223
1388+
br i1 %cmp, label %if.then, label %if.else
1389+
1390+
if.then:
1391+
%r = and i8 %n, 32
1392+
ret i8 %r
1393+
1394+
if.else:
1395+
ret i8 %other
1396+
}
1397+
1398+
define i8 @test_icmp_sub_fail_bad_pred(i8 %n, i8 %n2, i8 %other) {
1399+
; CHECK-LABEL: @test_icmp_sub_fail_bad_pred(
1400+
; CHECK-NEXT: entry:
1401+
; CHECK-NEXT: [[N_SUB:%.*]] = sub nuw i8 [[N:%.*]], [[N2:%.*]]
1402+
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[N_SUB]], 31
1403+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
1404+
; CHECK: if.then:
1405+
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
1406+
; CHECK-NEXT: ret i8 [[R]]
1407+
; CHECK: if.else:
1408+
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
1409+
;
1410+
entry:
1411+
%n_sub = sub nuw i8 %n, %n2
1412+
%cmp = icmp sge i8 %n_sub, 32
1413+
br i1 %cmp, label %if.then, label %if.else
1414+
1415+
if.then:
1416+
%r = and i8 %n, 32
1417+
ret i8 %r
1418+
1419+
if.else:
1420+
ret i8 %other
1421+
}
1422+
11981423
declare void @use(i1)
11991424
declare void @sink(i8)

0 commit comments

Comments
 (0)