xref: /aosp_15_r20/external/llvm/lib/Target/Hexagon/RDFCopy.h (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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