mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-15 04:30:12 +00:00
SelectionDAG: Clean up LegalizeSetCCCondCode() function
Interpreting the results of this function is not very intuitive, so I cleaned it up to make it more clear whether or not a SETCC op was legalized and how it was legalized (either by swapping LHS and RHS or replacing with AND/OR). This patch does change functionality in the LHS and RHS swapping case, but unfortunately there are no in-tree tests for this. However, this patch is a prerequisite for R600 to take advantage of the LHS and RHS swapping, so tests will be added in subsequent commits. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@191600 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ba1bc60542
commit
8a9879a448
@ -95,7 +95,7 @@ private:
|
||||
SDValue N1, SDValue N2,
|
||||
ArrayRef<int> Mask) const;
|
||||
|
||||
void LegalizeSetCCCondCode(EVT VT, SDValue &LHS, SDValue &RHS, SDValue &CC,
|
||||
bool LegalizeSetCCCondCode(EVT VT, SDValue &LHS, SDValue &RHS, SDValue &CC,
|
||||
SDLoc dl);
|
||||
|
||||
SDValue ExpandLibCall(RTLIB::Libcall LC, SDNode *Node, bool isSigned);
|
||||
@ -1596,9 +1596,14 @@ void SelectionDAGLegalize::ExpandDYNAMIC_STACKALLOC(SDNode* Node,
|
||||
}
|
||||
|
||||
/// LegalizeSetCCCondCode - Legalize a SETCC with given LHS and RHS and
|
||||
/// condition code CC on the current target. This routine expands SETCC with
|
||||
/// illegal condition code into AND / OR of multiple SETCC values.
|
||||
void SelectionDAGLegalize::LegalizeSetCCCondCode(EVT VT,
|
||||
/// condition code CC on the current target.
|
||||
/// If the SETCC has been legalized using AND / OR, then the legalized node
|
||||
/// will be stored in LHS and RHS and CC will be set to SDValue().
|
||||
/// If the SETCC has been legalized by using getSetCCSwappedOperands(),
|
||||
/// then the values of LHS and RHS will be swapped and CC will be set to the
|
||||
/// new condition.
|
||||
/// \returns true if the SetCC has been legalized, false if it hasn't.
|
||||
bool SelectionDAGLegalize::LegalizeSetCCCondCode(EVT VT,
|
||||
SDValue &LHS, SDValue &RHS,
|
||||
SDValue &CC,
|
||||
SDLoc dl) {
|
||||
@ -1659,10 +1664,9 @@ void SelectionDAGLegalize::LegalizeSetCCCondCode(EVT VT,
|
||||
// different manner of supporting expanding these cases.
|
||||
llvm_unreachable("Don't know how to expand this condition!");
|
||||
}
|
||||
LHS = DAG.getSetCC(dl, VT, RHS, LHS, InvCC);
|
||||
RHS = SDValue();
|
||||
CC = SDValue();
|
||||
return;
|
||||
std::swap(LHS, RHS);
|
||||
CC = DAG.getCondCode(InvCC);
|
||||
return true;
|
||||
}
|
||||
|
||||
SDValue SetCC1, SetCC2;
|
||||
@ -1679,9 +1683,10 @@ void SelectionDAGLegalize::LegalizeSetCCCondCode(EVT VT,
|
||||
LHS = DAG.getNode(Opc, dl, VT, SetCC1, SetCC2);
|
||||
RHS = SDValue();
|
||||
CC = SDValue();
|
||||
break;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/// EmitStackConvert - Emit a store/load combination to the stack. This stores
|
||||
@ -3620,10 +3625,16 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
Tmp1 = Node->getOperand(0);
|
||||
Tmp2 = Node->getOperand(1);
|
||||
Tmp3 = Node->getOperand(2);
|
||||
LegalizeSetCCCondCode(Node->getValueType(0), Tmp1, Tmp2, Tmp3, dl);
|
||||
bool Legalized = LegalizeSetCCCondCode(Node->getValueType(0), Tmp1, Tmp2,
|
||||
Tmp3, dl);
|
||||
|
||||
if (Legalized) {
|
||||
// If we exapanded the SETCC by swapping LHS and RHS, create a new SETCC
|
||||
// node..
|
||||
if (Tmp3.getNode())
|
||||
Tmp1 = DAG.getNode(ISD::SETCC, dl, Node->getValueType(0),
|
||||
Tmp1, Tmp2, Tmp3);
|
||||
|
||||
// If we expanded the SETCC into an AND/OR, return the new node
|
||||
if (Tmp2.getNode() == 0) {
|
||||
Results.push_back(Tmp1);
|
||||
break;
|
||||
}
|
||||
@ -3654,14 +3665,21 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
Tmp4 = Node->getOperand(3); // False
|
||||
SDValue CC = Node->getOperand(4);
|
||||
|
||||
LegalizeSetCCCondCode(getSetCCResultType(Tmp1.getValueType()),
|
||||
Tmp1, Tmp2, CC, dl);
|
||||
bool Legalized = LegalizeSetCCCondCode(
|
||||
getSetCCResultType(Tmp1.getValueType()), Tmp1, Tmp2, CC, dl);
|
||||
|
||||
assert(!Tmp2.getNode() && "Can't legalize SELECT_CC with legal condition!");
|
||||
Tmp2 = DAG.getConstant(0, Tmp1.getValueType());
|
||||
CC = DAG.getCondCode(ISD::SETNE);
|
||||
Tmp1 = DAG.getNode(ISD::SELECT_CC, dl, Node->getValueType(0), Tmp1, Tmp2,
|
||||
Tmp3, Tmp4, CC);
|
||||
assert(Legalized && "Can't legalize SELECT_CC with legal condition!");
|
||||
// If we exapanded the SETCC by swapping LHS and RHS, create a new SELECT_CC
|
||||
// node and return it.
|
||||
if (CC.getNode()) {
|
||||
Tmp1 = DAG.getNode(ISD::SELECT_CC, dl, Node->getValueType(0),
|
||||
Tmp1, Tmp2, Tmp3, Tmp4, CC);
|
||||
} else {
|
||||
Tmp2 = DAG.getConstant(0, Tmp1.getValueType());
|
||||
CC = DAG.getCondCode(ISD::SETNE);
|
||||
Tmp1 = DAG.getNode(ISD::SELECT_CC, dl, Node->getValueType(0), Tmp1, Tmp2,
|
||||
Tmp3, Tmp4, CC);
|
||||
}
|
||||
Results.push_back(Tmp1);
|
||||
break;
|
||||
}
|
||||
@ -3671,14 +3689,21 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
Tmp3 = Node->getOperand(3); // RHS
|
||||
Tmp4 = Node->getOperand(1); // CC
|
||||
|
||||
LegalizeSetCCCondCode(getSetCCResultType(Tmp2.getValueType()),
|
||||
Tmp2, Tmp3, Tmp4, dl);
|
||||
bool Legalized = LegalizeSetCCCondCode(getSetCCResultType(
|
||||
Tmp2.getValueType()), Tmp2, Tmp3, Tmp4, dl);
|
||||
assert(Legalized && "Can't legalize BR_CC with legal condition!");
|
||||
|
||||
assert(!Tmp3.getNode() && "Can't legalize BR_CC with legal condition!");
|
||||
Tmp3 = DAG.getConstant(0, Tmp2.getValueType());
|
||||
Tmp4 = DAG.getCondCode(ISD::SETNE);
|
||||
Tmp1 = DAG.getNode(ISD::BR_CC, dl, Node->getValueType(0), Tmp1, Tmp4, Tmp2,
|
||||
Tmp3, Node->getOperand(4));
|
||||
// If we exapanded the SETCC by swapping LHS and RHS, create a new BR_CC
|
||||
// node.
|
||||
if (Tmp4.getNode()) {
|
||||
Tmp1 = DAG.getNode(ISD::BR_CC, dl, Node->getValueType(0), Tmp1,
|
||||
Tmp4, Tmp2, Tmp3, Node->getOperand(4));
|
||||
} else {
|
||||
Tmp3 = DAG.getConstant(0, Tmp2.getValueType());
|
||||
Tmp4 = DAG.getCondCode(ISD::SETNE);
|
||||
Tmp1 = DAG.getNode(ISD::BR_CC, dl, Node->getValueType(0), Tmp1, Tmp4, Tmp2,
|
||||
Tmp3, Node->getOperand(4));
|
||||
}
|
||||
Results.push_back(Tmp1);
|
||||
break;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user