1 //===- RDFCopy.h ------------------------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLVM_LIB_TARGET_HEXAGON_RDFCOPY_H 10 #define LLVM_LIB_TARGET_HEXAGON_RDFCOPY_H 11 12 #include "llvm/CodeGen/RDFGraph.h" 13 #include "llvm/CodeGen/RDFLiveness.h" 14 #include "llvm/CodeGen/RDFRegisters.h" 15 #include "llvm/CodeGen/MachineFunction.h" 16 #include <map> 17 #include <vector> 18 19 namespace llvm { 20 21 class MachineBasicBlock; 22 class MachineDominatorTree; 23 class MachineInstr; 24 25 namespace rdf { 26 27 struct CopyPropagation { 28 CopyPropagation(DataFlowGraph &dfg) : MDT(dfg.getDT()), DFG(dfg), 29 L(dfg.getMF().getRegInfo(), dfg) {} 30 31 virtual ~CopyPropagation() = default; 32 33 bool run(); 34 void trace(bool On) { Trace = On; } 35 bool trace() const { return Trace; } 36 DataFlowGraph &getDFG() { return DFG; } 37 38 using EqualityMap = std::map<RegisterRef, RegisterRef>; 39 40 virtual bool interpretAsCopy(const MachineInstr *MI, EqualityMap &EM); 41 42 private: 43 const MachineDominatorTree &MDT; 44 DataFlowGraph &DFG; 45 Liveness L; 46 bool Trace = false; 47 48 // map: statement -> (map: dst reg -> src reg) 49 std::map<NodeId, EqualityMap> CopyMap; 50 std::vector<NodeId> Copies; 51 52 void recordCopy(NodeAddr<StmtNode*> SA, EqualityMap &EM); 53 bool scanBlock(MachineBasicBlock *B); 54 NodeId getLocalReachingDef(RegisterRef RefRR, NodeAddr<InstrNode*> IA); 55 }; 56 57 } // end namespace rdf 58 59 } // end namespace llvm 60 61 #endif // LLVM_LIB_TARGET_HEXAGON_RDFCOPY_H 62