[llvm-commits] [llvm] r48003 - in /llvm/trunk: include/llvm/CodeGen/RegisterScavenging.h lib/CodeGen/RegisterScavenging.cpp
Evan Cheng
evan.cheng at apple.com
Fri Mar 7 14:32:20 PST 2008
On Mar 6, 2008, at 3:22 PM, Bill Wendling wrote:
> Author: void
> Date: Thu Mar 6 17:22:43 2008
> New Revision: 48003
>
> URL: http://llvm.org/viewvc/llvm-project?rev=48003&view=rev
> Log:
> When setting the "unused" info, take into account something like this:
>
> %r3<def> = OR %x3<kill>, %x3
>
> We don't want to mark the %r3 as unused even though it's a sub-
> register of %x3.
>
> Modified:
> llvm/trunk/include/llvm/CodeGen/RegisterScavenging.h
> llvm/trunk/lib/CodeGen/RegisterScavenging.cpp
>
> Modified: llvm/trunk/include/llvm/CodeGen/RegisterScavenging.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/RegisterScavenging.h?rev=48003&r1=48002&r2=48003&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/include/llvm/CodeGen/RegisterScavenging.h (original)
> +++ llvm/trunk/include/llvm/CodeGen/RegisterScavenging.h Thu Mar 6
> 17:22:43 2008
> @@ -98,7 +98,7 @@
> ///
> void setUsed(unsigned Reg);
> void setUsed(BitVector Regs) { RegsAvailable &= ~Regs; }
> - void setUnused(unsigned Reg);
> + void setUnused(unsigned Reg, const MachineInstr *MI);
> void setUnused(BitVector Regs) { RegsAvailable |= Regs; }
>
> /// FindUnusedReg - Find a unused register of the specified
> register class
>
> Modified: llvm/trunk/lib/CodeGen/RegisterScavenging.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/RegisterScavenging.cpp?rev=48003&r1=48002&r2=48003&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/lib/CodeGen/RegisterScavenging.cpp (original)
> +++ llvm/trunk/lib/CodeGen/RegisterScavenging.cpp Thu Mar 6
> 17:22:43 2008
> @@ -8,9 +8,9 @@
> //
> =
> =
> =
> ----------------------------------------------------------------------=
> ==//
> //
> // This file implements the machine register scavenger. It can provide
> -// information such as unused register at any point in a machine
> basic block.
> -// It also provides a mechanism to make registers availbale by
> evicting them
> -// to spill slots.
> +// information, such as unused registers, at any point in a machine
> basic block.
> +// It also provides a mechanism to make registers available by
> evicting them to
> +// spill slots.
> //
> //
> =
> =
> =
> ----------------------------------------------------------------------=
> ==//
>
> @@ -25,6 +25,28 @@
> #include "llvm/ADT/STLExtras.h"
> using namespace llvm;
>
> +/// RedefinesSuperRegPart - Return true if the specified register
> is redefining
> +/// part of a super-register.
> +static bool RedefinesSuperRegPart(const MachineInstr *MI, unsigned
> SubReg,
> + const TargetRegisterInfo *TRI) {
> + for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
> + const MachineOperand &MO = MI->getOperand(i);
> + if (!MO.isRegister() || !MO.isUse())
> + continue;
> + if (TRI->isSuperRegister(SubReg, MO.getReg()))
> + return true;
> + }
> +
> + return false;
> +}
> +
> +static bool RedefinesSuperRegPart(const MachineInstr *MI,
> + const MachineOperand &MO,
> + const TargetRegisterInfo *TRI) {
> + assert(MO.isRegister() && MO.isDef() && "Not a register def!");
> + return RedefinesSuperRegPart(MI, MO.getReg(), TRI);
> +}
> +
> /// setUsed - Set the register and its sub-registers as being used.
> void RegScavenger::setUsed(unsigned Reg) {
> RegsAvailable.reset(Reg);
> @@ -35,12 +57,13 @@
> }
>
> /// setUnused - Set the register and its sub-registers as being
> unused.
> -void RegScavenger::setUnused(unsigned Reg) {
> +void RegScavenger::setUnused(unsigned Reg, const MachineInstr *MI) {
> RegsAvailable.set(Reg);
>
> for (const unsigned *SubRegs = TRI->getSubRegisters(Reg);
> unsigned SubReg = *SubRegs; ++SubRegs)
> - RegsAvailable.set(SubReg);
> + if (!RedefinesSuperRegPart(MI, Reg, TRI))
> + RegsAvailable.set(SubReg);
> }
>
> void RegScavenger::enterBasicBlock(MachineBasicBlock *mbb) {
> @@ -138,9 +161,12 @@
> if (MO.isKill() && !isReserved(Reg)) {
> ChangedRegs.set(Reg);
>
> + // Mark sub-registers as changed if they aren't defined in
> the same
> + // instruction.
> for (const unsigned *SubRegs = TRI->getSubRegisters(Reg);
> unsigned SubReg = *SubRegs; ++SubRegs)
> - ChangedRegs.set(SubReg);
> + if (!RedefinesSuperRegPart(MI, Reg, TRI))
Why is this necessary? Something that kills a super-register also
kills the sub-register.
>
> + ChangedRegs.set(SubReg);
> }
> }
>
> @@ -159,7 +185,7 @@
>
> // If it's dead upon def, then it is now free.
> if (MO.isDead()) {
> - setUnused(Reg);
> + setUnused(Reg, MI);
> continue;
> }
>
> @@ -169,6 +195,10 @@
> continue;
> }
>
> + // Skip is this is merely redefining part of a super-register.
> + if (RedefinesSuperRegPart(MI, MO, TRI))
> + continue;
> +
> assert((isUnused(Reg) || isReserved(Reg)) &&
> "Re-defining a live register!");
> setUsed(Reg);
> @@ -194,7 +224,7 @@
> unsigned Reg = MO.getReg();
> assert(isUsed(Reg));
> if (!isReserved(Reg))
> - setUnused(Reg);
> + setUnused(Reg, MI);
What about the sub-registers?
Evan
>
> }
>
> // Process uses.
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list