mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-06 01:24:35 +00:00
Fix PR10475
- ISD::SHL/SRL/SRA must have either both scalar or both vector operands but TLI.getShiftAmountTy() so far only return scalar type. As a result, backend logic assuming that breaks. - Rename the original TLI.getShiftAmountTy() to TLI.getScalarShiftAmountTy() and re-define TLI.getShiftAmountTy() to return target-specificed scalar type or the same vector type as the 1st operand. - Fix most TICG logic assuming TLI.getShiftAmountTy() a simple scalar type. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@176364 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -531,9 +531,10 @@ SDValue DAGTypeLegalizer::PromoteIntRes_SETCC(SDNode *N) {
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::PromoteIntRes_SHL(SDNode *N) {
|
||||
return DAG.getNode(ISD::SHL, N->getDebugLoc(),
|
||||
TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)),
|
||||
GetPromotedInteger(N->getOperand(0)), N->getOperand(1));
|
||||
SDValue Res = GetPromotedInteger(N->getOperand(0));
|
||||
SDValue Amt = N->getOperand(1);
|
||||
Amt = Amt.getValueType().isVector() ? ZExtPromotedInteger(Amt) : Amt;
|
||||
return DAG.getNode(ISD::SHL, N->getDebugLoc(), Res.getValueType(), Res, Amt);
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::PromoteIntRes_SIGN_EXTEND_INREG(SDNode *N) {
|
||||
@ -555,16 +556,17 @@ SDValue DAGTypeLegalizer::PromoteIntRes_SimpleIntBinOp(SDNode *N) {
|
||||
SDValue DAGTypeLegalizer::PromoteIntRes_SRA(SDNode *N) {
|
||||
// The input value must be properly sign extended.
|
||||
SDValue Res = SExtPromotedInteger(N->getOperand(0));
|
||||
return DAG.getNode(ISD::SRA, N->getDebugLoc(),
|
||||
Res.getValueType(), Res, N->getOperand(1));
|
||||
SDValue Amt = N->getOperand(1);
|
||||
Amt = Amt.getValueType().isVector() ? ZExtPromotedInteger(Amt) : Amt;
|
||||
return DAG.getNode(ISD::SRA, N->getDebugLoc(), Res.getValueType(), Res, Amt);
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::PromoteIntRes_SRL(SDNode *N) {
|
||||
// The input value must be properly zero extended.
|
||||
EVT VT = N->getValueType(0);
|
||||
EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
|
||||
SDValue Res = ZExtPromotedInteger(N->getOperand(0));
|
||||
return DAG.getNode(ISD::SRL, N->getDebugLoc(), NVT, Res, N->getOperand(1));
|
||||
SDValue Amt = N->getOperand(1);
|
||||
Amt = Amt.getValueType().isVector() ? ZExtPromotedInteger(Amt) : Amt;
|
||||
return DAG.getNode(ISD::SRL, N->getDebugLoc(), Res.getValueType(), Res, Amt);
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::PromoteIntRes_TRUNCATE(SDNode *N) {
|
||||
@ -2101,8 +2103,9 @@ void DAGTypeLegalizer::ExpandIntRes_Shift(SDNode *N,
|
||||
// have an illegal type. Fix that first by casting the operand, otherwise
|
||||
// the new SHL_PARTS operation would need further legalization.
|
||||
SDValue ShiftOp = N->getOperand(1);
|
||||
MVT ShiftTy = TLI.getShiftAmountTy(VT);
|
||||
assert(ShiftTy.getSizeInBits() >= Log2_32_Ceil(VT.getSizeInBits()) &&
|
||||
EVT ShiftTy = TLI.getShiftAmountTy(VT);
|
||||
assert(ShiftTy.getScalarType().getSizeInBits() >=
|
||||
Log2_32_Ceil(VT.getScalarType().getSizeInBits()) &&
|
||||
"ShiftAmountTy is too small to cover the range of this type!");
|
||||
if (ShiftOp.getValueType() != ShiftTy)
|
||||
ShiftOp = DAG.getZExtOrTrunc(ShiftOp, dl, ShiftTy);
|
||||
|
Reference in New Issue
Block a user