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