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 RDefMap(std::less<RegisterRef>(DFG.getPRI())) {} 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 virtual bool interpretAsCopy(const MachineInstr *MI, EqualityMap &EM); 40 41 private: 42 const MachineDominatorTree &MDT; 43 DataFlowGraph &DFG; 44 DataFlowGraph::DefStackMap DefM; 45 bool Trace = false; 46 47 // map: register -> (map: stmt -> reaching def) 48 std::map<RegisterRef,std::map<NodeId,NodeId>> RDefMap; 49 // map: statement -> (map: dst reg -> src reg) 50 std::map<NodeId, EqualityMap> CopyMap; 51 std::vector<NodeId> Copies; 52 53 void recordCopy(NodeAddr<StmtNode*> SA, EqualityMap &EM); 54 void updateMap(NodeAddr<InstrNode*> IA); 55 bool scanBlock(MachineBasicBlock *B); 56 }; 57 58 } // end namespace rdf 59 60 } // end namespace llvm 61 62 #endif // LLVM_LIB_TARGET_HEXAGON_RDFCOPY_H 63