xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/Hexagon/RDFCopy.h (revision 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e)
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