mirror of
https://github.com/RPCS3/llvm.git
synced 2025-02-03 17:24:24 +00:00
Add interfaces for targets to provide target-specific dag combiner optimizations.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@26442 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
5750df9d69
commit
00ffed0468
@ -239,6 +239,12 @@ public:
|
|||||||
unsigned getNumElements(MVT::ValueType VT) const {
|
unsigned getNumElements(MVT::ValueType VT) const {
|
||||||
return NumElementsForVT[VT];
|
return NumElementsForVT[VT];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// hasTargetDAGCombine - If true, the target has custom DAG combine
|
||||||
|
/// transformations that it can perform for the specified node.
|
||||||
|
bool hasTargetDAGCombine(ISD::NodeType NT) const {
|
||||||
|
return TargetDAGCombineArray[NT >> 3] & (1 << (NT&7));
|
||||||
|
}
|
||||||
|
|
||||||
/// This function returns the maximum number of store operations permitted
|
/// This function returns the maximum number of store operations permitted
|
||||||
/// to replace a call to llvm.memset. The value is set by the target at the
|
/// to replace a call to llvm.memset. The value is set by the target at the
|
||||||
@ -334,6 +340,47 @@ public:
|
|||||||
uint64_t &KnownZero, uint64_t &KnownOne,
|
uint64_t &KnownZero, uint64_t &KnownOne,
|
||||||
TargetLoweringOpt &TLO, unsigned Depth = 0) const;
|
TargetLoweringOpt &TLO, unsigned Depth = 0) const;
|
||||||
|
|
||||||
|
/// computeMaskedBitsForTargetNode - Determine which of the bits specified in
|
||||||
|
/// Mask are known to be either zero or one and return them in the
|
||||||
|
/// KnownZero/KnownOne bitsets.
|
||||||
|
virtual void computeMaskedBitsForTargetNode(const SDOperand Op,
|
||||||
|
uint64_t Mask,
|
||||||
|
uint64_t &KnownZero,
|
||||||
|
uint64_t &KnownOne,
|
||||||
|
unsigned Depth = 0) const;
|
||||||
|
|
||||||
|
struct DAGCombinerInfo {
|
||||||
|
void *DC; // The DAG Combiner object.
|
||||||
|
bool BeforeLegalize;
|
||||||
|
public:
|
||||||
|
SelectionDAG &DAG;
|
||||||
|
|
||||||
|
DAGCombinerInfo(SelectionDAG &dag, bool bl, void *dc)
|
||||||
|
: DC(dc), BeforeLegalize(bl), DAG(dag) {}
|
||||||
|
|
||||||
|
bool isBeforeLegalize() const { return BeforeLegalize; }
|
||||||
|
|
||||||
|
void AddToWorklist(SDNode *N);
|
||||||
|
SDOperand CombineTo(SDNode *N, const std::vector<SDOperand> &To);
|
||||||
|
SDOperand CombineTo(SDNode *N, SDOperand Res);
|
||||||
|
SDOperand CombineTo(SDNode *N, SDOperand Res0, SDOperand Res1);
|
||||||
|
};
|
||||||
|
|
||||||
|
/// PerformDAGCombine - This method will be invoked for all target nodes and
|
||||||
|
/// for any target-independent nodes that the target has registered with
|
||||||
|
/// invoke it for.
|
||||||
|
///
|
||||||
|
/// The semantics are as follows:
|
||||||
|
/// Return Value:
|
||||||
|
/// SDOperand.Val == 0 - No change was made
|
||||||
|
/// SDOperand.Val == N - N was replaced, is dead, and is already handled.
|
||||||
|
/// otherwise - N should be replaced by the returned Operand.
|
||||||
|
///
|
||||||
|
/// In addition, methods provided by DAGCombinerInfo may be used to perform
|
||||||
|
/// more complex transformations.
|
||||||
|
///
|
||||||
|
virtual SDOperand PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const;
|
||||||
|
|
||||||
//===--------------------------------------------------------------------===//
|
//===--------------------------------------------------------------------===//
|
||||||
// TargetLowering Configuration Methods - These methods should be invoked by
|
// TargetLowering Configuration Methods - These methods should be invoked by
|
||||||
// the derived class constructor to configure this object for the target.
|
// the derived class constructor to configure this object for the target.
|
||||||
@ -421,6 +468,13 @@ protected:
|
|||||||
LegalFPImmediates.push_back(Imm);
|
LegalFPImmediates.push_back(Imm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// setTargetDAGCombine - Targets should invoke this method for each target
|
||||||
|
/// independent node that they want to provide a custom DAG combiner for by
|
||||||
|
/// implementing the PerformDAGCombine virtual method.
|
||||||
|
void setTargetDAGCombine(ISD::NodeType NT) {
|
||||||
|
TargetDAGCombineArray[NT >> 3] |= 1 << (NT&7);
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
//===--------------------------------------------------------------------===//
|
//===--------------------------------------------------------------------===//
|
||||||
@ -467,15 +521,6 @@ public:
|
|||||||
/// DAG node.
|
/// DAG node.
|
||||||
virtual const char *getTargetNodeName(unsigned Opcode) const;
|
virtual const char *getTargetNodeName(unsigned Opcode) const;
|
||||||
|
|
||||||
/// computeMaskedBitsForTargetNode - Determine which of the bits specified in
|
|
||||||
/// Mask are known to be either zero or one and return them in the
|
|
||||||
/// KnownZero/KnownOne bitsets.
|
|
||||||
virtual void computeMaskedBitsForTargetNode(const SDOperand Op,
|
|
||||||
uint64_t Mask,
|
|
||||||
uint64_t &KnownZero,
|
|
||||||
uint64_t &KnownOne,
|
|
||||||
unsigned Depth = 0) const;
|
|
||||||
|
|
||||||
//===--------------------------------------------------------------------===//
|
//===--------------------------------------------------------------------===//
|
||||||
// Inline Asm Support hooks
|
// Inline Asm Support hooks
|
||||||
//
|
//
|
||||||
@ -606,6 +651,11 @@ private:
|
|||||||
std::vector<std::pair<MVT::ValueType,
|
std::vector<std::pair<MVT::ValueType,
|
||||||
TargetRegisterClass*> > AvailableRegClasses;
|
TargetRegisterClass*> > AvailableRegClasses;
|
||||||
|
|
||||||
|
/// TargetDAGCombineArray - Targets can specify ISD nodes that they would
|
||||||
|
/// like PerformDAGCombine callbacks for by calling setTargetDAGCombine(),
|
||||||
|
/// which sets a bit in this array.
|
||||||
|
unsigned char TargetDAGCombineArray[128/(sizeof(unsigned char)*8)];
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/// When lowering %llvm.memset this field specifies the maximum number of
|
/// When lowering %llvm.memset this field specifies the maximum number of
|
||||||
/// store operations that may be substituted for the call to memset. Targets
|
/// store operations that may be substituted for the call to memset. Targets
|
||||||
|
@ -30,6 +30,8 @@ TargetLowering::TargetLowering(TargetMachine &tm)
|
|||||||
ShiftAmountTy = SetCCResultTy = PointerTy = getValueType(TD.getIntPtrType());
|
ShiftAmountTy = SetCCResultTy = PointerTy = getValueType(TD.getIntPtrType());
|
||||||
ShiftAmtHandling = Undefined;
|
ShiftAmtHandling = Undefined;
|
||||||
memset(RegClassForVT, 0,MVT::LAST_VALUETYPE*sizeof(TargetRegisterClass*));
|
memset(RegClassForVT, 0,MVT::LAST_VALUETYPE*sizeof(TargetRegisterClass*));
|
||||||
|
memset(TargetDAGCombineArray, 0,
|
||||||
|
sizeof(TargetDAGCombineArray)/sizeof(TargetDAGCombineArray[0]));
|
||||||
maxStoresPerMemset = maxStoresPerMemcpy = maxStoresPerMemmove = 8;
|
maxStoresPerMemset = maxStoresPerMemcpy = maxStoresPerMemmove = 8;
|
||||||
allowUnalignedMemoryAccesses = false;
|
allowUnalignedMemoryAccesses = false;
|
||||||
UseUnderscoreSetJmpLongJmp = false;
|
UseUnderscoreSetJmpLongJmp = false;
|
||||||
@ -916,6 +918,12 @@ void TargetLowering::computeMaskedBitsForTargetNode(const SDOperand Op,
|
|||||||
KnownOne = 0;
|
KnownOne = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SDOperand TargetLowering::
|
||||||
|
PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const {
|
||||||
|
// Default implementation: no optimization.
|
||||||
|
return SDOperand();
|
||||||
|
}
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// Inline Assembler Implementation Methods
|
// Inline Assembler Implementation Methods
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
Loading…
x
Reference in New Issue
Block a user