blob: cc22c32e9c26690cf10573f44db503e62a8c2371 [file] [log] [blame]
Krzysztof Parzyszekacdff462016-01-12 15:56:33 +00001//===--- RDFLiveness.h ----------------------------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// Recalculate the liveness information given a data flow graph.
11// This includes block live-ins and kill flags.
12
13#ifndef RDF_LIVENESS_H
14#define RDF_LIVENESS_H
15
16#include "RDFGraph.h"
17#include "llvm/ADT/DenseMap.h"
18#include <map>
19
20using namespace llvm;
21
22namespace llvm {
23 class MachineBasicBlock;
24 class MachineFunction;
25 class MachineRegisterInfo;
26 class TargetRegisterInfo;
27 class MachineDominatorTree;
28 class MachineDominanceFrontier;
Krzysztof Parzyszekacdff462016-01-12 15:56:33 +000029
30namespace rdf {
31 struct Liveness {
32 public:
33 typedef std::map<MachineBasicBlock*,RegisterSet> LiveMapType;
34 typedef std::map<RegisterRef,NodeSet> RefMap;
35
36 Liveness(MachineRegisterInfo &mri, const DataFlowGraph &g)
37 : DFG(g), TRI(g.getTRI()), MDT(g.getDT()), MDF(g.getDF()),
Krzysztof Parzyszeka77fe4e2016-10-03 17:14:48 +000038 MRI(mri), Empty(), NoRegs(g.getLMI(), g.getTRI()),
39 Trace(false) {}
Krzysztof Parzyszekacdff462016-01-12 15:56:33 +000040
41 NodeList getAllReachingDefs(RegisterRef RefRR, NodeAddr<RefNode*> RefA,
Krzysztof Parzyszeka77fe4e2016-10-03 17:14:48 +000042 bool FullChain, const RegisterAggr &DefRRs);
43 NodeList getAllReachingDefs(NodeAddr<RefNode*> RefA) {
44 return getAllReachingDefs(RefA.Addr->getRegRef(), RefA, false, NoRegs);
45 }
46 NodeList getAllReachingDefs(RegisterRef RefRR, NodeAddr<RefNode*> RefA) {
47 return getAllReachingDefs(RefRR, RefA, false, NoRegs);
48 }
Krzysztof Parzyszekf5cbac92016-04-29 15:49:13 +000049 NodeSet getAllReachingDefsRec(RegisterRef RefRR, NodeAddr<RefNode*> RefA,
50 NodeSet &Visited, const NodeSet &Defs);
51 NodeSet getAllReachedUses(RegisterRef RefRR, NodeAddr<DefNode*> DefA,
Krzysztof Parzyszeka77fe4e2016-10-03 17:14:48 +000052 const RegisterAggr &DefRRs);
53 NodeSet getAllReachedUses(RegisterRef RefRR, NodeAddr<DefNode*> DefA) {
54 return getAllReachedUses(RefRR, DefA, NoRegs);
55 }
Krzysztof Parzyszekacdff462016-01-12 15:56:33 +000056
57 LiveMapType &getLiveMap() { return LiveMap; }
58 const LiveMapType &getLiveMap() const { return LiveMap; }
59 const RefMap &getRealUses(NodeId P) const {
60 auto F = RealUseMap.find(P);
61 return F == RealUseMap.end() ? Empty : F->second;
62 }
63
64 void computePhiInfo();
65 void computeLiveIns();
66 void resetLiveIns();
67 void resetKills();
68 void resetKills(MachineBasicBlock *B);
69
70 void trace(bool T) { Trace = T; }
71
72 private:
73 const DataFlowGraph &DFG;
74 const TargetRegisterInfo &TRI;
75 const MachineDominatorTree &MDT;
76 const MachineDominanceFrontier &MDF;
Krzysztof Parzyszekacdff462016-01-12 15:56:33 +000077 MachineRegisterInfo &MRI;
78 LiveMapType LiveMap;
79 const RefMap Empty;
Krzysztof Parzyszeka77fe4e2016-10-03 17:14:48 +000080 const RegisterAggr NoRegs;
Krzysztof Parzyszekacdff462016-01-12 15:56:33 +000081 bool Trace;
82
83 // Cache of mapping from node ids (for RefNodes) to the containing
84 // basic blocks. Not computing it each time for each node reduces
85 // the liveness calculation time by a large fraction.
86 typedef DenseMap<NodeId,MachineBasicBlock*> NodeBlockMap;
87 NodeBlockMap NBMap;
88
89 // Phi information:
90 //
91 // map: NodeId -> (map: RegisterRef -> NodeSet)
92 // phi id -> (map: register -> set of reached non-phi uses)
93 std::map<NodeId, RefMap> RealUseMap;
94
95 // Inverse iterated dominance frontier.
96 std::map<MachineBasicBlock*,std::set<MachineBasicBlock*>> IIDF;
97
98 // Live on entry.
99 std::map<MachineBasicBlock*,RefMap> PhiLON;
100
101 // Phi uses are considered to be located at the end of the block that
102 // they are associated with. The reaching def of a phi use dominates the
103 // block that the use corresponds to, but not the block that contains
104 // the phi itself. To include these uses in the liveness propagation (up
105 // the dominator tree), create a map: block -> set of uses live on exit.
106 std::map<MachineBasicBlock*,RefMap> PhiLOX;
107
Krzysztof Parzyszek2db0c8b2016-09-07 20:37:05 +0000108 bool isRestrictedToRef(NodeAddr<InstrNode*> IA, NodeAddr<RefNode*> RA,
Krzysztof Parzyszekacdff462016-01-12 15:56:33 +0000109 RegisterRef RR) const;
110 RegisterRef getRestrictedRegRef(NodeAddr<RefNode*> RA) const;
Krzysztof Parzyszekacdff462016-01-12 15:56:33 +0000111 MachineBasicBlock *getBlockWithRef(NodeId RN) const;
112 void traverse(MachineBasicBlock *B, RefMap &LiveIn);
113 void emptify(RefMap &M);
114 };
Benjamin Kramer922efd72016-05-27 10:06:40 +0000115} // namespace rdf
116} // namespace llvm
Krzysztof Parzyszekacdff462016-01-12 15:56:33 +0000117
118#endif // RDF_LIVENESS_H