Skip to content

Commit 68defc0

Browse files
committed
[x86] make select lowering using SBB hack more flexible
select (X != 0), -1, Y --> 0 - X; or (sbb), Y select (X != 0), Y, -1 --> X - 1; or (sbb), Y We already had these x86 carry-flag transforms, but one was over-specified to handle a "0" select arm only. That's just a special-case of the more general pattern (the 'or' will be deleted if Y is zero). This is part of solving #53006, but it misses that example because some other combine has already converted that exact pattern into math ops. Differential Revision: https://reviews.llvm.org/D116765
1 parent fb7cf90 commit 68defc0

File tree

4 files changed

+143
-162
lines changed

4 files changed

+143
-162
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24547,27 +24547,24 @@ SDValue X86TargetLowering::LowerSELECT(SDValue Op, SelectionDAG &DAG) const {
2454724547
SDVTList VTs = DAG.getVTList(Op.getValueType(), MVT::i32);
2454824548
SDVTList CmpVTs = DAG.getVTList(CmpOp0.getValueType(), MVT::i32);
2454924549

24550-
// Apply further optimizations for special cases
24551-
// (select (x != 0), -1, 0) -> neg & sbb
24552-
// (select (x == 0), 0, -1) -> neg & sbb
24553-
if (isNullConstant(Y) &&
24554-
(isAllOnesConstant(Op1) == (CondCode == X86::COND_NE))) {
24550+
// 'X - 1' sets the carry flag if X == 0.
24551+
// '0 - X' sets the carry flag if X != 0.
24552+
// Convert the carry flag to a -1/0 mask with sbb:
24553+
// select (X != 0), -1, Y --> 0 - X; or (sbb), Y
24554+
// select (X == 0), Y, -1 --> 0 - X; or (sbb), Y
24555+
// select (X != 0), Y, -1 --> X - 1; or (sbb), Y
24556+
// select (X == 0), -1, Y --> X - 1; or (sbb), Y
24557+
if (isAllOnesConstant(Op1) == (CondCode == X86::COND_NE)) {
2455524558
SDValue Zero = DAG.getConstant(0, DL, CmpOp0.getValueType());
24556-
SDValue Neg = DAG.getNode(X86ISD::SUB, DL, CmpVTs, Zero, CmpOp0);
24557-
Zero = DAG.getConstant(0, DL, Op.getValueType());
24558-
return DAG.getNode(X86ISD::SBB, DL, VTs, Zero, Zero, Neg.getValue(1));
24559+
Cmp = DAG.getNode(X86ISD::SUB, DL, CmpVTs, Zero, CmpOp0);
24560+
} else {
24561+
SDValue One = DAG.getConstant(1, DL, CmpOp0.getValueType());
24562+
Cmp = DAG.getNode(X86ISD::SUB, DL, CmpVTs, CmpOp0, One);
2455924563
}
24560-
24561-
Cmp = DAG.getNode(X86ISD::SUB, DL, CmpVTs,
24562-
CmpOp0, DAG.getConstant(1, DL, CmpOp0.getValueType()));
24563-
24564+
// TODO: We don't need "0 - 0" here. This should use X86ISD::SETCC_CARRY.
2456424565
SDValue Zero = DAG.getConstant(0, DL, Op.getValueType());
2456524566
SDValue Res = // Res = 0 or -1.
2456624567
DAG.getNode(X86ISD::SBB, DL, VTs, Zero, Zero, Cmp.getValue(1));
24567-
24568-
if (isAllOnesConstant(Op1) != (CondCode == X86::COND_E))
24569-
Res = DAG.getNOT(DL, Res, Res.getValueType());
24570-
2457124568
return DAG.getNode(ISD::OR, DL, Res.getValueType(), Res, Y);
2457224569
} else if (!Subtarget.hasCMov() && CondCode == X86::COND_E &&
2457324570
Cmp.getOperand(0).getOpcode() == ISD::AND &&

llvm/test/CodeGen/X86/sdiv_fix_sat.ll

Lines changed: 105 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -1157,6 +1157,7 @@ define <4 x i32> @vec(<4 x i32> %x, <4 x i32> %y) nounwind {
11571157
; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
11581158
; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
11591159
; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
1160+
; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
11601161
; X86-NEXT: testl %edx, %edx
11611162
; X86-NEXT: movl $0, %eax
11621163
; X86-NEXT: cmovsl %edx, %eax
@@ -1168,11 +1169,11 @@ define <4 x i32> @vec(<4 x i32> %x, <4 x i32> %y) nounwind {
11681169
; X86-NEXT: movl %eax, %ecx
11691170
; X86-NEXT: sarl $31, %ecx
11701171
; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1171-
; X86-NEXT: movl %ecx, %esi
1172-
; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
1172+
; X86-NEXT: movl %ecx, %edx
1173+
; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
11731174
; X86-NEXT: testl %eax, %eax
1174-
; X86-NEXT: cmovel %eax, %esi
1175-
; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1175+
; X86-NEXT: cmovel %eax, %edx
1176+
; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
11761177
; X86-NEXT: movl $0, %ecx
11771178
; X86-NEXT: cmovsl %eax, %ecx
11781179
; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
@@ -1193,140 +1194,134 @@ define <4 x i32> @vec(<4 x i32> %x, <4 x i32> %y) nounwind {
11931194
; X86-NEXT: movl $-1, %eax
11941195
; X86-NEXT: cmovsl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
11951196
; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1196-
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
1197-
; X86-NEXT: movl %esi, %ebx
1197+
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
1198+
; X86-NEXT: movl %ecx, %ebx
11981199
; X86-NEXT: sarl $31, %ebx
11991200
; X86-NEXT: movl %ebx, %eax
12001201
; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
1201-
; X86-NEXT: testl %esi, %esi
1202-
; X86-NEXT: cmovel %esi, %eax
1203-
; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1204-
; X86-NEXT: movl $0, %ecx
1205-
; X86-NEXT: cmovsl %esi, %ecx
1206-
; X86-NEXT: movl $-1, %eax
1207-
; X86-NEXT: cmovsl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
1208-
; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1209-
; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1210-
; X86-NEXT: movl %edx, %eax
1211-
; X86-NEXT: sarl $31, %eax
1212-
; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1213-
; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
1214-
; X86-NEXT: testl %edx, %edx
1215-
; X86-NEXT: cmovel %edx, %eax
1202+
; X86-NEXT: testl %ecx, %ecx
1203+
; X86-NEXT: cmovel %ecx, %eax
12161204
; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1217-
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
1218-
; X86-NEXT: andl %eax, %ebx
1219-
; X86-NEXT: cmpl $1, %eax
1220-
; X86-NEXT: movl $0, %edx
1221-
; X86-NEXT: sbbl %edx, %edx
1222-
; X86-NEXT: notl %edx
1223-
; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
1224-
; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
1225-
; X86-NEXT: cmovnel {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
1226-
; X86-NEXT: movl $0, %esi
1227-
; X86-NEXT: cmovel %esi, %ebx
1228-
; X86-NEXT: cmpl $-1, %ebx
12291205
; X86-NEXT: movl $0, %eax
1230-
; X86-NEXT: cmovel %edx, %eax
1231-
; X86-NEXT: testl %ecx, %ecx
1232-
; X86-NEXT: cmovsl %esi, %edx
1206+
; X86-NEXT: cmovsl %ecx, %eax
1207+
; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1208+
; X86-NEXT: movl %ecx, %edx
12331209
; X86-NEXT: movl $-1, %esi
1234-
; X86-NEXT: cmovsl %esi, %ebx
1210+
; X86-NEXT: cmovsl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
1211+
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
1212+
; X86-NEXT: movl %eax, %ecx
1213+
; X86-NEXT: sarl $31, %ecx
1214+
; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
12351215
; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
1236-
; X86-NEXT: cmpl $-1, %ecx
1237-
; X86-NEXT: cmovnel %ebx, %ecx
1238-
; X86-NEXT: cmovel %eax, %edx
1239-
; X86-NEXT: shrdl $1, %ecx, %edx
1216+
; X86-NEXT: testl %eax, %eax
1217+
; X86-NEXT: cmovel %eax, %ecx
1218+
; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
12401219
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
1241-
; X86-NEXT: andl %eax, %edi
1242-
; X86-NEXT: cmpl $1, %eax
1220+
; X86-NEXT: andl %eax, %ebx
1221+
; X86-NEXT: negl %eax
12431222
; X86-NEXT: movl $0, %ecx
12441223
; X86-NEXT: sbbl %ecx, %ecx
1245-
; X86-NEXT: notl %ecx
12461224
; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
1225+
; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
1226+
; X86-NEXT: cmovnel %esi, %ecx
1227+
; X86-NEXT: movl $0, %edx
1228+
; X86-NEXT: cmovel %edx, %ebx
1229+
; X86-NEXT: cmpl $-1, %ebx
1230+
; X86-NEXT: movl $0, %esi
1231+
; X86-NEXT: cmovel %ecx, %esi
12471232
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
1233+
; X86-NEXT: testl %eax, %eax
1234+
; X86-NEXT: cmovsl %edx, %ecx
1235+
; X86-NEXT: movl $-1, %edx
1236+
; X86-NEXT: cmovsl %edx, %ebx
1237+
; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
1238+
; X86-NEXT: cmpl $-1, %eax
1239+
; X86-NEXT: cmovel %esi, %ecx
1240+
; X86-NEXT: cmovnel %ebx, %eax
1241+
; X86-NEXT: shldl $31, %ecx, %eax
1242+
; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1243+
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
1244+
; X86-NEXT: andl %eax, %edi
1245+
; X86-NEXT: negl %eax
1246+
; X86-NEXT: movl $0, %eax
1247+
; X86-NEXT: sbbl %eax, %eax
12481248
; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
1249-
; X86-NEXT: cmovnel {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
1249+
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
1250+
; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
1251+
; X86-NEXT: cmovnel {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
12501252
; X86-NEXT: movl $0, %esi
12511253
; X86-NEXT: cmovel %esi, %edi
12521254
; X86-NEXT: cmpl $-1, %edi
1255+
; X86-NEXT: movl $0, %edx
1256+
; X86-NEXT: cmovel %eax, %edx
1257+
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
1258+
; X86-NEXT: testl %ecx, %ecx
1259+
; X86-NEXT: cmovsl %esi, %eax
1260+
; X86-NEXT: movl $0, %esi
1261+
; X86-NEXT: movl $-1, %ebx
1262+
; X86-NEXT: cmovsl %ebx, %edi
1263+
; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
1264+
; X86-NEXT: cmpl $-1, %ecx
1265+
; X86-NEXT: cmovel %edx, %eax
1266+
; X86-NEXT: cmovnel %edi, %ecx
1267+
; X86-NEXT: shldl $31, %eax, %ecx
1268+
; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1269+
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
1270+
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
1271+
; X86-NEXT: andl %eax, %edx
1272+
; X86-NEXT: negl %eax
12531273
; X86-NEXT: movl $0, %eax
1254-
; X86-NEXT: cmovel %ecx, %eax
1274+
; X86-NEXT: sbbl %eax, %eax
1275+
; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
1276+
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
1277+
; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
1278+
; X86-NEXT: cmovnel {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
1279+
; X86-NEXT: cmovel %esi, %edx
1280+
; X86-NEXT: cmpl $-1, %edx
1281+
; X86-NEXT: movl $0, %ecx
1282+
; X86-NEXT: cmovel %eax, %ecx
12551283
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
12561284
; X86-NEXT: testl %ebx, %ebx
1257-
; X86-NEXT: cmovsl %esi, %ecx
1258-
; X86-NEXT: movl $-1, %esi
1259-
; X86-NEXT: cmovsl %esi, %edi
1285+
; X86-NEXT: cmovsl %esi, %eax
1286+
; X86-NEXT: movl $-1, %edi
1287+
; X86-NEXT: cmovsl %edi, %edx
12601288
; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload
12611289
; X86-NEXT: cmpl $-1, %ebx
1262-
; X86-NEXT: cmovnel %edi, %ebx
1263-
; X86-NEXT: cmovel %eax, %ecx
1264-
; X86-NEXT: shrdl $1, %ebx, %ecx
1290+
; X86-NEXT: cmovel %ecx, %eax
1291+
; X86-NEXT: cmovnel %edx, %ebx
1292+
; X86-NEXT: shldl $31, %eax, %ebx
12651293
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
12661294
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
12671295
; X86-NEXT: andl %eax, %edi
1268-
; X86-NEXT: cmpl $1, %eax
1269-
; X86-NEXT: movl $0, %esi
1270-
; X86-NEXT: sbbl %esi, %esi
1271-
; X86-NEXT: notl %esi
1272-
; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
1273-
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
1274-
; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
1275-
; X86-NEXT: cmovnel {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
1276-
; X86-NEXT: movl %edi, %eax
1277-
; X86-NEXT: movl $0, %edi
1278-
; X86-NEXT: cmovel %edi, %eax
1279-
; X86-NEXT: cmpl $-1, %eax
1280-
; X86-NEXT: movl %eax, %edi
1296+
; X86-NEXT: negl %eax
12811297
; X86-NEXT: movl $0, %eax
1282-
; X86-NEXT: cmovel %esi, %eax
1283-
; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1284-
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
1285-
; X86-NEXT: testl %ebx, %ebx
1286-
; X86-NEXT: movl $0, %eax
1287-
; X86-NEXT: cmovsl %eax, %esi
1288-
; X86-NEXT: movl $-1, %eax
1289-
; X86-NEXT: cmovsl %eax, %edi
1290-
; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload
1291-
; X86-NEXT: cmpl $-1, %ebx
1292-
; X86-NEXT: cmovnel %edi, %ebx
1293-
; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
1294-
; X86-NEXT: shrdl $1, %ebx, %esi
1295-
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
1296-
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
1297-
; X86-NEXT: andl %eax, %ebx
1298-
; X86-NEXT: cmpl $1, %eax
1299-
; X86-NEXT: movl $0, %edi
1300-
; X86-NEXT: sbbl %edi, %edi
1301-
; X86-NEXT: notl %edi
1302-
; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
1303-
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
1298+
; X86-NEXT: sbbl %eax, %eax
13041299
; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
1305-
; X86-NEXT: cmovnel {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
1306-
; X86-NEXT: movl %ebx, %eax
1307-
; X86-NEXT: movl $0, %ebx
1308-
; X86-NEXT: cmovel %ebx, %eax
1309-
; X86-NEXT: cmpl $-1, %eax
1310-
; X86-NEXT: movl $0, %ebx
1311-
; X86-NEXT: cmovel %edi, %ebx
1312-
; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1313-
; X86-NEXT: cmpl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
1314-
; X86-NEXT: movl $0, %ebx
1315-
; X86-NEXT: cmovsl %ebx, %edi
1316-
; X86-NEXT: movl $-1, %ebx
1317-
; X86-NEXT: cmovsl %ebx, %eax
1318-
; X86-NEXT: movl %eax, %ebx
1319-
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
1320-
; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
1321-
; X86-NEXT: cmpl $-1, %eax
1322-
; X86-NEXT: cmovnel %ebx, %eax
1323-
; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
1324-
; X86-NEXT: shrdl $1, %eax, %edi
1300+
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
1301+
; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
1302+
; X86-NEXT: cmovnel {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
1303+
; X86-NEXT: cmovel %esi, %edi
1304+
; X86-NEXT: cmpl $-1, %edi
1305+
; X86-NEXT: movl $0, %ecx
1306+
; X86-NEXT: cmovel %eax, %ecx
1307+
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
1308+
; X86-NEXT: testl %edx, %edx
1309+
; X86-NEXT: cmovsl %esi, %eax
1310+
; X86-NEXT: movl $-1, %esi
1311+
; X86-NEXT: cmovsl %esi, %edi
1312+
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
1313+
; X86-NEXT: andl %edx, %esi
1314+
; X86-NEXT: cmpl $-1, %esi
1315+
; X86-NEXT: cmovel %ecx, %eax
1316+
; X86-NEXT: cmovnel %edi, %esi
1317+
; X86-NEXT: shldl $31, %eax, %esi
13251318
; X86-NEXT: movl 8(%ebp), %eax
1326-
; X86-NEXT: movl %edi, 12(%eax)
1327-
; X86-NEXT: movl %esi, 8(%eax)
1319+
; X86-NEXT: movl %esi, 12(%eax)
1320+
; X86-NEXT: movl %ebx, 8(%eax)
1321+
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
13281322
; X86-NEXT: movl %ecx, 4(%eax)
1329-
; X86-NEXT: movl %edx, (%eax)
1323+
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
1324+
; X86-NEXT: movl %ecx, (%eax)
13301325
; X86-NEXT: leal -12(%ebp), %esp
13311326
; X86-NEXT: popl %esi
13321327
; X86-NEXT: popl %edi

llvm/test/CodeGen/X86/select.ll

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -793,9 +793,8 @@ define i64 @test11(i64 %x, i64 %y) nounwind readnone ssp noredzone {
793793
; CHECK-LABEL: test11:
794794
; CHECK: ## %bb.0:
795795
; CHECK-NEXT: xorl %eax, %eax
796-
; CHECK-NEXT: cmpq $1, %rdi
796+
; CHECK-NEXT: negq %rdi
797797
; CHECK-NEXT: sbbq %rax, %rax
798-
; CHECK-NEXT: notq %rax
799798
; CHECK-NEXT: orq %rsi, %rax
800799
; CHECK-NEXT: retq
801800
;
@@ -833,9 +832,8 @@ define i64 @test11a(i64 %x, i64 %y) nounwind readnone ssp noredzone {
833832
; CHECK-LABEL: test11a:
834833
; CHECK: ## %bb.0:
835834
; CHECK-NEXT: xorl %eax, %eax
836-
; CHECK-NEXT: cmpq $1, %rdi
835+
; CHECK-NEXT: negq %rdi
837836
; CHECK-NEXT: sbbq %rax, %rax
838-
; CHECK-NEXT: notq %rax
839837
; CHECK-NEXT: orq %rsi, %rax
840838
; CHECK-NEXT: retq
841839
;
@@ -872,27 +870,24 @@ define i32 @eqzero_const_or_all_ones(i32 %x) {
872870
; CHECK-LABEL: eqzero_const_or_all_ones:
873871
; CHECK: ## %bb.0:
874872
; CHECK-NEXT: xorl %eax, %eax
875-
; CHECK-NEXT: cmpl $1, %edi
873+
; CHECK-NEXT: negl %edi
876874
; CHECK-NEXT: sbbl %eax, %eax
877-
; CHECK-NEXT: notl %eax
878875
; CHECK-NEXT: orl $42, %eax
879876
; CHECK-NEXT: retq
880877
;
881878
; ATHLON-LABEL: eqzero_const_or_all_ones:
882879
; ATHLON: ## %bb.0:
883880
; ATHLON-NEXT: xorl %eax, %eax
884-
; ATHLON-NEXT: cmpl $1, {{[0-9]+}}(%esp)
881+
; ATHLON-NEXT: cmpl {{[0-9]+}}(%esp), %eax
885882
; ATHLON-NEXT: sbbl %eax, %eax
886-
; ATHLON-NEXT: notl %eax
887883
; ATHLON-NEXT: orl $42, %eax
888884
; ATHLON-NEXT: retl
889885
;
890886
; MCU-LABEL: eqzero_const_or_all_ones:
891887
; MCU: # %bb.0:
892888
; MCU-NEXT: xorl %ecx, %ecx
893-
; MCU-NEXT: cmpl $1, %eax
889+
; MCU-NEXT: negl %eax
894890
; MCU-NEXT: sbbl %ecx, %ecx
895-
; MCU-NEXT: notl %ecx
896891
; MCU-NEXT: orl $42, %ecx
897892
; MCU-NEXT: movl %ecx, %eax
898893
; MCU-NEXT: retl
@@ -971,32 +966,28 @@ define i8 @nezero_all_ones_or_const(i8 %x) {
971966
; CHECK-LABEL: nezero_all_ones_or_const:
972967
; CHECK: ## %bb.0:
973968
; CHECK-NEXT: xorl %eax, %eax
974-
; CHECK-NEXT: cmpb $1, %dil
969+
; CHECK-NEXT: negb %dil
975970
; CHECK-NEXT: sbbl %eax, %eax
976-
; CHECK-NEXT: notb %al
977971
; CHECK-NEXT: orb $42, %al
978972
; CHECK-NEXT: ## kill: def $al killed $al killed $eax
979973
; CHECK-NEXT: retq
980974
;
981975
; ATHLON-LABEL: nezero_all_ones_or_const:
982976
; ATHLON: ## %bb.0:
983977
; ATHLON-NEXT: xorl %eax, %eax
984-
; ATHLON-NEXT: cmpb $1, {{[0-9]+}}(%esp)
978+
; ATHLON-NEXT: cmpb {{[0-9]+}}(%esp), %al
985979
; ATHLON-NEXT: sbbl %eax, %eax
986-
; ATHLON-NEXT: notb %al
987980
; ATHLON-NEXT: orb $42, %al
988981
; ATHLON-NEXT: ## kill: def $al killed $al killed $eax
989982
; ATHLON-NEXT: retl
990983
;
991984
; MCU-LABEL: nezero_all_ones_or_const:
992985
; MCU: # %bb.0:
993-
; MCU-NEXT: movl %eax, %ecx
994-
; MCU-NEXT: xorl %eax, %eax
995-
; MCU-NEXT: cmpb $1, %cl
996-
; MCU-NEXT: sbbl %eax, %eax
997-
; MCU-NEXT: notb %al
998-
; MCU-NEXT: orb $42, %al
999-
; MCU-NEXT: # kill: def $al killed $al killed $eax
986+
; MCU-NEXT: xorl %ecx, %ecx
987+
; MCU-NEXT: negb %al
988+
; MCU-NEXT: sbbl %ecx, %ecx
989+
; MCU-NEXT: orb $42, %cl
990+
; MCU-NEXT: movl %ecx, %eax
1000991
; MCU-NEXT: retl
1001992
%z = icmp ne i8 %x, 0
1002993
%r = select i1 %z, i8 -1, i8 42

0 commit comments

Comments
 (0)