63 lines · c
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-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLVM_LIB_TARGET_HEXAGON_RDFCOPY_H10#define LLVM_LIB_TARGET_HEXAGON_RDFCOPY_H11 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 19namespace llvm {20 21class MachineBasicBlock;22class MachineDominatorTree;23class MachineInstr;24 25namespace rdf {26 27 struct CopyPropagation {28 CopyPropagation(DataFlowGraph &dfg)29 : MDT(dfg.getDT()), DFG(dfg), RDefMap(RegisterRefLess(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, RegisterRefLess>;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>, RegisterRefLess> 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 rdf59 60} // end namespace llvm61 62#endif // LLVM_LIB_TARGET_HEXAGON_RDFCOPY_H63