forked from OSchip/llvm-project
Get rid of SETCCE
Summary: It has been deprecated in favor of SETCCCARRY for a year now and isn't used by any in tree backend. Reviewers: efriedma, craig.topper, dblaikie, bkramer Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D47685 llvm-svn: 333939
This commit is contained in:
parent
0083179f06
commit
93a7d2aa3c
|
@ -173,6 +173,8 @@ Changes to the DAG infrastructure
|
||||||
using ``setOperationAction`` in their ``TargetLowering``. New backends
|
using ``setOperationAction`` in their ``TargetLowering``. New backends
|
||||||
should use UADDO/ADDCARRY/USUBO/SUBCARRY instead of the deprecated opcodes.
|
should use UADDO/ADDCARRY/USUBO/SUBCARRY instead of the deprecated opcodes.
|
||||||
|
|
||||||
|
* The SETCCE opcode has now been removed in favor of SETCCCARRY.
|
||||||
|
|
||||||
External Open Source Projects Using LLVM 7
|
External Open Source Projects Using LLVM 7
|
||||||
==========================================
|
==========================================
|
||||||
|
|
||||||
|
|
|
@ -412,15 +412,6 @@ namespace ISD {
|
||||||
/// then the result type must also be a vector type.
|
/// then the result type must also be a vector type.
|
||||||
SETCC,
|
SETCC,
|
||||||
|
|
||||||
/// Like SetCC, ops #0 and #1 are the LHS and RHS operands to compare, and
|
|
||||||
/// op #2 is a *carry value*. This operator checks the result of
|
|
||||||
/// "LHS - RHS - Carry", and can be used to compare two wide integers:
|
|
||||||
/// (setcce lhshi rhshi (subc lhslo rhslo) cc). Only valid for integers.
|
|
||||||
/// FIXME: This node is deprecated in favor of SETCCCARRY.
|
|
||||||
/// It is kept around for now to provide a smooth transition path
|
|
||||||
/// toward the use of SETCCCARRY and will eventually be removed.
|
|
||||||
SETCCE,
|
|
||||||
|
|
||||||
/// Like SetCC, ops #0 and #1 are the LHS and RHS operands to compare, but
|
/// Like SetCC, ops #0 and #1 are the LHS and RHS operands to compare, but
|
||||||
/// op #2 is a boolean indicating if there is an incoming carry. This
|
/// op #2 is a boolean indicating if there is an incoming carry. This
|
||||||
/// operator checks the result of "LHS - RHS - Carry", and can be used to
|
/// operator checks the result of "LHS - RHS - Carry", and can be used to
|
||||||
|
|
|
@ -329,7 +329,6 @@ namespace {
|
||||||
SDValue visitVSELECT(SDNode *N);
|
SDValue visitVSELECT(SDNode *N);
|
||||||
SDValue visitSELECT_CC(SDNode *N);
|
SDValue visitSELECT_CC(SDNode *N);
|
||||||
SDValue visitSETCC(SDNode *N);
|
SDValue visitSETCC(SDNode *N);
|
||||||
SDValue visitSETCCE(SDNode *N);
|
|
||||||
SDValue visitSETCCCARRY(SDNode *N);
|
SDValue visitSETCCCARRY(SDNode *N);
|
||||||
SDValue visitSIGN_EXTEND(SDNode *N);
|
SDValue visitSIGN_EXTEND(SDNode *N);
|
||||||
SDValue visitZERO_EXTEND(SDNode *N);
|
SDValue visitZERO_EXTEND(SDNode *N);
|
||||||
|
@ -1538,7 +1537,6 @@ SDValue DAGCombiner::visit(SDNode *N) {
|
||||||
case ISD::VSELECT: return visitVSELECT(N);
|
case ISD::VSELECT: return visitVSELECT(N);
|
||||||
case ISD::SELECT_CC: return visitSELECT_CC(N);
|
case ISD::SELECT_CC: return visitSELECT_CC(N);
|
||||||
case ISD::SETCC: return visitSETCC(N);
|
case ISD::SETCC: return visitSETCC(N);
|
||||||
case ISD::SETCCE: return visitSETCCE(N);
|
|
||||||
case ISD::SETCCCARRY: return visitSETCCCARRY(N);
|
case ISD::SETCCCARRY: return visitSETCCCARRY(N);
|
||||||
case ISD::SIGN_EXTEND: return visitSIGN_EXTEND(N);
|
case ISD::SIGN_EXTEND: return visitSIGN_EXTEND(N);
|
||||||
case ISD::ZERO_EXTEND: return visitZERO_EXTEND(N);
|
case ISD::ZERO_EXTEND: return visitZERO_EXTEND(N);
|
||||||
|
@ -7359,19 +7357,6 @@ SDValue DAGCombiner::visitSETCC(SDNode *N) {
|
||||||
return Combined;
|
return Combined;
|
||||||
}
|
}
|
||||||
|
|
||||||
SDValue DAGCombiner::visitSETCCE(SDNode *N) {
|
|
||||||
SDValue LHS = N->getOperand(0);
|
|
||||||
SDValue RHS = N->getOperand(1);
|
|
||||||
SDValue Carry = N->getOperand(2);
|
|
||||||
SDValue Cond = N->getOperand(3);
|
|
||||||
|
|
||||||
// If Carry is false, fold to a regular SETCC.
|
|
||||||
if (Carry.getOpcode() == ISD::CARRY_FALSE)
|
|
||||||
return DAG.getNode(ISD::SETCC, SDLoc(N), N->getVTList(), LHS, RHS, Cond);
|
|
||||||
|
|
||||||
return SDValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
SDValue DAGCombiner::visitSETCCCARRY(SDNode *N) {
|
SDValue DAGCombiner::visitSETCCCARRY(SDNode *N) {
|
||||||
SDValue LHS = N->getOperand(0);
|
SDValue LHS = N->getOperand(0);
|
||||||
SDValue RHS = N->getOperand(1);
|
SDValue RHS = N->getOperand(1);
|
||||||
|
|
|
@ -1012,8 +1012,7 @@ void SelectionDAGLegalize::LegalizeOp(SDNode *Node) {
|
||||||
case ISD::SETCC:
|
case ISD::SETCC:
|
||||||
case ISD::BR_CC: {
|
case ISD::BR_CC: {
|
||||||
unsigned CCOperand = Node->getOpcode() == ISD::SELECT_CC ? 4 :
|
unsigned CCOperand = Node->getOpcode() == ISD::SELECT_CC ? 4 :
|
||||||
Node->getOpcode() == ISD::SETCC ? 2 :
|
Node->getOpcode() == ISD::SETCC ? 2 : 1;
|
||||||
Node->getOpcode() == ISD::SETCCE ? 3 : 1;
|
|
||||||
unsigned CompareOperand = Node->getOpcode() == ISD::BR_CC ? 2 : 0;
|
unsigned CompareOperand = Node->getOpcode() == ISD::BR_CC ? 2 : 0;
|
||||||
MVT OpVT = Node->getOperand(CompareOperand).getSimpleValueType();
|
MVT OpVT = Node->getOperand(CompareOperand).getSimpleValueType();
|
||||||
ISD::CondCode CCCode =
|
ISD::CondCode CCCode =
|
||||||
|
|
|
@ -2913,7 +2913,6 @@ bool DAGTypeLegalizer::ExpandIntegerOperand(SDNode *N, unsigned OpNo) {
|
||||||
case ISD::SCALAR_TO_VECTOR: Res = ExpandOp_SCALAR_TO_VECTOR(N); break;
|
case ISD::SCALAR_TO_VECTOR: Res = ExpandOp_SCALAR_TO_VECTOR(N); break;
|
||||||
case ISD::SELECT_CC: Res = ExpandIntOp_SELECT_CC(N); break;
|
case ISD::SELECT_CC: Res = ExpandIntOp_SELECT_CC(N); break;
|
||||||
case ISD::SETCC: Res = ExpandIntOp_SETCC(N); break;
|
case ISD::SETCC: Res = ExpandIntOp_SETCC(N); break;
|
||||||
case ISD::SETCCE: Res = ExpandIntOp_SETCCE(N); break;
|
|
||||||
case ISD::SETCCCARRY: Res = ExpandIntOp_SETCCCARRY(N); break;
|
case ISD::SETCCCARRY: Res = ExpandIntOp_SETCCCARRY(N); break;
|
||||||
case ISD::SINT_TO_FP: Res = ExpandIntOp_SINT_TO_FP(N); break;
|
case ISD::SINT_TO_FP: Res = ExpandIntOp_SINT_TO_FP(N); break;
|
||||||
case ISD::STORE: Res = ExpandIntOp_STORE(cast<StoreSDNode>(N), OpNo); break;
|
case ISD::STORE: Res = ExpandIntOp_STORE(cast<StoreSDNode>(N), OpNo); break;
|
||||||
|
@ -3049,15 +3048,14 @@ void DAGTypeLegalizer::IntegerExpandSetCCOperands(SDValue &NewLHS,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Lower with SETCCE or SETCCCARRY if the target supports it.
|
// Lower with SETCCCARRY if the target supports it.
|
||||||
EVT HiVT = LHSHi.getValueType();
|
EVT HiVT = LHSHi.getValueType();
|
||||||
EVT ExpandVT = TLI.getTypeToExpandTo(*DAG.getContext(), HiVT);
|
EVT ExpandVT = TLI.getTypeToExpandTo(*DAG.getContext(), HiVT);
|
||||||
bool HasSETCCCARRY = TLI.isOperationLegalOrCustom(ISD::SETCCCARRY, ExpandVT);
|
bool HasSETCCCARRY = TLI.isOperationLegalOrCustom(ISD::SETCCCARRY, ExpandVT);
|
||||||
|
|
||||||
// FIXME: Make all targets support this, then remove the other lowering.
|
// FIXME: Make all targets support this, then remove the other lowering.
|
||||||
if (HasSETCCCARRY ||
|
if (HasSETCCCARRY) {
|
||||||
TLI.getOperationAction(ISD::SETCCE, ExpandVT) == TargetLowering::Custom) {
|
// SETCCCARRY can detect < and >= directly. For > and <=, flip
|
||||||
// SETCCE/SETCCCARRY can detect < and >= directly. For > and <=, flip
|
|
||||||
// operands and condition code.
|
// operands and condition code.
|
||||||
bool FlipOperands = false;
|
bool FlipOperands = false;
|
||||||
switch (CCCode) {
|
switch (CCCode) {
|
||||||
|
@ -3072,17 +3070,15 @@ void DAGTypeLegalizer::IntegerExpandSetCCOperands(SDValue &NewLHS,
|
||||||
std::swap(LHSHi, RHSHi);
|
std::swap(LHSHi, RHSHi);
|
||||||
}
|
}
|
||||||
// Perform a wide subtraction, feeding the carry from the low part into
|
// Perform a wide subtraction, feeding the carry from the low part into
|
||||||
// SETCCE/SETCCCARRY. The SETCCE/SETCCCARRY operation is essentially
|
// SETCCCARRY. The SETCCCARRY operation is essentially looking at the high
|
||||||
// looking at the high part of the result of LHS - RHS. It is negative
|
// part of the result of LHS - RHS. It is negative iff LHS < RHS. It is
|
||||||
// iff LHS < RHS. It is zero or positive iff LHS >= RHS.
|
// zero or positive iff LHS >= RHS.
|
||||||
EVT LoVT = LHSLo.getValueType();
|
EVT LoVT = LHSLo.getValueType();
|
||||||
SDVTList VTList = DAG.getVTList(
|
SDVTList VTList = DAG.getVTList(LoVT, getSetCCResultType(LoVT));
|
||||||
LoVT, HasSETCCCARRY ? getSetCCResultType(LoVT) : MVT::Glue);
|
SDValue LowCmp = DAG.getNode(ISD::USUBO, dl, VTList, LHSLo, RHSLo);
|
||||||
SDValue LowCmp = DAG.getNode(HasSETCCCARRY ? ISD::USUBO : ISD::SUBC, dl,
|
SDValue Res = DAG.getNode(ISD::SETCCCARRY, dl, getSetCCResultType(HiVT),
|
||||||
VTList, LHSLo, RHSLo);
|
LHSHi, RHSHi, LowCmp.getValue(1),
|
||||||
SDValue Res = DAG.getNode(HasSETCCCARRY ? ISD::SETCCCARRY : ISD::SETCCE, dl,
|
DAG.getCondCode(CCCode));
|
||||||
getSetCCResultType(HiVT), LHSHi, RHSHi,
|
|
||||||
LowCmp.getValue(1), DAG.getCondCode(CCCode));
|
|
||||||
NewLHS = Res;
|
NewLHS = Res;
|
||||||
NewRHS = SDValue();
|
NewRHS = SDValue();
|
||||||
return;
|
return;
|
||||||
|
@ -3150,24 +3146,6 @@ SDValue DAGTypeLegalizer::ExpandIntOp_SETCC(SDNode *N) {
|
||||||
DAG.UpdateNodeOperands(N, NewLHS, NewRHS, DAG.getCondCode(CCCode)), 0);
|
DAG.UpdateNodeOperands(N, NewLHS, NewRHS, DAG.getCondCode(CCCode)), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
SDValue DAGTypeLegalizer::ExpandIntOp_SETCCE(SDNode *N) {
|
|
||||||
SDValue LHS = N->getOperand(0);
|
|
||||||
SDValue RHS = N->getOperand(1);
|
|
||||||
SDValue Carry = N->getOperand(2);
|
|
||||||
SDValue Cond = N->getOperand(3);
|
|
||||||
SDLoc dl = SDLoc(N);
|
|
||||||
|
|
||||||
SDValue LHSLo, LHSHi, RHSLo, RHSHi;
|
|
||||||
GetExpandedInteger(LHS, LHSLo, LHSHi);
|
|
||||||
GetExpandedInteger(RHS, RHSLo, RHSHi);
|
|
||||||
|
|
||||||
// Expand to a SUBE for the low part and a smaller SETCCE for the high.
|
|
||||||
SDVTList VTList = DAG.getVTList(LHSLo.getValueType(), MVT::Glue);
|
|
||||||
SDValue LowCmp = DAG.getNode(ISD::SUBE, dl, VTList, LHSLo, RHSLo, Carry);
|
|
||||||
return DAG.getNode(ISD::SETCCE, dl, N->getValueType(0), LHSHi, RHSHi,
|
|
||||||
LowCmp.getValue(1), Cond);
|
|
||||||
}
|
|
||||||
|
|
||||||
SDValue DAGTypeLegalizer::ExpandIntOp_SETCCCARRY(SDNode *N) {
|
SDValue DAGTypeLegalizer::ExpandIntOp_SETCCCARRY(SDNode *N) {
|
||||||
SDValue LHS = N->getOperand(0);
|
SDValue LHS = N->getOperand(0);
|
||||||
SDValue RHS = N->getOperand(1);
|
SDValue RHS = N->getOperand(1);
|
||||||
|
|
|
@ -377,7 +377,6 @@ private:
|
||||||
SDValue ExpandIntOp_BR_CC(SDNode *N);
|
SDValue ExpandIntOp_BR_CC(SDNode *N);
|
||||||
SDValue ExpandIntOp_SELECT_CC(SDNode *N);
|
SDValue ExpandIntOp_SELECT_CC(SDNode *N);
|
||||||
SDValue ExpandIntOp_SETCC(SDNode *N);
|
SDValue ExpandIntOp_SETCC(SDNode *N);
|
||||||
SDValue ExpandIntOp_SETCCE(SDNode *N);
|
|
||||||
SDValue ExpandIntOp_SETCCCARRY(SDNode *N);
|
SDValue ExpandIntOp_SETCCCARRY(SDNode *N);
|
||||||
SDValue ExpandIntOp_Shift(SDNode *N);
|
SDValue ExpandIntOp_Shift(SDNode *N);
|
||||||
SDValue ExpandIntOp_SINT_TO_FP(SDNode *N);
|
SDValue ExpandIntOp_SINT_TO_FP(SDNode *N);
|
||||||
|
|
|
@ -252,7 +252,6 @@ std::string SDNode::getOperationName(const SelectionDAG *G) const {
|
||||||
case ISD::FPOWI: return "fpowi";
|
case ISD::FPOWI: return "fpowi";
|
||||||
case ISD::STRICT_FPOWI: return "strict_fpowi";
|
case ISD::STRICT_FPOWI: return "strict_fpowi";
|
||||||
case ISD::SETCC: return "setcc";
|
case ISD::SETCC: return "setcc";
|
||||||
case ISD::SETCCE: return "setcce";
|
|
||||||
case ISD::SETCCCARRY: return "setcccarry";
|
case ISD::SETCCCARRY: return "setcccarry";
|
||||||
case ISD::SELECT: return "select";
|
case ISD::SELECT: return "select";
|
||||||
case ISD::VSELECT: return "vselect";
|
case ISD::VSELECT: return "vselect";
|
||||||
|
|
Loading…
Reference in New Issue