annotate lib/CodeGen/LivePhysRegs.cpp @ 134:3a76565eade5 LLVM5.0.1

update 5.0.1
author mir3636
date Sat, 17 Feb 2018 09:57:20 +0900
parents 803732b1fca8
children c2174574ed3a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 //===--- LivePhysRegs.cpp - Live Physical Register Set --------------------===//
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 //
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 // The LLVM Compiler Infrastructure
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 //
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 // This file is distributed under the University of Illinois Open Source
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 // License. See LICENSE.TXT for details.
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 //
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 //===----------------------------------------------------------------------===//
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 //
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 // This file implements the LivePhysRegs utility for tracking liveness of
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 // physical registers across machine instructions in forward or backward order.
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 // A more detailed description can be found in the corresponding header file.
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 //
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 //===----------------------------------------------------------------------===//
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 #include "llvm/CodeGen/LivePhysRegs.h"
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
17 #include "llvm/CodeGen/MachineFrameInfo.h"
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
18 #include "llvm/CodeGen/MachineFunction.h"
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 #include "llvm/CodeGen/MachineInstrBundle.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
20 #include "llvm/CodeGen/MachineRegisterInfo.h"
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 #include "llvm/Support/Debug.h"
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
22 #include "llvm/Support/raw_ostream.h"
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 using namespace llvm;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 /// \brief Remove all registers from the set that get clobbered by the register
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 /// mask.
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
28 /// The clobbers set will be the list of live registers clobbered
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
29 /// by the regmask.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
30 void LivePhysRegs::removeRegsInMask(const MachineOperand &MO,
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
31 SmallVectorImpl<std::pair<unsigned, const MachineOperand*>> *Clobbers) {
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 SparseSet<unsigned>::iterator LRI = LiveRegs.begin();
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 while (LRI != LiveRegs.end()) {
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
34 if (MO.clobbersPhysReg(*LRI)) {
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
35 if (Clobbers)
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
36 Clobbers->push_back(std::make_pair(*LRI, &MO));
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 LRI = LiveRegs.erase(LRI);
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
38 } else
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 ++LRI;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
43 /// Remove defined registers and regmask kills from the set.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
44 void LivePhysRegs::removeDefs(const MachineInstr &MI) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
45 for (ConstMIBundleOperands O(MI); O.isValid(); ++O) {
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 if (O->isReg()) {
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 if (!O->isDef())
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 continue;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 unsigned Reg = O->getReg();
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
50 if (!TargetRegisterInfo::isPhysicalRegister(Reg))
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 continue;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 removeReg(Reg);
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 } else if (O->isRegMask())
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
54 removeRegsInMask(*O);
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 }
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
56 }
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
57
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
58 /// Add uses to the set.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
59 void LivePhysRegs::addUses(const MachineInstr &MI) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
60 for (ConstMIBundleOperands O(MI); O.isValid(); ++O) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
61 if (!O->isReg() || !O->readsReg())
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 continue;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 unsigned Reg = O->getReg();
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
64 if (!TargetRegisterInfo::isPhysicalRegister(Reg))
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 continue;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 addReg(Reg);
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
69
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
70 /// Simulates liveness when stepping backwards over an instruction(bundle):
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
71 /// Remove Defs, add uses. This is the recommended way of calculating liveness.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
72 void LivePhysRegs::stepBackward(const MachineInstr &MI) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
73 // Remove defined registers and regmask kills from the set.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
74 removeDefs(MI);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
75
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
76 // Add uses to the set.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
77 addUses(MI);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
78 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
79
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 /// Simulates liveness when stepping forward over an instruction(bundle): Remove
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 /// killed-uses, add defs. This is the not recommended way, because it depends
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
82 /// on accurate kill flags. If possible use stepBackward() instead of this
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 /// function.
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
84 void LivePhysRegs::stepForward(const MachineInstr &MI,
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
85 SmallVectorImpl<std::pair<unsigned, const MachineOperand*>> &Clobbers) {
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 // Remove killed registers from the set.
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
87 for (ConstMIBundleOperands O(MI); O.isValid(); ++O) {
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 if (O->isReg()) {
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 unsigned Reg = O->getReg();
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
90 if (!TargetRegisterInfo::isPhysicalRegister(Reg))
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 continue;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 if (O->isDef()) {
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
93 // Note, dead defs are still recorded. The caller should decide how to
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
94 // handle them.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
95 Clobbers.push_back(std::make_pair(Reg, &*O));
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 } else {
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
97 if (!O->isKill())
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
98 continue;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
99 assert(O->isUse());
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
100 removeReg(Reg);
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 } else if (O->isRegMask())
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
103 removeRegsInMask(*O, &Clobbers);
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
105
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 // Add defs to the set.
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
107 for (auto Reg : Clobbers) {
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
108 // Skip dead defs. They shouldn't be added to the set.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
109 if (Reg.second->isReg() && Reg.second->isDead())
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
110 continue;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
111 addReg(Reg.first);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
112 }
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
114
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 /// Prin the currently live registers to OS.
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 void LivePhysRegs::print(raw_ostream &OS) const {
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 OS << "Live Registers:";
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 if (!TRI) {
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 OS << " (uninitialized)\n";
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 return;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
121 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
122
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
123 if (empty()) {
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
124 OS << " (empty)\n";
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
125 return;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
127
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
128 for (const_iterator I = begin(), E = end(); I != E; ++I)
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
129 OS << " " << printReg(*I, TRI);
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
130 OS << "\n";
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
131 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
132
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
133 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
134 LLVM_DUMP_METHOD void LivePhysRegs::dump() const {
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
135 dbgs() << " " << *this;
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
136 }
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
137 #endif
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
138
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
139 bool LivePhysRegs::available(const MachineRegisterInfo &MRI,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
140 unsigned Reg) const {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
141 if (LiveRegs.count(Reg))
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
142 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
143 if (MRI.isReserved(Reg))
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
144 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
145 for (MCRegAliasIterator R(Reg, TRI, false); R.isValid(); ++R) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
146 if (LiveRegs.count(*R))
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
147 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
148 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
149 return true;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
150 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
151
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
152 /// Add live-in registers of basic block \p MBB to \p LiveRegs.
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
153 void LivePhysRegs::addBlockLiveIns(const MachineBasicBlock &MBB) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
154 for (const auto &LI : MBB.liveins()) {
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
155 unsigned Reg = LI.PhysReg;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
156 LaneBitmask Mask = LI.LaneMask;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
157 MCSubRegIndexIterator S(Reg, TRI);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
158 assert(Mask.any() && "Invalid livein mask");
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
159 if (Mask.all() || !S.isValid()) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
160 addReg(Reg);
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
161 continue;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
162 }
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
163 for (; S.isValid(); ++S) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
164 unsigned SI = S.getSubRegIndex();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
165 if ((Mask & TRI->getSubRegIndexLaneMask(SI)).any())
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
166 addReg(S.getSubReg());
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
167 }
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
168 }
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
169 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
170
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
171 /// Adds all callee saved registers to \p LiveRegs.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
172 static void addCalleeSavedRegs(LivePhysRegs &LiveRegs,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
173 const MachineFunction &MF) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
174 const MachineRegisterInfo &MRI = MF.getRegInfo();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
175 for (const MCPhysReg *CSR = MRI.getCalleeSavedRegs(); CSR && *CSR; ++CSR)
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
176 LiveRegs.addReg(*CSR);
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
177 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
178
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
179 void LivePhysRegs::addPristines(const MachineFunction &MF) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
180 const MachineFrameInfo &MFI = MF.getFrameInfo();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
181 if (!MFI.isCalleeSavedInfoValid())
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
182 return;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
183 /// This function will usually be called on an empty object, handle this
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
184 /// as a special case.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
185 if (empty()) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
186 /// Add all callee saved regs, then remove the ones that are saved and
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
187 /// restored.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
188 addCalleeSavedRegs(*this, MF);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
189 /// Remove the ones that are not saved/restored; they are pristine.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
190 for (const CalleeSavedInfo &Info : MFI.getCalleeSavedInfo())
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
191 removeReg(Info.getReg());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
192 return;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
193 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
194 /// If a callee-saved register that is not pristine is already present
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
195 /// in the set, we should make sure that it stays in it. Precompute the
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
196 /// set of pristine registers in a separate object.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
197 /// Add all callee saved regs, then remove the ones that are saved+restored.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
198 LivePhysRegs Pristine(*TRI);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
199 addCalleeSavedRegs(Pristine, MF);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
200 /// Remove the ones that are not saved/restored; they are pristine.
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
201 for (const CalleeSavedInfo &Info : MFI.getCalleeSavedInfo())
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
202 Pristine.removeReg(Info.getReg());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
203 for (MCPhysReg R : Pristine)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
204 addReg(R);
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
205 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
206
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
207 void LivePhysRegs::addLiveOutsNoPristines(const MachineBasicBlock &MBB) {
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
208 // To get the live-outs we simply merge the live-ins of all successors.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
209 for (const MachineBasicBlock *Succ : MBB.successors())
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
210 addBlockLiveIns(*Succ);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
211 if (MBB.isReturnBlock()) {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
212 // Return blocks are a special case because we currently don't mark up
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
213 // return instructions completely: specifically, there is no explicit
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
214 // use for callee-saved registers. So we add all callee saved registers
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
215 // that are saved and restored (somewhere). This does not include
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
216 // callee saved registers that are unused and hence not saved and
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
217 // restored; they are called pristine.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
218 // FIXME: PEI should add explicit markings to return instructions
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
219 // instead of implicitly handling them here.
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
220 const MachineFunction &MF = *MBB.getParent();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
221 const MachineFrameInfo &MFI = MF.getFrameInfo();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
222 if (MFI.isCalleeSavedInfoValid()) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
223 for (const CalleeSavedInfo &Info : MFI.getCalleeSavedInfo())
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
224 if (Info.isRestored())
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
225 addReg(Info.getReg());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
226 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
227 }
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
228 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
229
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
230 void LivePhysRegs::addLiveOuts(const MachineBasicBlock &MBB) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
231 const MachineFunction &MF = *MBB.getParent();
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
232 addPristines(MF);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
233 addLiveOutsNoPristines(MBB);
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
234 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
235
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
236 void LivePhysRegs::addLiveIns(const MachineBasicBlock &MBB) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
237 const MachineFunction &MF = *MBB.getParent();
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
238 addPristines(MF);
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
239 addBlockLiveIns(MBB);
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
240 }
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
241
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
242 void llvm::computeLiveIns(LivePhysRegs &LiveRegs,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
243 const MachineBasicBlock &MBB) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
244 const MachineFunction &MF = *MBB.getParent();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
245 const MachineRegisterInfo &MRI = MF.getRegInfo();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
246 const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
247 LiveRegs.init(TRI);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
248 LiveRegs.addLiveOutsNoPristines(MBB);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
249 for (const MachineInstr &MI : make_range(MBB.rbegin(), MBB.rend()))
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
250 LiveRegs.stepBackward(MI);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
251 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
252
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
253 void llvm::addLiveIns(MachineBasicBlock &MBB, const LivePhysRegs &LiveRegs) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
254 assert(MBB.livein_empty() && "Expected empty live-in list");
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
255 const MachineFunction &MF = *MBB.getParent();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
256 const MachineRegisterInfo &MRI = MF.getRegInfo();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
257 const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
258 for (MCPhysReg Reg : LiveRegs) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
259 if (MRI.isReserved(Reg))
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
260 continue;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
261 // Skip the register if we are about to add one of its super registers.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
262 bool ContainsSuperReg = false;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
263 for (MCSuperRegIterator SReg(Reg, &TRI); SReg.isValid(); ++SReg) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
264 if (LiveRegs.contains(*SReg) && !MRI.isReserved(*SReg)) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
265 ContainsSuperReg = true;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
266 break;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
267 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
268 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
269 if (ContainsSuperReg)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
270 continue;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
271 MBB.addLiveIn(Reg);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
272 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
273 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
274
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
275 void llvm::recomputeLivenessFlags(MachineBasicBlock &MBB) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
276 const MachineFunction &MF = *MBB.getParent();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
277 const MachineRegisterInfo &MRI = MF.getRegInfo();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
278 const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
279
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
280 // We walk through the block backwards and start with the live outs.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
281 LivePhysRegs LiveRegs;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
282 LiveRegs.init(TRI);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
283 LiveRegs.addLiveOutsNoPristines(MBB);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
284
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
285 for (MachineInstr &MI : make_range(MBB.rbegin(), MBB.rend())) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
286 // Recompute dead flags.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
287 for (MIBundleOperands MO(MI); MO.isValid(); ++MO) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
288 if (!MO->isReg() || !MO->isDef() || MO->isDebug())
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
289 continue;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
290
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
291 unsigned Reg = MO->getReg();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
292 if (Reg == 0)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
293 continue;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
294 assert(TargetRegisterInfo::isPhysicalRegister(Reg));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
295
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
296 bool IsNotLive = LiveRegs.available(MRI, Reg);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
297 MO->setIsDead(IsNotLive);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
298 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
299
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
300 // Step backward over defs.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
301 LiveRegs.removeDefs(MI);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
302
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
303 // Recompute kill flags.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
304 for (MIBundleOperands MO(MI); MO.isValid(); ++MO) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
305 if (!MO->isReg() || !MO->readsReg() || MO->isDebug())
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
306 continue;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
307
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
308 unsigned Reg = MO->getReg();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
309 if (Reg == 0)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
310 continue;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
311 assert(TargetRegisterInfo::isPhysicalRegister(Reg));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
312
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
313 bool IsNotLive = LiveRegs.available(MRI, Reg);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
314 MO->setIsKill(IsNotLive);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
315 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
316
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
317 // Complete the stepbackward.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
318 LiveRegs.addUses(MI);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
319 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
320 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
321
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
322 void llvm::computeAndAddLiveIns(LivePhysRegs &LiveRegs,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
323 MachineBasicBlock &MBB) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
324 computeLiveIns(LiveRegs, MBB);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
325 addLiveIns(MBB, LiveRegs);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
326 }