mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-24 05:23:45 +02:00
ad19e572fb
Use PackedRegisterRef to store the register information in the graph nodes. This commit also removes support for virtual registers. It has never been tested or used. It will be possible to add it back if there is a need. llvm-svn: 284255
56 lines
1.5 KiB
C++
56 lines
1.5 KiB
C++
//===--- RDFCopy.h --------------------------------------------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef RDF_COPY_H
|
|
#define RDF_COPY_H
|
|
|
|
#include "RDFGraph.h"
|
|
#include <map>
|
|
#include <vector>
|
|
|
|
namespace llvm {
|
|
class MachineBasicBlock;
|
|
class MachineDominatorTree;
|
|
class MachineInstr;
|
|
|
|
namespace rdf {
|
|
struct CopyPropagation {
|
|
CopyPropagation(DataFlowGraph &dfg) : MDT(dfg.getDT()), DFG(dfg),
|
|
Trace(false) {}
|
|
virtual ~CopyPropagation() {}
|
|
|
|
bool run();
|
|
void trace(bool On) { Trace = On; }
|
|
bool trace() const { return Trace; }
|
|
DataFlowGraph &getDFG() { return DFG; }
|
|
|
|
typedef std::map<RegisterRef, RegisterRef> EqualityMap;
|
|
virtual bool interpretAsCopy(const MachineInstr *MI, EqualityMap &EM);
|
|
|
|
private:
|
|
const MachineDominatorTree &MDT;
|
|
DataFlowGraph &DFG;
|
|
DataFlowGraph::DefStackMap DefM;
|
|
bool Trace;
|
|
|
|
// map: register -> (map: stmt -> reaching def)
|
|
std::map<RegisterRef,std::map<NodeId,NodeId>> RDefMap;
|
|
// map: statement -> (map: dst reg -> src reg)
|
|
std::map<NodeId, EqualityMap> CopyMap;
|
|
std::vector<NodeId> Copies;
|
|
|
|
void recordCopy(NodeAddr<StmtNode*> SA, EqualityMap &EM);
|
|
void updateMap(NodeAddr<InstrNode*> IA);
|
|
bool scanBlock(MachineBasicBlock *B);
|
|
};
|
|
} // namespace rdf
|
|
} // namespace llvm
|
|
|
|
#endif
|