Skip to content

Commit e76c95f

Browse files
committed
[InstCombine] add tests for signbit compares; NFC
1 parent 2dc3371 commit e76c95f

File tree

2 files changed

+131
-3
lines changed

2 files changed

+131
-3
lines changed

llvm/lib/Support/NativeFormatting.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -169,11 +169,11 @@ void llvm::write_double(raw_ostream &S, double N, FloatStyle Style,
169169
std::optional<size_t> Precision) {
170170
size_t Prec = Precision.value_or(getDefaultPrecision(Style));
171171

172-
if (std::isnan(N)) {
172+
if (isnan(N)) {
173173
S << "nan";
174174
return;
175-
} else if (std::isinf(N)) {
176-
S << (std::signbit(N) ? "-INF" : "INF");
175+
} else if (isinf(N)) {
176+
S << (signbit(N) ? "-INF" : "INF");
177177
return;
178178
}
179179

llvm/test/Transforms/InstCombine/icmp-shr.ll

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1299,3 +1299,131 @@ define i1 @lshr_neg_sgt_zero(i8 %x) {
12991299
%r = icmp sgt i8 %s, 0
13001300
ret i1 %r
13011301
}
1302+
1303+
define i1 @exactly_one_set_signbit(i8 %x, i8 %y) {
1304+
; CHECK-LABEL: @exactly_one_set_signbit(
1305+
; CHECK-NEXT: [[XSIGN:%.*]] = lshr i8 [[X:%.*]], 7
1306+
; CHECK-NEXT: [[YPOS:%.*]] = icmp sgt i8 [[Y:%.*]], -1
1307+
; CHECK-NEXT: [[YPOSZ:%.*]] = zext i1 [[YPOS]] to i8
1308+
; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[XSIGN]], [[YPOSZ]]
1309+
; CHECK-NEXT: ret i1 [[R]]
1310+
;
1311+
%xsign = lshr i8 %x, 7
1312+
%ypos = icmp sgt i8 %y, -1
1313+
%yposz = zext i1 %ypos to i8
1314+
%r = icmp eq i8 %xsign, %yposz
1315+
ret i1 %r
1316+
}
1317+
1318+
define i1 @exactly_one_set_signbit_use1(i8 %x, i8 %y) {
1319+
; CHECK-LABEL: @exactly_one_set_signbit_use1(
1320+
; CHECK-NEXT: [[XSIGN:%.*]] = lshr i8 [[X:%.*]], 7
1321+
; CHECK-NEXT: call void @use(i8 [[XSIGN]])
1322+
; CHECK-NEXT: [[YPOS:%.*]] = icmp sgt i8 [[Y:%.*]], -1
1323+
; CHECK-NEXT: [[YPOSZ:%.*]] = zext i1 [[YPOS]] to i8
1324+
; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[XSIGN]], [[YPOSZ]]
1325+
; CHECK-NEXT: ret i1 [[R]]
1326+
;
1327+
%xsign = lshr i8 %x, 7
1328+
call void @use(i8 %xsign)
1329+
%ypos = icmp sgt i8 %y, -1
1330+
%yposz = zext i1 %ypos to i8
1331+
%r = icmp eq i8 %xsign, %yposz
1332+
ret i1 %r
1333+
}
1334+
1335+
define <2 x i1> @same_signbit(<2 x i8> %x, <2 x i8> %y) {
1336+
; CHECK-LABEL: @same_signbit(
1337+
; CHECK-NEXT: [[XSIGN:%.*]] = lshr <2 x i8> [[X:%.*]], <i8 7, i8 7>
1338+
; CHECK-NEXT: [[YPOS:%.*]] = icmp sgt <2 x i8> [[Y:%.*]], <i8 -1, i8 -1>
1339+
; CHECK-NEXT: [[YPOSZ:%.*]] = zext <2 x i1> [[YPOS]] to <2 x i8>
1340+
; CHECK-NEXT: [[R:%.*]] = icmp eq <2 x i8> [[XSIGN]], [[YPOSZ]]
1341+
; CHECK-NEXT: ret <2 x i1> [[R]]
1342+
;
1343+
%xsign = lshr <2 x i8> %x, <i8 7, i8 7>
1344+
%ypos = icmp sgt <2 x i8> %y, <i8 -1, i8 -1>
1345+
%yposz = zext <2 x i1> %ypos to <2 x i8>
1346+
%r = icmp eq <2 x i8> %xsign, %yposz
1347+
ret <2 x i1> %r
1348+
}
1349+
1350+
define i1 @same_signbit_use2(i8 %x, i8 %y) {
1351+
; CHECK-LABEL: @same_signbit_use2(
1352+
; CHECK-NEXT: [[XSIGN:%.*]] = lshr i8 [[X:%.*]], 7
1353+
; CHECK-NEXT: [[YPOS:%.*]] = icmp sgt i8 [[Y:%.*]], -1
1354+
; CHECK-NEXT: [[YPOSZ:%.*]] = zext i1 [[YPOS]] to i8
1355+
; CHECK-NEXT: call void @use(i8 [[YPOSZ]])
1356+
; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[XSIGN]], [[YPOSZ]]
1357+
; CHECK-NEXT: ret i1 [[R]]
1358+
;
1359+
%xsign = lshr i8 %x, 7
1360+
%ypos = icmp sgt i8 %y, -1
1361+
%yposz = zext i1 %ypos to i8
1362+
call void @use(i8 %yposz)
1363+
%r = icmp eq i8 %xsign, %yposz
1364+
ret i1 %r
1365+
}
1366+
1367+
define i1 @same_signbit_use3(i8 %x, i8 %y) {
1368+
; CHECK-LABEL: @same_signbit_use3(
1369+
; CHECK-NEXT: [[XSIGN:%.*]] = lshr i8 [[X:%.*]], 7
1370+
; CHECK-NEXT: call void @use(i8 [[XSIGN]])
1371+
; CHECK-NEXT: [[YPOS:%.*]] = icmp sgt i8 [[Y:%.*]], -1
1372+
; CHECK-NEXT: [[YPOSZ:%.*]] = zext i1 [[YPOS]] to i8
1373+
; CHECK-NEXT: call void @use(i8 [[YPOSZ]])
1374+
; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[XSIGN]], [[YPOSZ]]
1375+
; CHECK-NEXT: ret i1 [[R]]
1376+
;
1377+
%xsign = lshr i8 %x, 7
1378+
call void @use(i8 %xsign)
1379+
%ypos = icmp sgt i8 %y, -1
1380+
%yposz = zext i1 %ypos to i8
1381+
call void @use(i8 %yposz)
1382+
%r = icmp eq i8 %xsign, %yposz
1383+
ret i1 %r
1384+
}
1385+
1386+
define i1 @exactly_one_set_signbit_wrong_shamt(i8 %x, i8 %y) {
1387+
; CHECK-LABEL: @exactly_one_set_signbit_wrong_shamt(
1388+
; CHECK-NEXT: [[XSIGN:%.*]] = lshr i8 [[X:%.*]], 6
1389+
; CHECK-NEXT: [[YPOS:%.*]] = icmp sgt i8 [[Y:%.*]], -1
1390+
; CHECK-NEXT: [[YPOSZ:%.*]] = zext i1 [[YPOS]] to i8
1391+
; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[XSIGN]], [[YPOSZ]]
1392+
; CHECK-NEXT: ret i1 [[R]]
1393+
;
1394+
%xsign = lshr i8 %x, 6
1395+
%ypos = icmp sgt i8 %y, -1
1396+
%yposz = zext i1 %ypos to i8
1397+
%r = icmp eq i8 %xsign, %yposz
1398+
ret i1 %r
1399+
}
1400+
1401+
define i1 @exactly_one_set_signbit_wrong_shr(i8 %x, i8 %y) {
1402+
; CHECK-LABEL: @exactly_one_set_signbit_wrong_shr(
1403+
; CHECK-NEXT: [[XSIGN:%.*]] = ashr i8 [[X:%.*]], 7
1404+
; CHECK-NEXT: [[YPOS:%.*]] = icmp sgt i8 [[Y:%.*]], -1
1405+
; CHECK-NEXT: [[YPOSZ:%.*]] = zext i1 [[YPOS]] to i8
1406+
; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[XSIGN]], [[YPOSZ]]
1407+
; CHECK-NEXT: ret i1 [[R]]
1408+
;
1409+
%xsign = ashr i8 %x, 7
1410+
%ypos = icmp sgt i8 %y, -1
1411+
%yposz = zext i1 %ypos to i8
1412+
%r = icmp eq i8 %xsign, %yposz
1413+
ret i1 %r
1414+
}
1415+
1416+
define i1 @exactly_one_set_signbit_wrong_pred(i8 %x, i8 %y) {
1417+
; CHECK-LABEL: @exactly_one_set_signbit_wrong_pred(
1418+
; CHECK-NEXT: [[XSIGN:%.*]] = lshr i8 [[X:%.*]], 7
1419+
; CHECK-NEXT: [[YPOS:%.*]] = icmp sgt i8 [[Y:%.*]], -1
1420+
; CHECK-NEXT: [[YPOSZ:%.*]] = zext i1 [[YPOS]] to i8
1421+
; CHECK-NEXT: [[R:%.*]] = icmp ugt i8 [[XSIGN]], [[YPOSZ]]
1422+
; CHECK-NEXT: ret i1 [[R]]
1423+
;
1424+
%xsign = lshr i8 %x, 7
1425+
%ypos = icmp sgt i8 %y, -1
1426+
%yposz = zext i1 %ypos to i8
1427+
%r = icmp sgt i8 %xsign, %yposz
1428+
ret i1 %r
1429+
}

0 commit comments

Comments
 (0)