[llvm] r192623 - LiveRegUnits::removeRegsInMask safety.

Eric Christopher echristo at gmail.com
Mon Oct 14 15:51:42 PDT 2013


Can you give an example here? The best I could come up with was
something where you say you're clobbering all of a super register, but
then have a mask that says you're only clobbering part. That seems...
wonky or inefficient or just plain wrong - an example would go a long
way here.

-eric

On Mon, Oct 14, 2013 at 1:45 PM, Andrew Trick <atrick at apple.com> wrote:
> Author: atrick
> Date: Mon Oct 14 15:45:19 2013
> New Revision: 192623
>
> URL: http://llvm.org/viewvc/llvm-project?rev=192623&view=rev
> Log:
> LiveRegUnits::removeRegsInMask safety.
>
> Clobbering is exclusive not inclusive on register units.
> For liveness, we need to consider all the preserved registers.
> e.g. A regmask that clobbers YMM0 may preserve XMM0.
> Units are only clobbered when all super-registers are clobbered.
>
> Modified:
>     llvm/trunk/lib/CodeGen/LiveRegUnits.cpp
>
> Modified: llvm/trunk/lib/CodeGen/LiveRegUnits.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LiveRegUnits.cpp?rev=192623&r1=192622&r2=192623&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/LiveRegUnits.cpp (original)
> +++ llvm/trunk/lib/CodeGen/LiveRegUnits.cpp Mon Oct 14 15:45:19 2013
> @@ -17,21 +17,30 @@
>  #include "llvm/CodeGen/MachineInstrBundle.h"
>  using namespace llvm;
>
> +/// Return true if the given MachineOperand clobbers the given register unit.
> +/// A register unit is only clobbered if all its super-registers are clobbered.
> +static bool operClobbersUnit(const MachineOperand *MO, unsigned Unit,
> +                             const MCRegisterInfo *MCRI) {
> +  for (MCRegUnitRootIterator RI(Unit, MCRI); RI.isValid(); ++RI) {
> +    for (MCSuperRegIterator SI(*RI, MCRI, true); SI.isValid(); ++SI) {
> +      if (!MO->clobbersPhysReg(*SI))
> +        return false;
> +    }
> +  }
> +  return true;
> +}
> +
>  /// We assume the high bits of a physical super register are not preserved
>  /// unless the instruction has an implicit-use operand reading the
>  /// super-register or a register unit for the upper bits is available.
>  void LiveRegUnits::removeRegsInMask(const MachineOperand &Op,
>                                      const MCRegisterInfo &MCRI) {
> -  const uint32_t *Mask = Op.getRegMask();
> -  unsigned Bit = 0;
> -  for (unsigned R = 0; R < MCRI.getNumRegs(); ++R) {
> -    if ((*Mask & (1u << Bit)) == 0)
> -      removeReg(R, MCRI);
> -    ++Bit;
> -    if (Bit >= 32) {
> -      Bit = 0;
> -      ++Mask;
> -    }
> +  SparseSet<unsigned>::iterator LUI = LiveUnits.begin();
> +  while (LUI != LiveUnits.end()) {
> +    if (operClobbersUnit(&Op, *LUI, &MCRI))
> +      LUI = LiveUnits.erase(LUI);
> +    else
> +      ++LUI;
>    }
>  }
>
>
>
> _______________________________________________
> 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