10b57cec5SDimitry Andric //===- RDFCopy.h ------------------------------------------------*- C++ -*-===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 90b57cec5SDimitry Andric #ifndef LLVM_LIB_TARGET_HEXAGON_RDFCOPY_H 100b57cec5SDimitry Andric #define LLVM_LIB_TARGET_HEXAGON_RDFCOPY_H 110b57cec5SDimitry Andric 120946e70aSDimitry Andric #include "llvm/CodeGen/RDFGraph.h" 130946e70aSDimitry Andric #include "llvm/CodeGen/RDFLiveness.h" 140946e70aSDimitry Andric #include "llvm/CodeGen/RDFRegisters.h" 150b57cec5SDimitry Andric #include "llvm/CodeGen/MachineFunction.h" 160b57cec5SDimitry Andric #include <map> 170b57cec5SDimitry Andric #include <vector> 180b57cec5SDimitry Andric 190b57cec5SDimitry Andric namespace llvm { 200b57cec5SDimitry Andric 210b57cec5SDimitry Andric class MachineBasicBlock; 220b57cec5SDimitry Andric class MachineDominatorTree; 230b57cec5SDimitry Andric class MachineInstr; 240b57cec5SDimitry Andric 250b57cec5SDimitry Andric namespace rdf { 260b57cec5SDimitry Andric 270b57cec5SDimitry Andric struct CopyPropagation { CopyPropagationCopyPropagation280b57cec5SDimitry Andric CopyPropagation(DataFlowGraph &dfg) : MDT(dfg.getDT()), DFG(dfg), 29*06c3fb27SDimitry Andric RDefMap(std::less<RegisterRef>(DFG.getPRI())) {} 300b57cec5SDimitry Andric 310b57cec5SDimitry Andric virtual ~CopyPropagation() = default; 320b57cec5SDimitry Andric 330b57cec5SDimitry Andric bool run(); traceCopyPropagation340b57cec5SDimitry Andric void trace(bool On) { Trace = On; } traceCopyPropagation350b57cec5SDimitry Andric bool trace() const { return Trace; } getDFGCopyPropagation360b57cec5SDimitry Andric DataFlowGraph &getDFG() { return DFG; } 370b57cec5SDimitry Andric 380b57cec5SDimitry Andric using EqualityMap = std::map<RegisterRef, RegisterRef>; 390b57cec5SDimitry Andric virtual bool interpretAsCopy(const MachineInstr *MI, EqualityMap &EM); 400b57cec5SDimitry Andric 410b57cec5SDimitry Andric private: 420b57cec5SDimitry Andric const MachineDominatorTree &MDT; 430b57cec5SDimitry Andric DataFlowGraph &DFG; 44*06c3fb27SDimitry Andric DataFlowGraph::DefStackMap DefM; 450b57cec5SDimitry Andric bool Trace = false; 460b57cec5SDimitry Andric 47*06c3fb27SDimitry Andric // map: register -> (map: stmt -> reaching def) 48*06c3fb27SDimitry Andric std::map<RegisterRef,std::map<NodeId,NodeId>> RDefMap; 490b57cec5SDimitry Andric // map: statement -> (map: dst reg -> src reg) 500b57cec5SDimitry Andric std::map<NodeId, EqualityMap> CopyMap; 510b57cec5SDimitry Andric std::vector<NodeId> Copies; 520b57cec5SDimitry Andric 530b57cec5SDimitry Andric void recordCopy(NodeAddr<StmtNode*> SA, EqualityMap &EM); 54*06c3fb27SDimitry Andric void updateMap(NodeAddr<InstrNode*> IA); 550b57cec5SDimitry Andric bool scanBlock(MachineBasicBlock *B); 560b57cec5SDimitry Andric }; 570b57cec5SDimitry Andric 580b57cec5SDimitry Andric } // end namespace rdf 590b57cec5SDimitry Andric 600b57cec5SDimitry Andric } // end namespace llvm 610b57cec5SDimitry Andric 620b57cec5SDimitry Andric #endif // LLVM_LIB_TARGET_HEXAGON_RDFCOPY_H 63