1 //===--- RDFCopy.h --------------------------------------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef RDF_COPY_H 11 #define RDF_COPY_H 12 13 #include "RDFGraph.h" 14 #include <map> 15 #include <vector> 16 17 namespace llvm { 18 class MachineBasicBlock; 19 class MachineDominatorTree; 20 class MachineInstr; 21 22 namespace rdf { 23 struct CopyPropagation { CopyPropagationCopyPropagation24 CopyPropagation(DataFlowGraph &dfg) : MDT(dfg.getDT()), DFG(dfg), 25 Trace(false) {} ~CopyPropagationCopyPropagation26 virtual ~CopyPropagation() {} 27 28 bool run(); traceCopyPropagation29 void trace(bool On) { Trace = On; } traceCopyPropagation30 bool trace() const { return Trace; } 31 32 typedef std::map<RegisterRef, RegisterRef> EqualityMap; 33 virtual bool interpretAsCopy(const MachineInstr *MI, EqualityMap &EM); 34 35 private: 36 const MachineDominatorTree &MDT; 37 DataFlowGraph &DFG; 38 DataFlowGraph::DefStackMap DefM; 39 bool Trace; 40 41 // map: register -> (map: stmt -> reaching def) 42 std::map<RegisterRef,std::map<NodeId,NodeId>> RDefMap; 43 // map: statement -> (map: dst reg -> src reg) 44 std::map<NodeId, EqualityMap> CopyMap; 45 std::vector<NodeId> Copies; 46 47 void recordCopy(NodeAddr<StmtNode*> SA, EqualityMap &EM); 48 void updateMap(NodeAddr<InstrNode*> IA); 49 bool scanBlock(MachineBasicBlock *B); 50 }; 51 } // namespace rdf 52 } // namespace llvm 53 54 #endif 55