mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 11:02:59 +02:00
[x86] clean up materializeSBB(); NFCI
This is producing SBB where it is obviously not necessary, so it needs to be limited. llvm-svn: 296894
This commit is contained in:
parent
9f4052c410
commit
1ba7dfb74b
@ -33863,22 +33863,19 @@ static SDValue combineGatherScatter(SDNode *N, SelectionDAG &DAG) {
|
||||
return SDValue();
|
||||
}
|
||||
|
||||
// Helper function of performSETCCCombine. It is to materialize "setb reg"
|
||||
// as "sbb reg,reg", since it can be extended without zext and produces
|
||||
// an all-ones bit which is more useful than 0/1 in some cases.
|
||||
static SDValue MaterializeSETB(const SDLoc &DL, SDValue EFLAGS,
|
||||
SelectionDAG &DAG, MVT VT) {
|
||||
/// Materialize "setb reg" as "sbb reg,reg", since it produces an all-ones bit
|
||||
/// which is more useful than 0/1 in some cases.
|
||||
static SDValue materializeSBB(SDNode *N, SDValue EFLAGS, SelectionDAG &DAG) {
|
||||
SDLoc DL(N);
|
||||
// "Condition code B" is also known as "the carry flag" (CF).
|
||||
SDValue CF = DAG.getConstant(X86::COND_B, DL, MVT::i8);
|
||||
SDValue SBB = DAG.getNode(X86ISD::SETCC_CARRY, DL, MVT::i8, CF, EFLAGS);
|
||||
MVT VT = N->getSimpleValueType(0);
|
||||
if (VT == MVT::i8)
|
||||
return DAG.getNode(ISD::AND, DL, VT,
|
||||
DAG.getNode(X86ISD::SETCC_CARRY, DL, MVT::i8,
|
||||
DAG.getConstant(X86::COND_B, DL, MVT::i8),
|
||||
EFLAGS),
|
||||
DAG.getConstant(1, DL, VT));
|
||||
assert (VT == MVT::i1 && "Unexpected type for SECCC node");
|
||||
return DAG.getNode(ISD::TRUNCATE, DL, MVT::i1,
|
||||
DAG.getNode(X86ISD::SETCC_CARRY, DL, MVT::i8,
|
||||
DAG.getConstant(X86::COND_B, DL, MVT::i8),
|
||||
EFLAGS));
|
||||
return DAG.getNode(ISD::AND, DL, VT, SBB, DAG.getConstant(1, DL, VT));
|
||||
|
||||
assert(VT == MVT::i1 && "Unexpected type for SETCC node");
|
||||
return DAG.getNode(ISD::TRUNCATE, DL, MVT::i1, SBB);
|
||||
}
|
||||
|
||||
// Optimize RES = X86ISD::SETCC CONDCODE, EFLAG_INPUT
|
||||
@ -33902,15 +33899,12 @@ static SDValue combineX86SetCC(SDNode *N, SelectionDAG &DAG,
|
||||
EFLAGS.getNode()->getVTList(),
|
||||
EFLAGS.getOperand(1), EFLAGS.getOperand(0));
|
||||
SDValue NewEFLAGS = SDValue(NewSub.getNode(), EFLAGS.getResNo());
|
||||
return MaterializeSETB(DL, NewEFLAGS, DAG, N->getSimpleValueType(0));
|
||||
return materializeSBB(N, NewEFLAGS, DAG);
|
||||
}
|
||||
}
|
||||
|
||||
// Materialize "setb reg" as "sbb reg,reg", since it can be extended without
|
||||
// a zext and produces an all-ones bit which is more useful than 0/1 in some
|
||||
// cases.
|
||||
if (CC == X86::COND_B)
|
||||
return MaterializeSETB(DL, EFLAGS, DAG, N->getSimpleValueType(0));
|
||||
return materializeSBB(N, EFLAGS, DAG);
|
||||
|
||||
// Try to simplify the EFLAGS and condition code operands.
|
||||
if (SDValue Flags = combineSetCCEFLAGS(EFLAGS, CC, DAG))
|
||||
|
Loading…
Reference in New Issue
Block a user