forked from OSchip/llvm-project
Use the correct LHS type when determining the legalization of a shift's RHS type.
llvm-svn: 127163
This commit is contained in:
parent
db44611f2e
commit
cd526fa15e
|
@ -438,12 +438,12 @@ public:
|
|||
SDValue getConvertRndSat(EVT VT, DebugLoc dl, SDValue Val, SDValue DTy,
|
||||
SDValue STy,
|
||||
SDValue Rnd, SDValue Sat, ISD::CvtCode Code);
|
||||
|
||||
|
||||
/// getVectorShuffle - Return an ISD::VECTOR_SHUFFLE node. The number of
|
||||
/// elements in VT, which must be a vector type, must match the number of
|
||||
/// mask elements NumElts. A integer mask element equal to -1 is treated as
|
||||
/// undefined.
|
||||
SDValue getVectorShuffle(EVT VT, DebugLoc dl, SDValue N1, SDValue N2,
|
||||
SDValue getVectorShuffle(EVT VT, DebugLoc dl, SDValue N1, SDValue N2,
|
||||
const int *MaskElts);
|
||||
|
||||
/// getSExtOrTrunc - Convert Op, which must be of integer type, to the
|
||||
|
@ -671,10 +671,10 @@ public:
|
|||
|
||||
/// getMDNode - Return an MDNodeSDNode which holds an MDNode.
|
||||
SDValue getMDNode(const MDNode *MD);
|
||||
|
||||
|
||||
/// getShiftAmountOperand - Return the specified value casted to
|
||||
/// the target's desired shift amount type.
|
||||
SDValue getShiftAmountOperand(SDValue Op);
|
||||
SDValue getShiftAmountOperand(EVT LHSTy, SDValue Op);
|
||||
|
||||
/// UpdateNodeOperands - *Mutate* the specified node in-place to have the
|
||||
/// specified operands. If the resultant node already exists in the DAG,
|
||||
|
@ -901,7 +901,7 @@ public:
|
|||
SmallVector<SDDbgValue*,2> &GetDbgValues(const SDNode* SD) {
|
||||
return DbgInfo->getSDDbgValues(SD);
|
||||
}
|
||||
|
||||
|
||||
/// TransferDbgValues - Transfer SDDbgValues.
|
||||
void TransferDbgValues(SDValue From, SDValue To);
|
||||
|
||||
|
@ -911,11 +911,11 @@ public:
|
|||
|
||||
SDDbgInfo::DbgIterator DbgBegin() { return DbgInfo->DbgBegin(); }
|
||||
SDDbgInfo::DbgIterator DbgEnd() { return DbgInfo->DbgEnd(); }
|
||||
SDDbgInfo::DbgIterator ByvalParmDbgBegin() {
|
||||
return DbgInfo->ByvalParmDbgBegin();
|
||||
SDDbgInfo::DbgIterator ByvalParmDbgBegin() {
|
||||
return DbgInfo->ByvalParmDbgBegin();
|
||||
}
|
||||
SDDbgInfo::DbgIterator ByvalParmDbgEnd() {
|
||||
return DbgInfo->ByvalParmDbgEnd();
|
||||
SDDbgInfo::DbgIterator ByvalParmDbgEnd() {
|
||||
return DbgInfo->ByvalParmDbgEnd();
|
||||
}
|
||||
|
||||
void dump() const;
|
||||
|
@ -972,7 +972,7 @@ public:
|
|||
/// semantics as an ADD. This handles the equivalence:
|
||||
/// X|Cst == X+Cst iff X&Cst = 0.
|
||||
bool isBaseWithConstantOffset(SDValue Op) const;
|
||||
|
||||
|
||||
/// isKnownNeverNan - Test whether the given SDValue is known to never be NaN.
|
||||
bool isKnownNeverNaN(SDValue Op) const;
|
||||
|
||||
|
@ -997,8 +997,8 @@ public:
|
|||
/// vector op and fill the end of the resulting vector with UNDEFS.
|
||||
SDValue UnrollVectorOp(SDNode *N, unsigned ResNE = 0);
|
||||
|
||||
/// isConsecutiveLoad - Return true if LD is loading 'Bytes' bytes from a
|
||||
/// location that is 'Dist' units away from the location that the 'Base' load
|
||||
/// isConsecutiveLoad - Return true if LD is loading 'Bytes' bytes from a
|
||||
/// location that is 'Dist' units away from the location that the 'Base' load
|
||||
/// is loading from.
|
||||
bool isConsecutiveLoad(LoadSDNode *LD, LoadSDNode *Base,
|
||||
unsigned Bytes, int Dist) const;
|
||||
|
@ -1032,7 +1032,7 @@ private:
|
|||
std::vector<SDNode*> ValueTypeNodes;
|
||||
std::map<EVT, SDNode*, EVT::compareRawBits> ExtendedValueTypeNodes;
|
||||
StringMap<SDNode*> ExternalSymbols;
|
||||
|
||||
|
||||
std::map<std::pair<std::string, unsigned char>,SDNode*> TargetExternalSymbols;
|
||||
};
|
||||
|
||||
|
|
|
@ -948,7 +948,8 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
|||
// Legalizing shifts/rotates requires adjusting the shift amount
|
||||
// to the appropriate width.
|
||||
if (!Ops[1].getValueType().isVector())
|
||||
Ops[1] = LegalizeOp(DAG.getShiftAmountOperand(Ops[1]));
|
||||
Ops[1] = LegalizeOp(DAG.getShiftAmountOperand(Ops[0].getValueType(),
|
||||
Ops[1]));
|
||||
break;
|
||||
case ISD::SRL_PARTS:
|
||||
case ISD::SRA_PARTS:
|
||||
|
@ -956,7 +957,8 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
|||
// Legalizing shifts/rotates requires adjusting the shift amount
|
||||
// to the appropriate width.
|
||||
if (!Ops[2].getValueType().isVector())
|
||||
Ops[2] = LegalizeOp(DAG.getShiftAmountOperand(Ops[2]));
|
||||
Ops[2] = LegalizeOp(DAG.getShiftAmountOperand(Ops[0].getValueType(),
|
||||
Ops[2]));
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -1418,9 +1418,9 @@ SDValue SelectionDAG::getMDNode(const MDNode *MD) {
|
|||
|
||||
/// getShiftAmountOperand - Return the specified value casted to
|
||||
/// the target's desired shift amount type.
|
||||
SDValue SelectionDAG::getShiftAmountOperand(SDValue Op) {
|
||||
SDValue SelectionDAG::getShiftAmountOperand(EVT LHSTy, SDValue Op) {
|
||||
EVT OpTy = Op.getValueType();
|
||||
MVT ShTy = TLI.getShiftAmountTy(OpTy);
|
||||
MVT ShTy = TLI.getShiftAmountTy(LHSTy);
|
||||
if (OpTy == ShTy || OpTy.isVector()) return Op;
|
||||
|
||||
ISD::NodeType Opcode = OpTy.bitsGT(ShTy) ? ISD::TRUNCATE : ISD::ZERO_EXTEND;
|
||||
|
@ -6314,7 +6314,8 @@ SDValue SelectionDAG::UnrollVectorOp(SDNode *N, unsigned ResNE) {
|
|||
case ISD::ROTL:
|
||||
case ISD::ROTR:
|
||||
Scalars.push_back(getNode(N->getOpcode(), dl, EltVT, Operands[0],
|
||||
getShiftAmountOperand(Operands[1])));
|
||||
getShiftAmountOperand(Operands[0].getValueType(),
|
||||
Operands[1])));
|
||||
break;
|
||||
case ISD::SIGN_EXTEND_INREG:
|
||||
case ISD::FP_ROUND_INREG: {
|
||||
|
|
Loading…
Reference in New Issue