1327952Sdim//===- RDFCopy.h ------------------------------------------------*- C++ -*-===// 2293838Sdim// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6293838Sdim// 7293838Sdim//===----------------------------------------------------------------------===// 8293838Sdim 9314564Sdim#ifndef LLVM_LIB_TARGET_HEXAGON_RDFCOPY_H 10314564Sdim#define LLVM_LIB_TARGET_HEXAGON_RDFCOPY_H 11293838Sdim 12363496Sdim#include "llvm/CodeGen/RDFGraph.h" 13363496Sdim#include "llvm/CodeGen/RDFLiveness.h" 14363496Sdim#include "llvm/CodeGen/RDFRegisters.h" 15321369Sdim#include "llvm/CodeGen/MachineFunction.h" 16293838Sdim#include <map> 17293838Sdim#include <vector> 18293838Sdim 19293838Sdimnamespace llvm { 20314564Sdim 21327952Sdimclass MachineBasicBlock; 22327952Sdimclass MachineDominatorTree; 23327952Sdimclass MachineInstr; 24293838Sdim 25293838Sdimnamespace rdf { 26314564Sdim 27293838Sdim struct CopyPropagation { 28293838Sdim CopyPropagation(DataFlowGraph &dfg) : MDT(dfg.getDT()), DFG(dfg), 29327952Sdim L(dfg.getMF().getRegInfo(), dfg) {} 30293838Sdim 31314564Sdim virtual ~CopyPropagation() = default; 32314564Sdim 33293838Sdim bool run(); 34293838Sdim void trace(bool On) { Trace = On; } 35293838Sdim bool trace() const { return Trace; } 36314564Sdim DataFlowGraph &getDFG() { return DFG; } 37293838Sdim 38327952Sdim using EqualityMap = std::map<RegisterRef, RegisterRef>; 39327952Sdim 40309124Sdim virtual bool interpretAsCopy(const MachineInstr *MI, EqualityMap &EM); 41309124Sdim 42293838Sdim private: 43293838Sdim const MachineDominatorTree &MDT; 44293838Sdim DataFlowGraph &DFG; 45321369Sdim Liveness L; 46327952Sdim bool Trace = false; 47293838Sdim 48309124Sdim // map: statement -> (map: dst reg -> src reg) 49309124Sdim std::map<NodeId, EqualityMap> CopyMap; 50293838Sdim std::vector<NodeId> Copies; 51293838Sdim 52309124Sdim void recordCopy(NodeAddr<StmtNode*> SA, EqualityMap &EM); 53293838Sdim bool scanBlock(MachineBasicBlock *B); 54321369Sdim NodeId getLocalReachingDef(RegisterRef RefRR, NodeAddr<InstrNode*> IA); 55293838Sdim }; 56293838Sdim 57314564Sdim} // end namespace rdf 58314564Sdim 59314564Sdim} // end namespace llvm 60314564Sdim 61314564Sdim#endif // LLVM_LIB_TARGET_HEXAGON_RDFCOPY_H 62