diff options
| author | Evan Cheng <evan.cheng@apple.com> | 2007-02-19 21:49:54 +0000 | 
|---|---|---|
| committer | Evan Cheng <evan.cheng@apple.com> | 2007-02-19 21:49:54 +0000 | 
| commit | b371f457b0ea4a652a9f526ba4375c80ae542252 (patch) | |
| tree | ec68e7096a3f2101af8713fb7cba5ac5cf354664 /lib/CodeGen/LiveVariables.cpp | |
| parent | d1b2c5b34df35e0f582be44e0d7d2240a0b80812 (diff) | |
Re-apply my liveintervalanalysis changes. Now with PR1207 fixes.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34428 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/LiveVariables.cpp')
| -rw-r--r-- | lib/CodeGen/LiveVariables.cpp | 36 | 
1 files changed, 8 insertions, 28 deletions
diff --git a/lib/CodeGen/LiveVariables.cpp b/lib/CodeGen/LiveVariables.cpp index c0da92c658..a976626b78 100644 --- a/lib/CodeGen/LiveVariables.cpp +++ b/lib/CodeGen/LiveVariables.cpp @@ -71,31 +71,11 @@ LiveVariables::VarInfo &LiveVariables::getVarInfo(unsigned RegIdx) {    return VirtRegInfo[RegIdx];  } -/// registerOverlap - Returns true if register 1 is equal to register 2 -/// or if register 1 is equal to any of alias of register 2. -static bool registerOverlap(unsigned Reg1, unsigned Reg2, -                             const MRegisterInfo *RegInfo) { -  bool isVirt1 = MRegisterInfo::isVirtualRegister(Reg1); -  bool isVirt2 = MRegisterInfo::isVirtualRegister(Reg2); -  if (isVirt1 != isVirt2) -    return false; -  if (Reg1 == Reg2) -    return true; -  else if (isVirt1) -    return false; -  for (const unsigned *AliasSet = RegInfo->getAliasSet(Reg2); -       unsigned Alias = *AliasSet; ++AliasSet) { -    if (Reg1 == Alias) -      return true; -  } -  return false; -} -  bool LiveVariables::KillsRegister(MachineInstr *MI, unsigned Reg) const {    for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {      MachineOperand &MO = MI->getOperand(i);      if (MO.isReg() && MO.isKill()) { -      if (registerOverlap(Reg, MO.getReg(), RegInfo)) +      if (RegInfo->regsOverlap(Reg, MO.getReg()))          return true;      }    } @@ -106,7 +86,7 @@ bool LiveVariables::RegisterDefIsDead(MachineInstr *MI, unsigned Reg) const {    for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {      MachineOperand &MO = MI->getOperand(i);      if (MO.isReg() && MO.isDead()) -      if (registerOverlap(Reg, MO.getReg(), RegInfo)) +      if (RegInfo->regsOverlap(Reg, MO.getReg()))          return true;    }    return false; @@ -116,7 +96,7 @@ bool LiveVariables::ModifiesRegister(MachineInstr *MI, unsigned Reg) const {    for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {      MachineOperand &MO = MI->getOperand(i);      if (MO.isReg() && MO.isDef()) { -      if (registerOverlap(Reg, MO.getReg(), RegInfo)) +      if (RegInfo->regsOverlap(Reg, MO.getReg()))          return true;      }    } @@ -240,7 +220,7 @@ bool LiveVariables::runOnMachineFunction(MachineFunction &MF) {    RegInfo = MF.getTarget().getRegisterInfo();    assert(RegInfo && "Target doesn't have register information?"); -  AllocatablePhysicalRegisters = RegInfo->getAllocatableSet(MF); +  ReservedRegisters = RegInfo->getReservedRegs(MF);    // PhysRegInfo - Keep track of which instruction was the last use of a    // physical register.  This is a purely local property, because all physical @@ -267,8 +247,8 @@ bool LiveVariables::runOnMachineFunction(MachineFunction &MF) {           E = df_ext_end(Entry, Visited); DFI != E; ++DFI) {      MachineBasicBlock *MBB = *DFI; -  // Mark live-in registers as live-in. -    for (MachineBasicBlock::livein_iterator II = MBB->livein_begin(), +    // Mark live-in registers as live-in. +    for (MachineBasicBlock::const_livein_iterator II = MBB->livein_begin(),             EE = MBB->livein_end(); II != EE; ++II) {        assert(MRegisterInfo::isPhysicalRegister(*II) &&               "Cannot have a live-in virtual register!"); @@ -295,7 +275,7 @@ bool LiveVariables::runOnMachineFunction(MachineFunction &MF) {            if (MRegisterInfo::isVirtualRegister(MO.getReg())){              HandleVirtRegUse(getVarInfo(MO.getReg()), MBB, MI);            } else if (MRegisterInfo::isPhysicalRegister(MO.getReg()) && -                     AllocatablePhysicalRegisters[MO.getReg()]) { +                     !ReservedRegisters[MO.getReg()]) {              HandlePhysRegUse(MO.getReg(), MI);            }          } @@ -313,7 +293,7 @@ bool LiveVariables::runOnMachineFunction(MachineFunction &MF) {              // Defaults to dead              VRInfo.Kills.push_back(MI);            } else if (MRegisterInfo::isPhysicalRegister(MO.getReg()) && -                     AllocatablePhysicalRegisters[MO.getReg()]) { +                     !ReservedRegisters[MO.getReg()]) {              HandlePhysRegDef(MO.getReg(), MI);            }          }  | 
