mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
Cleanup PromoteIntOp_EXTRACT_VECTOR_ELT and PromoteIntRes_SETCC.
Add a new method: getAnyExtOrTrunc and use it to replace the manual check. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@140603 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a1c415cfc2
commit
a3c42f3d4e
@ -450,6 +450,10 @@ public:
|
||||
SDValue getVectorShuffle(EVT VT, DebugLoc dl, SDValue N1, SDValue N2,
|
||||
const int *MaskElts);
|
||||
|
||||
/// getAnyExtOrTrunc - Convert Op, which must be of integer type, to the
|
||||
/// integer type VT, by either any-extending or truncating it.
|
||||
SDValue getAnyExtOrTrunc(SDValue Op, DebugLoc DL, EVT VT);
|
||||
|
||||
/// getSExtOrTrunc - Convert Op, which must be of integer type, to the
|
||||
/// integer type VT, by either sign-extending or truncating it.
|
||||
SDValue getSExtOrTrunc(SDValue Op, DebugLoc DL, EVT VT);
|
||||
|
@ -504,14 +504,12 @@ SDValue DAGTypeLegalizer::PromoteIntRes_SELECT_CC(SDNode *N) {
|
||||
SDValue DAGTypeLegalizer::PromoteIntRes_SETCC(SDNode *N) {
|
||||
EVT SVT = TLI.getSetCCResultType(N->getOperand(0).getValueType());
|
||||
|
||||
// Convert to the expected type.
|
||||
EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
|
||||
|
||||
// Only use the result of getSetCCResultType if it is legal,
|
||||
// otherwise just use the promoted result type (NVT).
|
||||
if (getTypeAction(SVT) != TargetLowering::TypeLegal) {
|
||||
SVT = NVT;
|
||||
}
|
||||
if (!TLI.isTypeLegal(SVT))
|
||||
SVT = NVT;
|
||||
|
||||
DebugLoc dl = N->getDebugLoc();
|
||||
assert(SVT.isVector() == N->getOperand(0).getValueType().isVector() &&
|
||||
@ -522,6 +520,7 @@ SDValue DAGTypeLegalizer::PromoteIntRes_SETCC(SDNode *N) {
|
||||
N->getOperand(1), N->getOperand(2));
|
||||
|
||||
assert(NVT.bitsLE(SVT) && "Integer type overpromoted?");
|
||||
// Convert to the expected type.
|
||||
return DAG.getNode(ISD::TRUNCATE, dl, NVT, SetCC);
|
||||
}
|
||||
|
||||
@ -2988,12 +2987,9 @@ SDValue DAGTypeLegalizer::PromoteIntOp_EXTRACT_VECTOR_ELT(SDNode *N) {
|
||||
V0->getValueType(0).getScalarType(), V0, V1);
|
||||
|
||||
// EXTRACT_VECTOR_ELT can return types which are wider than the incoming
|
||||
// element types (see PromoteIntRes_EXTRACT_VECTOR_ELT). If this is the case
|
||||
// then we need to expand the outgoing value and not truncate it.
|
||||
bool trunc = (N->getValueType(0).getSizeInBits() <
|
||||
Ext.getValueType().getSizeInBits());
|
||||
return DAG.getNode(trunc ? ISD::TRUNCATE : ISD::ANY_EXTEND,
|
||||
dl, N->getValueType(0), Ext);
|
||||
// element types. If this is the case then we need to expand the outgoing
|
||||
// value and not truncate it.
|
||||
return DAG.getAnyExtOrTrunc(Ext, dl, N->getValueType(0));
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::PromoteIntOp_CONCAT_VECTORS(SDNode *N) {
|
||||
|
@ -881,6 +881,12 @@ void SelectionDAG::clear() {
|
||||
DbgInfo->clear();
|
||||
}
|
||||
|
||||
SDValue SelectionDAG::getAnyExtOrTrunc(SDValue Op, DebugLoc DL, EVT VT) {
|
||||
return VT.bitsGT(Op.getValueType()) ?
|
||||
getNode(ISD::ANY_EXTEND, DL, VT, Op) :
|
||||
getNode(ISD::TRUNCATE, DL, VT, Op);
|
||||
}
|
||||
|
||||
SDValue SelectionDAG::getSExtOrTrunc(SDValue Op, DebugLoc DL, EVT VT) {
|
||||
return VT.bitsGT(Op.getValueType()) ?
|
||||
getNode(ISD::SIGN_EXTEND, DL, VT, Op) :
|
||||
|
Loading…
Reference in New Issue
Block a user