mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-06 12:16:59 +00:00
Add an MRI::tracksLiveness() flag.
Late optimization passes like branch folding and tail duplication can transform the machine code in a way that makes it expensive to keep the register liveness information up to date. There is a fuzzy line between register allocation and late scheduling where the liveness information degrades. The MRI::tracksLiveness() flag makes the line clear: While true, liveness information is accurate, and can be used for register scavenging. Once the flag is false, liveness information is not accurate, and can only be used as a hint. Late passes generally don't need the liveness information, but they will sometimes use the register scavenger to help update it. The scavenger enforces strict correctness, and we have to spend a lot of code to update register liveness that may never be used. llvm-svn: 153511
This commit is contained in:
parent
eb0805cb93
commit
7ba0f121e5
@ -32,6 +32,11 @@ class MachineRegisterInfo {
|
|||||||
/// registers have a single def.
|
/// registers have a single def.
|
||||||
bool IsSSA;
|
bool IsSSA;
|
||||||
|
|
||||||
|
/// TracksLiveness - True while register liveness is being tracked accurately.
|
||||||
|
/// Basic block live-in lists, kill flags, and implicit defs may not be
|
||||||
|
/// accurate when after this flag is cleared.
|
||||||
|
bool TracksLiveness;
|
||||||
|
|
||||||
/// VRegInfo - Information we keep for each virtual register.
|
/// VRegInfo - Information we keep for each virtual register.
|
||||||
///
|
///
|
||||||
/// Each element in this list contains the register class of the vreg and the
|
/// Each element in this list contains the register class of the vreg and the
|
||||||
@ -103,6 +108,23 @@ public:
|
|||||||
// leaveSSA - Indicates that the machine function is no longer in SSA form.
|
// leaveSSA - Indicates that the machine function is no longer in SSA form.
|
||||||
void leaveSSA() { IsSSA = false; }
|
void leaveSSA() { IsSSA = false; }
|
||||||
|
|
||||||
|
/// tracksLiveness - Returns true when tracking register liveness accurately.
|
||||||
|
///
|
||||||
|
/// While this flag is true, register liveness information in basic block
|
||||||
|
/// live-in lists and machine instruction operands is accurate. This means it
|
||||||
|
/// can be used to change the code in ways that affect the values in
|
||||||
|
/// registers, for example by the register scavenger.
|
||||||
|
///
|
||||||
|
/// When this flag is false, liveness is no longer reliable.
|
||||||
|
bool tracksLiveness() const { return TracksLiveness; }
|
||||||
|
|
||||||
|
/// invalidateLiveness - Indicates that register liveness is no longer being
|
||||||
|
/// tracked accurately.
|
||||||
|
///
|
||||||
|
/// This should be called by late passes that invalidate the liveness
|
||||||
|
/// information.
|
||||||
|
void invalidateLiveness() { TracksLiveness = false; }
|
||||||
|
|
||||||
//===--------------------------------------------------------------------===//
|
//===--------------------------------------------------------------------===//
|
||||||
// Register Info
|
// Register Info
|
||||||
//===--------------------------------------------------------------------===//
|
//===--------------------------------------------------------------------===//
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
MachineRegisterInfo::MachineRegisterInfo(const TargetRegisterInfo &TRI)
|
MachineRegisterInfo::MachineRegisterInfo(const TargetRegisterInfo &TRI)
|
||||||
: TRI(&TRI), IsSSA(true) {
|
: TRI(&TRI), IsSSA(true), TracksLiveness(true) {
|
||||||
VRegInfo.reserve(256);
|
VRegInfo.reserve(256);
|
||||||
RegAllocHints.reserve(256);
|
RegAllocHints.reserve(256);
|
||||||
UsedPhysRegs.resize(TRI.getNumRegs());
|
UsedPhysRegs.resize(TRI.getNumRegs());
|
||||||
|
@ -83,6 +83,11 @@ void RegScavenger::enterBasicBlock(MachineBasicBlock *mbb) {
|
|||||||
assert((NumPhysRegs == 0 || NumPhysRegs == TRI->getNumRegs()) &&
|
assert((NumPhysRegs == 0 || NumPhysRegs == TRI->getNumRegs()) &&
|
||||||
"Target changed?");
|
"Target changed?");
|
||||||
|
|
||||||
|
// It is not possible to use the register scavenger after late optimization
|
||||||
|
// passes that don't preserve accurate liveness information.
|
||||||
|
assert(MRI->tracksLiveness() &&
|
||||||
|
"Cannot use register scavenger with inaccurate liveness");
|
||||||
|
|
||||||
// Self-initialize.
|
// Self-initialize.
|
||||||
if (!MBB) {
|
if (!MBB) {
|
||||||
NumPhysRegs = TRI->getNumRegs();
|
NumPhysRegs = TRI->getNumRegs();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user