mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-24 23:28:41 +00:00
More work to allow dag combiner to promote 16-bit ops to 32-bit.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@101621 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -5992,6 +5992,8 @@ SDValue X86TargetLowering::EmitTest(SDValue Op, unsigned X86CC,
|
||||
}
|
||||
|
||||
// Otherwise just emit a CMP with 0, which is the TEST pattern.
|
||||
if (Promote16Bit && Op.getValueType() == MVT::i16)
|
||||
Op = DAG.getNode(ISD::ANY_EXTEND, Op.getDebugLoc(), MVT::i32, Op);
|
||||
return DAG.getNode(X86ISD::CMP, dl, MVT::i32, Op,
|
||||
DAG.getConstant(0, Op.getValueType()));
|
||||
}
|
||||
@@ -6005,6 +6007,10 @@ SDValue X86TargetLowering::EmitCmp(SDValue Op0, SDValue Op1, unsigned X86CC,
|
||||
return EmitTest(Op0, X86CC, DAG);
|
||||
|
||||
DebugLoc dl = Op0.getDebugLoc();
|
||||
if (Promote16Bit && Op0.getValueType() == MVT::i16) {
|
||||
Op0 = DAG.getNode(ISD::ANY_EXTEND, Op0.getDebugLoc(), MVT::i32, Op0);
|
||||
Op1 = DAG.getNode(ISD::ANY_EXTEND, Op1.getDebugLoc(), MVT::i32, Op1);
|
||||
}
|
||||
return DAG.getNode(X86ISD::CMP, dl, MVT::i32, Op0, Op1);
|
||||
}
|
||||
|
||||
@@ -6042,11 +6048,13 @@ static SDValue LowerToBT(SDValue And, ISD::CondCode CC,
|
||||
}
|
||||
|
||||
if (LHS.getNode()) {
|
||||
// If LHS is i8, promote it to i16 with any_extend. There is no i8 BT
|
||||
// If LHS is i8, promote it to i32 with any_extend. There is no i8 BT
|
||||
// instruction. Since the shift amount is in-range-or-undefined, we know
|
||||
// that doing a bittest on the i16 value is ok. We extend to i32 because
|
||||
// that doing a bittest on the i32 value is ok. We extend to i32 because
|
||||
// the encoding for the i16 version is larger than the i32 version.
|
||||
if (LHS.getValueType() == MVT::i8)
|
||||
// Also promote i16 to i32 for performance / code size reason.
|
||||
if (LHS.getValueType() == MVT::i8 ||
|
||||
(Promote16Bit && LHS.getValueType() == MVT::i16))
|
||||
LHS = DAG.getNode(ISD::ANY_EXTEND, dl, MVT::i32, LHS);
|
||||
|
||||
// If the operand types disagree, extend the shift amount to match. Since
|
||||
@@ -6099,7 +6107,7 @@ SDValue X86TargetLowering::LowerSETCC(SDValue Op, SelectionDAG &DAG) {
|
||||
DAG.getConstant(CCode, MVT::i8), Op0.getOperand(1));
|
||||
}
|
||||
|
||||
bool isFP = Op.getOperand(1).getValueType().isFloatingPoint();
|
||||
bool isFP = Op1.getValueType().isFloatingPoint();
|
||||
unsigned X86CC = TranslateX86CC(CC, isFP, Op0, Op1, DAG);
|
||||
if (X86CC == X86::COND_INVALID)
|
||||
return SDValue();
|
||||
@@ -9781,7 +9789,8 @@ static SDValue PerformBTCombine(SDNode *N,
|
||||
unsigned BitWidth = Op1.getValueSizeInBits();
|
||||
APInt DemandedMask = APInt::getLowBitsSet(BitWidth, Log2_32(BitWidth));
|
||||
APInt KnownZero, KnownOne;
|
||||
TargetLowering::TargetLoweringOpt TLO(DAG);
|
||||
TargetLowering::TargetLoweringOpt TLO(DAG, !DCI.isBeforeLegalize(),
|
||||
!DCI.isBeforeLegalizeOps());
|
||||
TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
if (TLO.ShrinkDemandedConstant(Op1, DemandedMask) ||
|
||||
TLI.SimplifyDemandedBits(Op1, DemandedMask, KnownZero, KnownOne, TLO))
|
||||
@@ -9909,10 +9918,36 @@ SDValue X86TargetLowering::PerformDAGCombine(SDNode *N,
|
||||
return SDValue();
|
||||
}
|
||||
|
||||
/// PerformDAGCombinePromotion - This method query the target whether it is
|
||||
/// isTypeDesirableForOp - Return true if the target has native support for
|
||||
/// the specified value type and it is 'desirable' to use the type for the
|
||||
/// given node type. e.g. On x86 i16 is legal, but undesirable since i16
|
||||
/// instruction encodings are longer and some i16 instructions are slow.
|
||||
bool X86TargetLowering::isTypeDesirableForOp(unsigned Opc, EVT VT) const {
|
||||
if (!isTypeLegal(VT))
|
||||
return false;
|
||||
if (!Promote16Bit || VT != MVT::i16)
|
||||
return true;
|
||||
|
||||
switch (Opc) {
|
||||
default:
|
||||
return true;
|
||||
case ISD::SHL:
|
||||
case ISD::SRA:
|
||||
case ISD::SRL:
|
||||
case ISD::SUB:
|
||||
case ISD::ADD:
|
||||
case ISD::MUL:
|
||||
case ISD::AND:
|
||||
case ISD::OR:
|
||||
case ISD::XOR:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// IsDesirableToPromoteOp - This method query the target whether it is
|
||||
/// beneficial for dag combiner to promote the specified node. If true, it
|
||||
/// should return the desired promotion type by reference.
|
||||
bool X86TargetLowering::PerformDAGCombinePromotion(SDValue Op, EVT &PVT) const {
|
||||
bool X86TargetLowering::IsDesirableToPromoteOp(SDValue Op, EVT &PVT) const {
|
||||
if (!Promote16Bit)
|
||||
return false;
|
||||
|
||||
@@ -9923,6 +9958,16 @@ bool X86TargetLowering::PerformDAGCombinePromotion(SDValue Op, EVT &PVT) const {
|
||||
bool Commute = true;
|
||||
switch (Op.getOpcode()) {
|
||||
default: return false;
|
||||
case ISD::SHL:
|
||||
case ISD::SRA:
|
||||
case ISD::SRL: {
|
||||
SDValue N0 = Op.getOperand(0);
|
||||
// Look out for (store (shl (load), x)).
|
||||
if (isa<LoadSDNode>(N0) && N0.hasOneUse() &&
|
||||
Op.hasOneUse() && Op.getNode()->use_begin()->getOpcode() == ISD::STORE)
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
case ISD::SUB:
|
||||
Commute = false;
|
||||
// fallthrough
|
||||
|
@@ -452,7 +452,17 @@ namespace llvm {
|
||||
|
||||
virtual SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const;
|
||||
|
||||
virtual bool PerformDAGCombinePromotion(SDValue Op, EVT &PVT) const;
|
||||
/// isTypeDesirableForOp - Return true if the target has native support for
|
||||
/// the specified value type and it is 'desirable' to use the type for the
|
||||
/// given node type. e.g. On x86 i16 is legal, but undesirable since i16
|
||||
/// instruction encodings are longer and some i16 instructions are slow.
|
||||
virtual bool isTypeDesirableForOp(unsigned Opc, EVT VT) const;
|
||||
|
||||
/// isTypeDesirable - Return true if the target has native support for the
|
||||
/// specified value type and it is 'desirable' to use the type. e.g. On x86
|
||||
/// i16 is legal, but undesirable since i16 instruction encodings are longer
|
||||
/// and some i16 instructions are slow.
|
||||
virtual bool IsDesirableToPromoteOp(SDValue Op, EVT &PVT) const;
|
||||
|
||||
virtual MachineBasicBlock *EmitInstrWithCustomInserter(MachineInstr *MI,
|
||||
MachineBasicBlock *MBB,
|
||||
|
@@ -4717,6 +4717,8 @@ def : Pat<(i16 (anyext (i8 (X86setcc_c X86_COND_B, EFLAGS)))),
|
||||
(SETB_C16r)>;
|
||||
def : Pat<(i32 (anyext (i8 (X86setcc_c X86_COND_B, EFLAGS)))),
|
||||
(SETB_C32r)>;
|
||||
def : Pat<(i32 (anyext (i16 (X86setcc_c X86_COND_B, EFLAGS)))),
|
||||
(SETB_C32r)>;
|
||||
|
||||
// (or x1, x2) -> (add x1, x2) if two operands are known not to share bits.
|
||||
let AddedComplexity = 5 in { // Try this before the selecting to OR
|
||||
|
Reference in New Issue
Block a user