class TargetLowering;
class TargetMachine;
class MachineModuleInfo;
+class DwarfWriter;
class MachineFunction;
class MachineConstantPoolValue;
class FunctionLoweringInfo;
MachineFunction *MF;
FunctionLoweringInfo &FLI;
MachineModuleInfo *MMI;
+ DwarfWriter *DW;
/// EntryNode - The starting token.
SDNode EntryNode;
/// init - Prepare this SelectionDAG to process code in the given
/// MachineFunction.
///
- void init(MachineFunction &mf, MachineModuleInfo *mmi);
+ void init(MachineFunction &mf, MachineModuleInfo *mmi, DwarfWriter *dw);
/// clear - Clear state and free memory necessary to make this
/// SelectionDAG ready to process a new block.
TargetLowering &getTargetLoweringInfo() const { return TLI; }
FunctionLoweringInfo &getFunctionLoweringInfo() const { return FLI; }
MachineModuleInfo *getMachineModuleInfo() const { return MMI; }
+ DwarfWriter *getDwarfWriter() const { return DW; }
/// viewGraph - Pop up a GraphViz/gv window with the DAG rendered using 'dot'.
///
SDValue getValueType(MVT);
SDValue getRegister(unsigned Reg, MVT VT);
SDValue getDbgStopPoint(SDValue Root, unsigned Line, unsigned Col,
- const CompileUnitDesc *CU);
+ Value *CU);
SDValue getLabel(unsigned Opcode, SDValue Root, unsigned LabelID);
SDValue getCopyToReg(SDValue Chain, unsigned Reg, SDValue N) {
/// value assuming it was the smaller SrcTy value.
SDValue getZeroExtendInReg(SDValue Op, MVT SrcTy);
+ /// getNOT - Create a bitwise NOT operation as (XOR Val, -1).
+ SDValue getNOT(SDValue Val, MVT VT);
+
/// getCALLSEQ_START - Return a new CALLSEQ_START node, which always must have
/// a flag result (to ensure it's not CSE'd).
SDValue getCALLSEQ_START(SDValue Chain, SDValue Op) {
SDValue getIndexedStore(SDValue OrigStoe, SDValue Base,
SDValue Offset, ISD::MemIndexedMode AM);
- // getSrcValue - Construct a node to track a Value* through the backend.
+ /// getSrcValue - Construct a node to track a Value* through the backend.
SDValue getSrcValue(const Value *v);
- // getMemOperand - Construct a node to track a memory reference
- // through the backend.
+ /// getMemOperand - Construct a node to track a memory reference
+ /// through the backend.
SDValue getMemOperand(const MachineMemOperand &MO);
/// UpdateNodeOperands - *Mutate* the specified node in-place to have the
/// informed about nodes that are deleted and modified due to recursive
/// changes in the dag.
///
+ /// These functions only replace all existing uses. It's possible that as
+ /// these replacements are being performed, CSE may cause the From node
+ /// to be given new uses. These new uses of From are left in place, and
+ /// not automatically transfered to To.
+ ///
void ReplaceAllUsesWith(SDValue From, SDValue Op,
DAGUpdateListener *UpdateListener = 0);
void ReplaceAllUsesWith(SDNode *From, SDNode *To,
private:
bool RemoveNodeFromCSEMaps(SDNode *N);
- SDNode *AddNonLeafNodeToCSEMaps(SDNode *N);
+ void AddModifiedNodeToCSEMaps(SDNode *N, DAGUpdateListener *UpdateListener);
SDNode *FindModifiedNodeSlot(SDNode *N, SDValue Op, void *&InsertPos);
SDNode *FindModifiedNodeSlot(SDNode *N, SDValue Op1, SDValue Op2,
void *&InsertPos);
void *&InsertPos);
void DeleteNodeNotInCSEMaps(SDNode *N);
+ void DeallocateNode(SDNode *N);
unsigned getMVTAlignment(MVT MemoryVT) const;
void allnodes_clear();
- // List of non-single value types.
+ /// VTList - List of non-single value types.
std::vector<SDVTList> VTList;
- // Maps to auto-CSE operations.
+ /// CondCodeNodes - Maps to auto-CSE operations.
std::vector<CondCodeSDNode*> CondCodeNodes;
std::vector<SDNode*> ValueTypeNodes;