mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-18 18:42:46 +02:00
[TargetLowering] Rename isCondCodeLegal to isCondCodeLegalOrCustom. Add real isCondCodeLegal. Update callers to use one or the other.
isCondCodeLegal internally checked Legal or Custom which is misleading. Though no targets set any cond code action to Custom today. So I've renamed isCondCodeLegal to isCondCodeLegalOrCustom and added a real isCondCodeLegal that only checks Legal. I've changed legalization code to use isCondCodeLegalOrCustom and left things reachable via DAG combine as isCondCodeLegal. I've also changed some places that called getCondCodeAction and compared to Legal to just use isCondCodeLegal. I'm looking at trying to keep SETCC all the way to isel for the AVX512 integer comparisons and I suspect I'll need to make some condition codes Custom to stop DAG combine from changing things post LegalizeOps. Prior to this only Expand stopped DAG combine, but that causes LegalizeOps to try to swap operands or invert rather than calling our Custom handler. Differential Revision: https://reviews.llvm.org/D43607 llvm-svn: 325829
This commit is contained in:
parent
74e1a50444
commit
d73af3c4c8
@ -987,9 +987,14 @@ public:
|
||||
|
||||
/// Return true if the specified condition code is legal on this target.
|
||||
bool isCondCodeLegal(ISD::CondCode CC, MVT VT) const {
|
||||
return
|
||||
getCondCodeAction(CC, VT) == Legal ||
|
||||
getCondCodeAction(CC, VT) == Custom;
|
||||
return getCondCodeAction(CC, VT) == Legal;
|
||||
}
|
||||
|
||||
/// Return true if the specified condition code is legal or custom on this
|
||||
/// target.
|
||||
bool isCondCodeLegalOrCustom(ISD::CondCode CC, MVT VT) const {
|
||||
return getCondCodeAction(CC, VT) == Legal ||
|
||||
getCondCodeAction(CC, VT) == Custom;
|
||||
}
|
||||
|
||||
/// If the action for this operation is to promote, this method returns the
|
||||
|
@ -1631,20 +1631,20 @@ bool SelectionDAGLegalize::LegalizeSetCCCondCode(EVT VT, SDValue &LHS,
|
||||
break;
|
||||
case TargetLowering::Expand: {
|
||||
ISD::CondCode InvCC = ISD::getSetCCSwappedOperands(CCCode);
|
||||
if (TLI.isCondCodeLegal(InvCC, OpVT)) {
|
||||
if (TLI.isCondCodeLegalOrCustom(InvCC, OpVT)) {
|
||||
std::swap(LHS, RHS);
|
||||
CC = DAG.getCondCode(InvCC);
|
||||
return true;
|
||||
}
|
||||
// Swapping operands didn't work. Try inverting the condition.
|
||||
InvCC = getSetCCInverse(CCCode, OpVT.isInteger());
|
||||
if (!TLI.isCondCodeLegal(InvCC, OpVT)) {
|
||||
if (!TLI.isCondCodeLegalOrCustom(InvCC, OpVT)) {
|
||||
// If inverting the condition is not enough, try swapping operands
|
||||
// on top of it.
|
||||
InvCC = ISD::getSetCCSwappedOperands(InvCC);
|
||||
NeedSwap = true;
|
||||
}
|
||||
if (TLI.isCondCodeLegal(InvCC, OpVT)) {
|
||||
if (TLI.isCondCodeLegalOrCustom(InvCC, OpVT)) {
|
||||
CC = DAG.getCondCode(InvCC);
|
||||
NeedInvert = true;
|
||||
if (NeedSwap)
|
||||
@ -1657,13 +1657,11 @@ bool SelectionDAGLegalize::LegalizeSetCCCondCode(EVT VT, SDValue &LHS,
|
||||
switch (CCCode) {
|
||||
default: llvm_unreachable("Don't know how to expand this condition!");
|
||||
case ISD::SETO:
|
||||
assert(TLI.getCondCodeAction(ISD::SETOEQ, OpVT)
|
||||
== TargetLowering::Legal
|
||||
assert(TLI.isCondCodeLegal(ISD::SETOEQ, OpVT)
|
||||
&& "If SETO is expanded, SETOEQ must be legal!");
|
||||
CC1 = ISD::SETOEQ; CC2 = ISD::SETOEQ; Opc = ISD::AND; break;
|
||||
case ISD::SETUO:
|
||||
assert(TLI.getCondCodeAction(ISD::SETUNE, OpVT)
|
||||
== TargetLowering::Legal
|
||||
assert(TLI.isCondCodeLegal(ISD::SETUNE, OpVT)
|
||||
&& "If SETUO is expanded, SETUNE must be legal!");
|
||||
CC1 = ISD::SETUNE; CC2 = ISD::SETUNE; Opc = ISD::OR; break;
|
||||
case ISD::SETOEQ:
|
||||
@ -3791,7 +3789,7 @@ bool SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
SDValue CC = Node->getOperand(4);
|
||||
ISD::CondCode CCOp = cast<CondCodeSDNode>(CC)->get();
|
||||
|
||||
if (TLI.isCondCodeLegal(CCOp, Tmp1.getSimpleValueType())) {
|
||||
if (TLI.isCondCodeLegalOrCustom(CCOp, Tmp1.getSimpleValueType())) {
|
||||
// If the condition code is legal, then we need to expand this
|
||||
// node using SETCC and SELECT.
|
||||
EVT CmpVT = Tmp1.getValueType();
|
||||
@ -3812,7 +3810,7 @@ bool SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
// version (or vice versa).
|
||||
ISD::CondCode InvCC = ISD::getSetCCInverse(CCOp,
|
||||
Tmp1.getValueType().isInteger());
|
||||
if (TLI.isCondCodeLegal(InvCC, Tmp1.getSimpleValueType())) {
|
||||
if (TLI.isCondCodeLegalOrCustom(InvCC, Tmp1.getSimpleValueType())) {
|
||||
// Use the new condition code and swap true and false
|
||||
Legalized = true;
|
||||
Tmp1 = DAG.getSelectCC(dl, Tmp1, Tmp2, Tmp4, Tmp3, InvCC);
|
||||
@ -3820,7 +3818,7 @@ bool SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
// If The inverse is not legal, then try to swap the arguments using
|
||||
// the inverse condition code.
|
||||
ISD::CondCode SwapInvCC = ISD::getSetCCSwappedOperands(InvCC);
|
||||
if (TLI.isCondCodeLegal(SwapInvCC, Tmp1.getSimpleValueType())) {
|
||||
if (TLI.isCondCodeLegalOrCustom(SwapInvCC, Tmp1.getSimpleValueType())) {
|
||||
// The swapped inverse condition is legal, so swap true and false,
|
||||
// lhs and rhs.
|
||||
Legalized = true;
|
||||
|
@ -2012,7 +2012,7 @@ SDValue TargetLowering::SimplifySetCC(EVT VT, SDValue N0, SDValue N1,
|
||||
EVT newVT = N0.getOperand(0).getValueType();
|
||||
if (DCI.isBeforeLegalizeOps() ||
|
||||
(isOperationLegal(ISD::SETCC, newVT) &&
|
||||
getCondCodeAction(Cond, newVT.getSimpleVT()) == Legal)) {
|
||||
isCondCodeLegal(Cond, newVT.getSimpleVT()))) {
|
||||
EVT NewSetCCVT =
|
||||
getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), newVT);
|
||||
SDValue NewConst = DAG.getConstant(C1.trunc(InSize), dl, newVT);
|
||||
@ -2435,8 +2435,9 @@ SDValue TargetLowering::SimplifySetCC(EVT VT, SDValue N0, SDValue N1,
|
||||
// Otherwise, we can't fold it. However, we can simplify it to SETUO/SETO
|
||||
// if it is not already.
|
||||
ISD::CondCode NewCond = UOF == 0 ? ISD::SETO : ISD::SETUO;
|
||||
if (NewCond != Cond && (DCI.isBeforeLegalizeOps() ||
|
||||
getCondCodeAction(NewCond, N0.getSimpleValueType()) == Legal))
|
||||
if (NewCond != Cond &&
|
||||
(DCI.isBeforeLegalizeOps() ||
|
||||
isCondCodeLegal(NewCond, N0.getSimpleValueType())))
|
||||
return DAG.getSetCC(dl, VT, N0, N1, NewCond);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user