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