mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-01 15:11:24 +00:00
Make isOperationLegal do what its name suggests, and introduce a
new isOperationLegalOrCustom, which does what isOperationLegal previously did. Update a bunch of callers to use isOperationLegalOrCustom instead of isOperationLegal. In some case it wasn't obvious which behavior is desired; when in doubt I changed then to isOperationLegalOrCustom as that preserves their previous behavior. This is for the second half of PR3376. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@63212 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
0b3aa26384
commit
f560ffae1f
@ -340,12 +340,20 @@ public:
|
|||||||
return (LegalizeAction)((OpActions[Op] >> (2*VT.getSimpleVT())) & 3);
|
return (LegalizeAction)((OpActions[Op] >> (2*VT.getSimpleVT())) & 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// isOperationLegalOrCustom - Return true if the specified operation is
|
||||||
|
/// legal on this target or can be made legal with custom lowering. This
|
||||||
|
/// is used to help guide high-level lowering decisions.
|
||||||
|
bool isOperationLegalOrCustom(unsigned Op, MVT VT) const {
|
||||||
|
return (VT == MVT::Other || isTypeLegal(VT)) &&
|
||||||
|
(getOperationAction(Op, VT) == Legal ||
|
||||||
|
getOperationAction(Op, VT) == Custom);
|
||||||
|
}
|
||||||
|
|
||||||
/// isOperationLegal - Return true if the specified operation is legal on this
|
/// isOperationLegal - Return true if the specified operation is legal on this
|
||||||
/// target.
|
/// target.
|
||||||
bool isOperationLegal(unsigned Op, MVT VT) const {
|
bool isOperationLegal(unsigned Op, MVT VT) const {
|
||||||
return (VT == MVT::Other || isTypeLegal(VT)) &&
|
return (VT == MVT::Other || isTypeLegal(VT)) &&
|
||||||
(getOperationAction(Op, VT) == Legal ||
|
getOperationAction(Op, VT) == Legal;
|
||||||
getOperationAction(Op, VT) == Custom);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// getLoadExtAction - Return how this load with extension should be treated:
|
/// getLoadExtAction - Return how this load with extension should be treated:
|
||||||
|
@ -2054,8 +2054,8 @@ SDNode *DAGCombiner::MatchRotate(SDValue LHS, SDValue RHS) {
|
|||||||
if (!TLI.isTypeLegal(VT)) return 0;
|
if (!TLI.isTypeLegal(VT)) return 0;
|
||||||
|
|
||||||
// The target must have at least one rotate flavor.
|
// The target must have at least one rotate flavor.
|
||||||
bool HasROTL = TLI.isOperationLegal(ISD::ROTL, VT);
|
bool HasROTL = TLI.isOperationLegalOrCustom(ISD::ROTL, VT);
|
||||||
bool HasROTR = TLI.isOperationLegal(ISD::ROTR, VT);
|
bool HasROTR = TLI.isOperationLegalOrCustom(ISD::ROTR, VT);
|
||||||
if (!HasROTL && !HasROTR) return 0;
|
if (!HasROTL && !HasROTR) return 0;
|
||||||
|
|
||||||
// Match "(X shl/srl V1) & V2" where V2 may not be present.
|
// Match "(X shl/srl V1) & V2" where V2 may not be present.
|
||||||
@ -2541,8 +2541,8 @@ SDValue DAGCombiner::visitSRA(SDNode *N) {
|
|||||||
// on that type, and the the truncate to that type is both legal and free,
|
// on that type, and the the truncate to that type is both legal and free,
|
||||||
// perform the transform.
|
// perform the transform.
|
||||||
if (ShiftAmt &&
|
if (ShiftAmt &&
|
||||||
TLI.isOperationLegal(ISD::SIGN_EXTEND, TruncVT) &&
|
TLI.isOperationLegalOrCustom(ISD::SIGN_EXTEND, TruncVT) &&
|
||||||
TLI.isOperationLegal(ISD::TRUNCATE, VT) &&
|
TLI.isOperationLegalOrCustom(ISD::TRUNCATE, VT) &&
|
||||||
TLI.isTruncateFree(VT, TruncVT)) {
|
TLI.isTruncateFree(VT, TruncVT)) {
|
||||||
|
|
||||||
SDValue Amt = DAG.getConstant(ShiftAmt, TLI.getShiftAmountTy());
|
SDValue Amt = DAG.getConstant(ShiftAmt, TLI.getShiftAmountTy());
|
||||||
@ -2795,7 +2795,7 @@ SDValue DAGCombiner::visitSELECT(SDNode *N) {
|
|||||||
// Check against MVT::Other for SELECT_CC, which is a workaround for targets
|
// Check against MVT::Other for SELECT_CC, which is a workaround for targets
|
||||||
// having to say they don't support SELECT_CC on every type the DAG knows
|
// having to say they don't support SELECT_CC on every type the DAG knows
|
||||||
// about, since there is no way to mark an opcode illegal at all value types
|
// about, since there is no way to mark an opcode illegal at all value types
|
||||||
if (TLI.isOperationLegal(ISD::SELECT_CC, MVT::Other))
|
if (TLI.isOperationLegalOrCustom(ISD::SELECT_CC, MVT::Other))
|
||||||
return DAG.getNode(ISD::SELECT_CC, VT, N0.getOperand(0), N0.getOperand(1),
|
return DAG.getNode(ISD::SELECT_CC, VT, N0.getOperand(0), N0.getOperand(1),
|
||||||
N1, N2, N0.getOperand(2));
|
N1, N2, N0.getOperand(2));
|
||||||
else
|
else
|
||||||
@ -4032,8 +4032,8 @@ SDValue DAGCombiner::visitSINT_TO_FP(SDNode *N) {
|
|||||||
|
|
||||||
// If the input is a legal type, and SINT_TO_FP is not legal on this target,
|
// If the input is a legal type, and SINT_TO_FP is not legal on this target,
|
||||||
// but UINT_TO_FP is legal on this target, try to convert.
|
// but UINT_TO_FP is legal on this target, try to convert.
|
||||||
if (!TLI.isOperationLegal(ISD::SINT_TO_FP, OpVT) &&
|
if (!TLI.isOperationLegalOrCustom(ISD::SINT_TO_FP, OpVT) &&
|
||||||
TLI.isOperationLegal(ISD::UINT_TO_FP, OpVT)) {
|
TLI.isOperationLegalOrCustom(ISD::UINT_TO_FP, OpVT)) {
|
||||||
// If the sign bit is known to be zero, we can change this to UINT_TO_FP.
|
// If the sign bit is known to be zero, we can change this to UINT_TO_FP.
|
||||||
if (DAG.SignBitIsZero(N0))
|
if (DAG.SignBitIsZero(N0))
|
||||||
return DAG.getNode(ISD::UINT_TO_FP, VT, N0);
|
return DAG.getNode(ISD::UINT_TO_FP, VT, N0);
|
||||||
@ -4055,8 +4055,8 @@ SDValue DAGCombiner::visitUINT_TO_FP(SDNode *N) {
|
|||||||
|
|
||||||
// If the input is a legal type, and UINT_TO_FP is not legal on this target,
|
// If the input is a legal type, and UINT_TO_FP is not legal on this target,
|
||||||
// but SINT_TO_FP is legal on this target, try to convert.
|
// but SINT_TO_FP is legal on this target, try to convert.
|
||||||
if (!TLI.isOperationLegal(ISD::UINT_TO_FP, OpVT) &&
|
if (!TLI.isOperationLegalOrCustom(ISD::UINT_TO_FP, OpVT) &&
|
||||||
TLI.isOperationLegal(ISD::SINT_TO_FP, OpVT)) {
|
TLI.isOperationLegalOrCustom(ISD::SINT_TO_FP, OpVT)) {
|
||||||
// If the sign bit is known to be zero, we can change this to SINT_TO_FP.
|
// If the sign bit is known to be zero, we can change this to SINT_TO_FP.
|
||||||
if (DAG.SignBitIsZero(N0))
|
if (DAG.SignBitIsZero(N0))
|
||||||
return DAG.getNode(ISD::SINT_TO_FP, VT, N0);
|
return DAG.getNode(ISD::SINT_TO_FP, VT, N0);
|
||||||
@ -4252,7 +4252,7 @@ SDValue DAGCombiner::visitBRCOND(SDNode *N) {
|
|||||||
// fold a brcond with a setcc condition into a BR_CC node if BR_CC is legal
|
// fold a brcond with a setcc condition into a BR_CC node if BR_CC is legal
|
||||||
// on the target.
|
// on the target.
|
||||||
if (N1.getOpcode() == ISD::SETCC &&
|
if (N1.getOpcode() == ISD::SETCC &&
|
||||||
TLI.isOperationLegal(ISD::BR_CC, MVT::Other)) {
|
TLI.isOperationLegalOrCustom(ISD::BR_CC, MVT::Other)) {
|
||||||
return DAG.getNode(ISD::BR_CC, MVT::Other, Chain, N1.getOperand(2),
|
return DAG.getNode(ISD::BR_CC, MVT::Other, Chain, N1.getOperand(2),
|
||||||
N1.getOperand(0), N1.getOperand(1), N2);
|
N1.getOperand(0), N1.getOperand(1), N2);
|
||||||
}
|
}
|
||||||
@ -4726,7 +4726,7 @@ SDValue DAGCombiner::visitSTORE(SDNode *N) {
|
|||||||
getABITypeAlignment(SVT.getTypeForMVT());
|
getABITypeAlignment(SVT.getTypeForMVT());
|
||||||
if (Align <= OrigAlign &&
|
if (Align <= OrigAlign &&
|
||||||
((!LegalOperations && !ST->isVolatile()) ||
|
((!LegalOperations && !ST->isVolatile()) ||
|
||||||
TLI.isOperationLegal(ISD::STORE, SVT)))
|
TLI.isOperationLegalOrCustom(ISD::STORE, SVT)))
|
||||||
return DAG.getStore(Chain, Value.getOperand(0), Ptr, ST->getSrcValue(),
|
return DAG.getStore(Chain, Value.getOperand(0), Ptr, ST->getSrcValue(),
|
||||||
ST->getSrcValueOffset(), ST->isVolatile(), OrigAlign);
|
ST->getSrcValueOffset(), ST->isVolatile(), OrigAlign);
|
||||||
}
|
}
|
||||||
@ -4747,7 +4747,8 @@ SDValue DAGCombiner::visitSTORE(SDNode *N) {
|
|||||||
break;
|
break;
|
||||||
case MVT::f32:
|
case MVT::f32:
|
||||||
if (((TLI.isTypeLegal(MVT::i32) || !LegalTypes) && !LegalOperations &&
|
if (((TLI.isTypeLegal(MVT::i32) || !LegalTypes) && !LegalOperations &&
|
||||||
!ST->isVolatile()) || TLI.isOperationLegal(ISD::STORE, MVT::i32)) {
|
!ST->isVolatile()) ||
|
||||||
|
TLI.isOperationLegalOrCustom(ISD::STORE, MVT::i32)) {
|
||||||
Tmp = DAG.getConstant((uint32_t)CFP->getValueAPF().
|
Tmp = DAG.getConstant((uint32_t)CFP->getValueAPF().
|
||||||
bitcastToAPInt().getZExtValue(), MVT::i32);
|
bitcastToAPInt().getZExtValue(), MVT::i32);
|
||||||
return DAG.getStore(Chain, Tmp, Ptr, ST->getSrcValue(),
|
return DAG.getStore(Chain, Tmp, Ptr, ST->getSrcValue(),
|
||||||
@ -4757,14 +4758,15 @@ SDValue DAGCombiner::visitSTORE(SDNode *N) {
|
|||||||
break;
|
break;
|
||||||
case MVT::f64:
|
case MVT::f64:
|
||||||
if (((TLI.isTypeLegal(MVT::i64) || !LegalTypes) && !LegalOperations &&
|
if (((TLI.isTypeLegal(MVT::i64) || !LegalTypes) && !LegalOperations &&
|
||||||
!ST->isVolatile()) || TLI.isOperationLegal(ISD::STORE, MVT::i64)) {
|
!ST->isVolatile()) ||
|
||||||
|
TLI.isOperationLegalOrCustom(ISD::STORE, MVT::i64)) {
|
||||||
Tmp = DAG.getConstant(CFP->getValueAPF().bitcastToAPInt().
|
Tmp = DAG.getConstant(CFP->getValueAPF().bitcastToAPInt().
|
||||||
getZExtValue(), MVT::i64);
|
getZExtValue(), MVT::i64);
|
||||||
return DAG.getStore(Chain, Tmp, Ptr, ST->getSrcValue(),
|
return DAG.getStore(Chain, Tmp, Ptr, ST->getSrcValue(),
|
||||||
ST->getSrcValueOffset(), ST->isVolatile(),
|
ST->getSrcValueOffset(), ST->isVolatile(),
|
||||||
ST->getAlignment());
|
ST->getAlignment());
|
||||||
} else if (!ST->isVolatile() &&
|
} else if (!ST->isVolatile() &&
|
||||||
TLI.isOperationLegal(ISD::STORE, MVT::i32)) {
|
TLI.isOperationLegalOrCustom(ISD::STORE, MVT::i32)) {
|
||||||
// Many FP stores are not made apparent until after legalize, e.g. for
|
// Many FP stores are not made apparent until after legalize, e.g. for
|
||||||
// argument passing. Since this is so common, custom legalize the
|
// argument passing. Since this is so common, custom legalize the
|
||||||
// 64-bit integer store into two 32-bit stores.
|
// 64-bit integer store into two 32-bit stores.
|
||||||
@ -4967,7 +4969,7 @@ SDValue DAGCombiner::visitEXTRACT_VECTOR_ELT(SDNode *N) {
|
|||||||
// original load.
|
// original load.
|
||||||
unsigned NewAlign = TLI.getTargetData()->
|
unsigned NewAlign = TLI.getTargetData()->
|
||||||
getABITypeAlignment(LVT.getTypeForMVT());
|
getABITypeAlignment(LVT.getTypeForMVT());
|
||||||
if (NewAlign > Align || !TLI.isOperationLegal(ISD::LOAD, LVT))
|
if (NewAlign > Align || !TLI.isOperationLegalOrCustom(ISD::LOAD, LVT))
|
||||||
return SDValue();
|
return SDValue();
|
||||||
Align = NewAlign;
|
Align = NewAlign;
|
||||||
}
|
}
|
||||||
|
@ -1263,8 +1263,9 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
|||||||
default: assert(0 && "This action is not supported yet!");
|
default: assert(0 && "This action is not supported yet!");
|
||||||
case TargetLowering::Expand: {
|
case TargetLowering::Expand: {
|
||||||
DwarfWriter *DW = DAG.getDwarfWriter();
|
DwarfWriter *DW = DAG.getDwarfWriter();
|
||||||
bool useDEBUG_LOC = TLI.isOperationLegal(ISD::DEBUG_LOC, MVT::Other);
|
bool useDEBUG_LOC = TLI.isOperationLegalOrCustom(ISD::DEBUG_LOC,
|
||||||
bool useLABEL = TLI.isOperationLegal(ISD::DBG_LABEL, MVT::Other);
|
MVT::Other);
|
||||||
|
bool useLABEL = TLI.isOperationLegalOrCustom(ISD::DBG_LABEL, MVT::Other);
|
||||||
|
|
||||||
const DbgStopPointSDNode *DSP = cast<DbgStopPointSDNode>(Node);
|
const DbgStopPointSDNode *DSP = cast<DbgStopPointSDNode>(Node);
|
||||||
GlobalVariable *CU_GV = cast<GlobalVariable>(DSP->getCompileUnit());
|
GlobalVariable *CU_GV = cast<GlobalVariable>(DSP->getCompileUnit());
|
||||||
@ -3065,7 +3066,7 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
|||||||
"Fell off of the edge of the floating point world");
|
"Fell off of the edge of the floating point world");
|
||||||
|
|
||||||
// If the target supports SETCC of this type, use it.
|
// If the target supports SETCC of this type, use it.
|
||||||
if (TLI.isOperationLegal(ISD::SETCC, NewInTy))
|
if (TLI.isOperationLegalOrCustom(ISD::SETCC, NewInTy))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (NewInTy.isInteger())
|
if (NewInTy.isInteger())
|
||||||
@ -3228,10 +3229,10 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
|||||||
// and unsigned forms. If the target supports both SMUL_LOHI and
|
// and unsigned forms. If the target supports both SMUL_LOHI and
|
||||||
// UMUL_LOHI, form a preference by checking which forms of plain
|
// UMUL_LOHI, form a preference by checking which forms of plain
|
||||||
// MULH it supports.
|
// MULH it supports.
|
||||||
bool HasSMUL_LOHI = TLI.isOperationLegal(ISD::SMUL_LOHI, VT);
|
bool HasSMUL_LOHI = TLI.isOperationLegalOrCustom(ISD::SMUL_LOHI, VT);
|
||||||
bool HasUMUL_LOHI = TLI.isOperationLegal(ISD::UMUL_LOHI, VT);
|
bool HasUMUL_LOHI = TLI.isOperationLegalOrCustom(ISD::UMUL_LOHI, VT);
|
||||||
bool HasMULHS = TLI.isOperationLegal(ISD::MULHS, VT);
|
bool HasMULHS = TLI.isOperationLegalOrCustom(ISD::MULHS, VT);
|
||||||
bool HasMULHU = TLI.isOperationLegal(ISD::MULHU, VT);
|
bool HasMULHU = TLI.isOperationLegalOrCustom(ISD::MULHU, VT);
|
||||||
unsigned OpToUse = 0;
|
unsigned OpToUse = 0;
|
||||||
if (HasSMUL_LOHI && !HasMULHS) {
|
if (HasSMUL_LOHI && !HasMULHS) {
|
||||||
OpToUse = ISD::SMUL_LOHI;
|
OpToUse = ISD::SMUL_LOHI;
|
||||||
@ -3248,25 +3249,25 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (Node->getOpcode() == ISD::MULHS &&
|
if (Node->getOpcode() == ISD::MULHS &&
|
||||||
TLI.isOperationLegal(ISD::SMUL_LOHI, VT)) {
|
TLI.isOperationLegalOrCustom(ISD::SMUL_LOHI, VT)) {
|
||||||
Result = SDValue(DAG.getNode(ISD::SMUL_LOHI, VTs, Tmp1, Tmp2).getNode(),
|
Result = SDValue(DAG.getNode(ISD::SMUL_LOHI, VTs, Tmp1, Tmp2).getNode(),
|
||||||
1);
|
1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (Node->getOpcode() == ISD::MULHU &&
|
if (Node->getOpcode() == ISD::MULHU &&
|
||||||
TLI.isOperationLegal(ISD::UMUL_LOHI, VT)) {
|
TLI.isOperationLegalOrCustom(ISD::UMUL_LOHI, VT)) {
|
||||||
Result = SDValue(DAG.getNode(ISD::UMUL_LOHI, VTs, Tmp1, Tmp2).getNode(),
|
Result = SDValue(DAG.getNode(ISD::UMUL_LOHI, VTs, Tmp1, Tmp2).getNode(),
|
||||||
1);
|
1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (Node->getOpcode() == ISD::SDIV &&
|
if (Node->getOpcode() == ISD::SDIV &&
|
||||||
TLI.isOperationLegal(ISD::SDIVREM, VT)) {
|
TLI.isOperationLegalOrCustom(ISD::SDIVREM, VT)) {
|
||||||
Result = SDValue(DAG.getNode(ISD::SDIVREM, VTs, Tmp1, Tmp2).getNode(),
|
Result = SDValue(DAG.getNode(ISD::SDIVREM, VTs, Tmp1, Tmp2).getNode(),
|
||||||
0);
|
0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (Node->getOpcode() == ISD::UDIV &&
|
if (Node->getOpcode() == ISD::UDIV &&
|
||||||
TLI.isOperationLegal(ISD::UDIVREM, VT)) {
|
TLI.isOperationLegalOrCustom(ISD::UDIVREM, VT)) {
|
||||||
Result = SDValue(DAG.getNode(ISD::UDIVREM, VTs, Tmp1, Tmp2).getNode(),
|
Result = SDValue(DAG.getNode(ISD::UDIVREM, VTs, Tmp1, Tmp2).getNode(),
|
||||||
0);
|
0);
|
||||||
break;
|
break;
|
||||||
@ -3510,12 +3511,12 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
|||||||
// See if remainder can be lowered using two-result operations.
|
// See if remainder can be lowered using two-result operations.
|
||||||
SDVTList VTs = DAG.getVTList(VT, VT);
|
SDVTList VTs = DAG.getVTList(VT, VT);
|
||||||
if (Node->getOpcode() == ISD::SREM &&
|
if (Node->getOpcode() == ISD::SREM &&
|
||||||
TLI.isOperationLegal(ISD::SDIVREM, VT)) {
|
TLI.isOperationLegalOrCustom(ISD::SDIVREM, VT)) {
|
||||||
Result = SDValue(DAG.getNode(ISD::SDIVREM, VTs, Tmp1, Tmp2).getNode(), 1);
|
Result = SDValue(DAG.getNode(ISD::SDIVREM, VTs, Tmp1, Tmp2).getNode(), 1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (Node->getOpcode() == ISD::UREM &&
|
if (Node->getOpcode() == ISD::UREM &&
|
||||||
TLI.isOperationLegal(ISD::UDIVREM, VT)) {
|
TLI.isOperationLegalOrCustom(ISD::UDIVREM, VT)) {
|
||||||
Result = SDValue(DAG.getNode(ISD::UDIVREM, VTs, Tmp1, Tmp2).getNode(), 1);
|
Result = SDValue(DAG.getNode(ISD::UDIVREM, VTs, Tmp1, Tmp2).getNode(), 1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -4639,8 +4640,8 @@ SDValue SelectionDAGLegalize::PromoteOp(SDValue Op) {
|
|||||||
// FP_TO_UINT for small destination sizes on targets where FP_TO_UINT is not
|
// FP_TO_UINT for small destination sizes on targets where FP_TO_UINT is not
|
||||||
// legal, such as PowerPC.
|
// legal, such as PowerPC.
|
||||||
if (Node->getOpcode() == ISD::FP_TO_UINT &&
|
if (Node->getOpcode() == ISD::FP_TO_UINT &&
|
||||||
!TLI.isOperationLegal(ISD::FP_TO_UINT, NVT) &&
|
!TLI.isOperationLegalOrCustom(ISD::FP_TO_UINT, NVT) &&
|
||||||
(TLI.isOperationLegal(ISD::FP_TO_SINT, NVT) ||
|
(TLI.isOperationLegalOrCustom(ISD::FP_TO_SINT, NVT) ||
|
||||||
TLI.getOperationAction(ISD::FP_TO_SINT, NVT)==TargetLowering::Custom)){
|
TLI.getOperationAction(ISD::FP_TO_SINT, NVT)==TargetLowering::Custom)){
|
||||||
Result = DAG.getNode(ISD::FP_TO_SINT, NVT, Tmp1);
|
Result = DAG.getNode(ISD::FP_TO_SINT, NVT, Tmp1);
|
||||||
} else {
|
} else {
|
||||||
@ -5549,7 +5550,8 @@ SDValue SelectionDAGLegalize::ExpandBUILD_VECTOR(SDNode *Node) {
|
|||||||
&MaskVec[0], MaskVec.size());
|
&MaskVec[0], MaskVec.size());
|
||||||
|
|
||||||
// If the target supports SCALAR_TO_VECTOR and this shuffle mask, use it.
|
// If the target supports SCALAR_TO_VECTOR and this shuffle mask, use it.
|
||||||
if (TLI.isOperationLegal(ISD::SCALAR_TO_VECTOR, Node->getValueType(0)) &&
|
if (TLI.isOperationLegalOrCustom(ISD::SCALAR_TO_VECTOR,
|
||||||
|
Node->getValueType(0)) &&
|
||||||
isShuffleLegal(Node->getValueType(0), ShuffleMask)) {
|
isShuffleLegal(Node->getValueType(0), ShuffleMask)) {
|
||||||
Val1 = DAG.getNode(ISD::SCALAR_TO_VECTOR, Node->getValueType(0), Val1);
|
Val1 = DAG.getNode(ISD::SCALAR_TO_VECTOR, Node->getValueType(0), Val1);
|
||||||
Val2 = DAG.getNode(ISD::SCALAR_TO_VECTOR, Node->getValueType(0), Val2);
|
Val2 = DAG.getNode(ISD::SCALAR_TO_VECTOR, Node->getValueType(0), Val2);
|
||||||
@ -6330,8 +6332,8 @@ SDValue SelectionDAGLegalize::ExpandBitCount(unsigned Opc, SDValue Op) {
|
|||||||
SDValue Tmp3 = DAG.getNode(ISD::AND, VT, DAG.getNOT(Op, VT),
|
SDValue Tmp3 = DAG.getNode(ISD::AND, VT, DAG.getNOT(Op, VT),
|
||||||
DAG.getNode(ISD::SUB, VT, Op, DAG.getConstant(1, VT)));
|
DAG.getNode(ISD::SUB, VT, Op, DAG.getConstant(1, VT)));
|
||||||
// If ISD::CTLZ is legal and CTPOP isn't, then do that instead.
|
// If ISD::CTLZ is legal and CTPOP isn't, then do that instead.
|
||||||
if (!TLI.isOperationLegal(ISD::CTPOP, VT) &&
|
if (!TLI.isOperationLegalOrCustom(ISD::CTPOP, VT) &&
|
||||||
TLI.isOperationLegal(ISD::CTLZ, VT))
|
TLI.isOperationLegalOrCustom(ISD::CTLZ, VT))
|
||||||
return DAG.getNode(ISD::SUB, VT,
|
return DAG.getNode(ISD::SUB, VT,
|
||||||
DAG.getConstant(VT.getSizeInBits(), VT),
|
DAG.getConstant(VT.getSizeInBits(), VT),
|
||||||
DAG.getNode(ISD::CTLZ, VT, Tmp3));
|
DAG.getNode(ISD::CTLZ, VT, Tmp3));
|
||||||
@ -6821,8 +6823,9 @@ void SelectionDAGLegalize::ExpandOp(SDValue Op, SDValue &Lo, SDValue &Hi){
|
|||||||
// If ADDC/ADDE are supported and if the shift amount is a constant 1, emit
|
// If ADDC/ADDE are supported and if the shift amount is a constant 1, emit
|
||||||
// this X << 1 as X+X.
|
// this X << 1 as X+X.
|
||||||
if (ConstantSDNode *ShAmt = dyn_cast<ConstantSDNode>(ShiftAmt)) {
|
if (ConstantSDNode *ShAmt = dyn_cast<ConstantSDNode>(ShiftAmt)) {
|
||||||
if (ShAmt->getAPIntValue() == 1 && TLI.isOperationLegal(ISD::ADDC, NVT) &&
|
if (ShAmt->getAPIntValue() == 1 &&
|
||||||
TLI.isOperationLegal(ISD::ADDE, NVT)) {
|
TLI.isOperationLegalOrCustom(ISD::ADDC, NVT) &&
|
||||||
|
TLI.isOperationLegalOrCustom(ISD::ADDE, NVT)) {
|
||||||
SDValue LoOps[2], HiOps[3];
|
SDValue LoOps[2], HiOps[3];
|
||||||
ExpandOp(Node->getOperand(0), LoOps[0], HiOps[0]);
|
ExpandOp(Node->getOperand(0), LoOps[0], HiOps[0]);
|
||||||
SDVTList VTList = DAG.getVTList(LoOps[0].getValueType(), MVT::Flag);
|
SDVTList VTList = DAG.getVTList(LoOps[0].getValueType(), MVT::Flag);
|
||||||
@ -6944,7 +6947,7 @@ void SelectionDAGLegalize::ExpandOp(SDValue Op, SDValue &Lo, SDValue &Hi){
|
|||||||
bool hasCarry = false;
|
bool hasCarry = false;
|
||||||
for (unsigned BitSize = NVT.getSizeInBits(); BitSize != 0; BitSize /= 2) {
|
for (unsigned BitSize = NVT.getSizeInBits(); BitSize != 0; BitSize /= 2) {
|
||||||
MVT AVT = MVT::getIntegerVT(BitSize);
|
MVT AVT = MVT::getIntegerVT(BitSize);
|
||||||
if (TLI.isOperationLegal(OpV, AVT)) {
|
if (TLI.isOperationLegalOrCustom(OpV, AVT)) {
|
||||||
hasCarry = true;
|
hasCarry = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -7041,10 +7044,10 @@ void SelectionDAGLegalize::ExpandOp(SDValue Op, SDValue &Lo, SDValue &Hi){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool HasMULHS = TLI.isOperationLegal(ISD::MULHS, NVT);
|
bool HasMULHS = TLI.isOperationLegalOrCustom(ISD::MULHS, NVT);
|
||||||
bool HasMULHU = TLI.isOperationLegal(ISD::MULHU, NVT);
|
bool HasMULHU = TLI.isOperationLegalOrCustom(ISD::MULHU, NVT);
|
||||||
bool HasSMUL_LOHI = TLI.isOperationLegal(ISD::SMUL_LOHI, NVT);
|
bool HasSMUL_LOHI = TLI.isOperationLegalOrCustom(ISD::SMUL_LOHI, NVT);
|
||||||
bool HasUMUL_LOHI = TLI.isOperationLegal(ISD::UMUL_LOHI, NVT);
|
bool HasUMUL_LOHI = TLI.isOperationLegalOrCustom(ISD::UMUL_LOHI, NVT);
|
||||||
if (HasMULHU || HasMULHS || HasUMUL_LOHI || HasSMUL_LOHI) {
|
if (HasMULHU || HasMULHS || HasUMUL_LOHI || HasSMUL_LOHI) {
|
||||||
SDValue LL, LH, RL, RH;
|
SDValue LL, LH, RL, RH;
|
||||||
ExpandOp(Node->getOperand(0), LL, LH);
|
ExpandOp(Node->getOperand(0), LL, LH);
|
||||||
|
@ -345,8 +345,8 @@ SDValue DAGTypeLegalizer::PromoteIntRes_FP_TO_XINT(SDNode *N) {
|
|||||||
// FP_TO_UINT for small destination sizes on targets where FP_TO_UINT is not
|
// FP_TO_UINT for small destination sizes on targets where FP_TO_UINT is not
|
||||||
// legal, such as PowerPC.
|
// legal, such as PowerPC.
|
||||||
if (N->getOpcode() == ISD::FP_TO_UINT &&
|
if (N->getOpcode() == ISD::FP_TO_UINT &&
|
||||||
!TLI.isOperationLegal(ISD::FP_TO_UINT, NVT) &&
|
!TLI.isOperationLegalOrCustom(ISD::FP_TO_UINT, NVT) &&
|
||||||
TLI.isOperationLegal(ISD::FP_TO_SINT, NVT))
|
TLI.isOperationLegalOrCustom(ISD::FP_TO_SINT, NVT))
|
||||||
NewOpc = ISD::FP_TO_SINT;
|
NewOpc = ISD::FP_TO_SINT;
|
||||||
|
|
||||||
SDValue Res = DAG.getNode(NewOpc, NVT, N->getOperand(0));
|
SDValue Res = DAG.getNode(NewOpc, NVT, N->getOperand(0));
|
||||||
@ -1008,7 +1008,8 @@ void DAGTypeLegalizer::ExpandShiftByConstant(SDNode *N, unsigned Amt,
|
|||||||
Lo = DAG.getConstant(0, NVT);
|
Lo = DAG.getConstant(0, NVT);
|
||||||
Hi = InL;
|
Hi = InL;
|
||||||
} else if (Amt == 1 &&
|
} else if (Amt == 1 &&
|
||||||
TLI.isOperationLegal(ISD::ADDC, TLI.getTypeToExpandTo(NVT))) {
|
TLI.isOperationLegalOrCustom(ISD::ADDC,
|
||||||
|
TLI.getTypeToExpandTo(NVT))) {
|
||||||
// Emit this X << 1 as X+X.
|
// Emit this X << 1 as X+X.
|
||||||
SDVTList VTList = DAG.getVTList(NVT, MVT::Flag);
|
SDVTList VTList = DAG.getVTList(NVT, MVT::Flag);
|
||||||
SDValue LoOps[2] = { InL, InL };
|
SDValue LoOps[2] = { InL, InL };
|
||||||
@ -1166,8 +1167,9 @@ void DAGTypeLegalizer::ExpandIntRes_ADDSUB(SDNode *N,
|
|||||||
// a carry of type MVT::Flag, but there doesn't seem to be any way to
|
// a carry of type MVT::Flag, but there doesn't seem to be any way to
|
||||||
// generate a value of this type in the expanded code sequence.
|
// generate a value of this type in the expanded code sequence.
|
||||||
bool hasCarry =
|
bool hasCarry =
|
||||||
TLI.isOperationLegal(N->getOpcode() == ISD::ADD ? ISD::ADDC : ISD::SUBC,
|
TLI.isOperationLegalOrCustom(N->getOpcode() == ISD::ADD ?
|
||||||
TLI.getTypeToExpandTo(NVT));
|
ISD::ADDC : ISD::SUBC,
|
||||||
|
TLI.getTypeToExpandTo(NVT));
|
||||||
|
|
||||||
if (hasCarry) {
|
if (hasCarry) {
|
||||||
SDVTList VTList = DAG.getVTList(NVT, MVT::Flag);
|
SDVTList VTList = DAG.getVTList(NVT, MVT::Flag);
|
||||||
@ -1513,10 +1515,10 @@ void DAGTypeLegalizer::ExpandIntRes_MUL(SDNode *N,
|
|||||||
MVT VT = N->getValueType(0);
|
MVT VT = N->getValueType(0);
|
||||||
MVT NVT = TLI.getTypeToTransformTo(VT);
|
MVT NVT = TLI.getTypeToTransformTo(VT);
|
||||||
|
|
||||||
bool HasMULHS = TLI.isOperationLegal(ISD::MULHS, NVT);
|
bool HasMULHS = TLI.isOperationLegalOrCustom(ISD::MULHS, NVT);
|
||||||
bool HasMULHU = TLI.isOperationLegal(ISD::MULHU, NVT);
|
bool HasMULHU = TLI.isOperationLegalOrCustom(ISD::MULHU, NVT);
|
||||||
bool HasSMUL_LOHI = TLI.isOperationLegal(ISD::SMUL_LOHI, NVT);
|
bool HasSMUL_LOHI = TLI.isOperationLegalOrCustom(ISD::SMUL_LOHI, NVT);
|
||||||
bool HasUMUL_LOHI = TLI.isOperationLegal(ISD::UMUL_LOHI, NVT);
|
bool HasUMUL_LOHI = TLI.isOperationLegalOrCustom(ISD::UMUL_LOHI, NVT);
|
||||||
if (HasMULHU || HasMULHS || HasUMUL_LOHI || HasSMUL_LOHI) {
|
if (HasMULHU || HasMULHS || HasUMUL_LOHI || HasSMUL_LOHI) {
|
||||||
SDValue LL, LH, RL, RH;
|
SDValue LL, LH, RL, RH;
|
||||||
GetExpandedInteger(N->getOperand(0), LL, LH);
|
GetExpandedInteger(N->getOperand(0), LL, LH);
|
||||||
|
@ -1588,8 +1588,8 @@ bool SelectionDAGLowering::handleSmallSwitchRange(CaseRec& CR,
|
|||||||
|
|
||||||
static inline bool areJTsAllowed(const TargetLowering &TLI) {
|
static inline bool areJTsAllowed(const TargetLowering &TLI) {
|
||||||
return !DisableJumpTables &&
|
return !DisableJumpTables &&
|
||||||
(TLI.isOperationLegal(ISD::BR_JT, MVT::Other) ||
|
(TLI.isOperationLegalOrCustom(ISD::BR_JT, MVT::Other) ||
|
||||||
TLI.isOperationLegal(ISD::BRIND, MVT::Other));
|
TLI.isOperationLegalOrCustom(ISD::BRIND, MVT::Other));
|
||||||
}
|
}
|
||||||
|
|
||||||
static APInt ComputeRange(const APInt &First, const APInt &Last) {
|
static APInt ComputeRange(const APInt &First, const APInt &Last) {
|
||||||
|
@ -2365,10 +2365,10 @@ SDValue TargetLowering::BuildSDIV(SDNode *N, SelectionDAG &DAG,
|
|||||||
// Multiply the numerator (operand 0) by the magic value
|
// Multiply the numerator (operand 0) by the magic value
|
||||||
// FIXME: We should support doing a MUL in a wider type
|
// FIXME: We should support doing a MUL in a wider type
|
||||||
SDValue Q;
|
SDValue Q;
|
||||||
if (isOperationLegal(ISD::MULHS, VT))
|
if (isOperationLegalOrCustom(ISD::MULHS, VT))
|
||||||
Q = DAG.getNode(ISD::MULHS, VT, N->getOperand(0),
|
Q = DAG.getNode(ISD::MULHS, VT, N->getOperand(0),
|
||||||
DAG.getConstant(magics.m, VT));
|
DAG.getConstant(magics.m, VT));
|
||||||
else if (isOperationLegal(ISD::SMUL_LOHI, VT))
|
else if (isOperationLegalOrCustom(ISD::SMUL_LOHI, VT))
|
||||||
Q = SDValue(DAG.getNode(ISD::SMUL_LOHI, DAG.getVTList(VT, VT),
|
Q = SDValue(DAG.getNode(ISD::SMUL_LOHI, DAG.getVTList(VT, VT),
|
||||||
N->getOperand(0),
|
N->getOperand(0),
|
||||||
DAG.getConstant(magics.m, VT)).getNode(), 1);
|
DAG.getConstant(magics.m, VT)).getNode(), 1);
|
||||||
@ -2423,10 +2423,10 @@ SDValue TargetLowering::BuildUDIV(SDNode *N, SelectionDAG &DAG,
|
|||||||
// Multiply the numerator (operand 0) by the magic value
|
// Multiply the numerator (operand 0) by the magic value
|
||||||
// FIXME: We should support doing a MUL in a wider type
|
// FIXME: We should support doing a MUL in a wider type
|
||||||
SDValue Q;
|
SDValue Q;
|
||||||
if (isOperationLegal(ISD::MULHU, VT))
|
if (isOperationLegalOrCustom(ISD::MULHU, VT))
|
||||||
Q = DAG.getNode(ISD::MULHU, VT, N->getOperand(0),
|
Q = DAG.getNode(ISD::MULHU, VT, N->getOperand(0),
|
||||||
DAG.getConstant(magics.m, VT));
|
DAG.getConstant(magics.m, VT));
|
||||||
else if (isOperationLegal(ISD::UMUL_LOHI, VT))
|
else if (isOperationLegalOrCustom(ISD::UMUL_LOHI, VT))
|
||||||
Q = SDValue(DAG.getNode(ISD::UMUL_LOHI, DAG.getVTList(VT, VT),
|
Q = SDValue(DAG.getNode(ISD::UMUL_LOHI, DAG.getVTList(VT, VT),
|
||||||
N->getOperand(0),
|
N->getOperand(0),
|
||||||
DAG.getConstant(magics.m, VT)).getNode(), 1);
|
DAG.getConstant(magics.m, VT)).getNode(), 1);
|
||||||
|
Loading…
Reference in New Issue
Block a user