Fix for PR1306.

- A register def / use now implicitly affects sub-register liveness but does
not affect liveness information of super-registers.
- Def of a larger register (if followed by a use later) is treated as
read/mod/write of a smaller register.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36434 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Evan Cheng
2007-04-25 07:30:23 +00:00
parent b2f2e64c07
commit 24a3cc4c83
4 changed files with 199 additions and 49 deletions

View File

@ -124,8 +124,25 @@ private: // Intermediate data structures
const MRegisterInfo *RegInfo;
MachineInstr **PhysRegInfo;
bool *PhysRegUsed;
// PhysRegInfo - Keep track of which instruction was the last def/use of a
// physical register. This is a purely local property, because all physical
// register references as presumed dead across basic blocks.
std::vector<MachineInstr*> PhysRegInfo;
// PhysRegUsed - Keep track whether the physical register has been used after
// its last definition. This is local property.
BitVector PhysRegUsed;
// PhysRegPartDef - Keep track of a list of instructions which "partially"
// defined the physical register (e.g. on X86 AX partially defines EAX).
// These are turned into use/mod/write if there is a use of the register
// later in the same block. This is local property.
std::vector<std::vector<MachineInstr*> > PhysRegPartDef;
// PhysRegPartUse - Keep track of which instruction was the last partial use
// of a physical register (e.g. on X86 a def of EAX followed by a use of AX).
// This is a purely local property.
std::vector<MachineInstr*> PhysRegPartUse;
typedef std::map<const MachineBasicBlock*,
std::vector<unsigned> > PHIVarInfoMap;