[llvm-commits] [llvm] r89530 - in /llvm/trunk: include/llvm/CodeGen/LiveVariables.h lib/CodeGen/LiveVariables.cpp lib/CodeGen/PHIElimination.cpp lib/CodeGen/PHIElimination.h

Evan Cheng evan.cheng at apple.com
Fri Nov 20 19:00:19 PST 2009


Does this fix the cfrac failure?

Evan

On Nov 20, 2009, at 6:05 PM, Jakob Stoklund Olesen wrote:

> Author: stoklund
> Date: Fri Nov 20 20:05:21 2009
> New Revision: 89530
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=89530&view=rev
> Log:
> Be more clever about calculating live variables through new basic blocks.
> 
> When splitting a critical edge, the registers live through the edge are:
> 
> - Used in a PHI instruction, or
> - Live out from the predecessor, and
> - Live in to the successor.
> 
> This allows the coalescer to eliminate even more phi joins.
> 
> Modified:
>    llvm/trunk/include/llvm/CodeGen/LiveVariables.h
>    llvm/trunk/lib/CodeGen/LiveVariables.cpp
>    llvm/trunk/lib/CodeGen/PHIElimination.cpp
>    llvm/trunk/lib/CodeGen/PHIElimination.h
> 
> Modified: llvm/trunk/include/llvm/CodeGen/LiveVariables.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/LiveVariables.h?rev=89530&r1=89529&r2=89530&view=diff
> 
> ==============================================================================
> --- llvm/trunk/include/llvm/CodeGen/LiveVariables.h (original)
> +++ llvm/trunk/include/llvm/CodeGen/LiveVariables.h Fri Nov 20 20:05:21 2009
> @@ -107,6 +107,13 @@
>     /// findKill - Find a kill instruction in MBB. Return NULL if none is found.
>     MachineInstr *findKill(const MachineBasicBlock *MBB) const;
> 
> +    /// isLiveIn - Is Reg live in to MBB? This means that Reg is live through
> +    /// MBB, or it is killed in MBB. If Reg is only used by PHI instructions in
> +    /// MBB, it is not considered live in.
> +    bool isLiveIn(const MachineBasicBlock &MBB,
> +                  unsigned Reg,
> +                  MachineRegisterInfo &MRI);
> +
>     void dump() const;
>   };
> 
> @@ -267,11 +274,17 @@
>   void HandleVirtRegUse(unsigned reg, MachineBasicBlock *MBB,
>                         MachineInstr *MI);
> 
> -  /// addNewBlock - Add a new basic block BB as an empty succcessor to
> -  /// DomBB. All variables that are live out of DomBB will be marked as passing
> -  /// live through BB. This method assumes that the machine code is still in SSA
> -  /// form.
> -  void addNewBlock(MachineBasicBlock *BB, MachineBasicBlock *DomBB);
> +  bool isLiveIn(unsigned Reg, const MachineBasicBlock &MBB) {
> +    return getVarInfo(Reg).isLiveIn(MBB, Reg, *MRI);
> +  }
> +
> +  /// addNewBlock - Add a new basic block BB between DomBB and SuccBB. All
> +  /// variables that are live out of DomBB and live into SuccBB will be marked
> +  /// as passing live through BB. This method assumes that the machine code is
> +  /// still in SSA form.
> +  void addNewBlock(MachineBasicBlock *BB,
> +                   MachineBasicBlock *DomBB,
> +                   MachineBasicBlock *SuccBB);
> };
> 
> } // End llvm namespace
> 
> Modified: llvm/trunk/lib/CodeGen/LiveVariables.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LiveVariables.cpp?rev=89530&r1=89529&r2=89530&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/LiveVariables.cpp (original)
> +++ llvm/trunk/lib/CodeGen/LiveVariables.cpp Fri Nov 20 20:05:21 2009
> @@ -656,35 +656,45 @@
>           .push_back(BBI->getOperand(i).getReg());
> }
> 
> +bool LiveVariables::VarInfo::isLiveIn(const MachineBasicBlock &MBB,
> +                                      unsigned Reg,
> +                                      MachineRegisterInfo &MRI) {
> +  unsigned Num = MBB.getNumber();
> +
> +  // Reg is live-through.
> +  if (AliveBlocks.test(Num))
> +    return true;
> +
> +  // Registers defined in MBB cannot be live in.
> +  const MachineInstr *Def = MRI.getVRegDef(Reg);
> +  if (Def && Def->getParent() == &MBB)
> +    return false;
> +
> + // Reg was not defined in MBB, was it killed here?
> +  return findKill(&MBB);
> +}
> +
> /// addNewBlock - Add a new basic block BB as an empty succcessor to DomBB. All
> /// variables that are live out of DomBB will be marked as passing live through
> /// BB.
> void LiveVariables::addNewBlock(MachineBasicBlock *BB,
> -                                MachineBasicBlock *DomBB) {
> +                                MachineBasicBlock *DomBB,
> +                                MachineBasicBlock *SuccBB) {
>   const unsigned NumNew = BB->getNumber();
> -  const unsigned NumDom = DomBB->getNumber();
> +
> +  // All registers used by PHI nodes in SuccBB must be live through BB.
> +  for (MachineBasicBlock::const_iterator BBI = SuccBB->begin(),
> +         BBE = SuccBB->end();
> +       BBI != BBE && BBI->getOpcode() == TargetInstrInfo::PHI; ++BBI)
> +    for (unsigned i = 1, e = BBI->getNumOperands(); i != e; i += 2)
> +      if (BBI->getOperand(i+1).getMBB() == BB)
> +        getVarInfo(BBI->getOperand(i).getReg()).AliveBlocks.set(NumNew);
> 
>   // Update info for all live variables
>   for (unsigned Reg = TargetRegisterInfo::FirstVirtualRegister,
>          E = MRI->getLastVirtReg()+1; Reg != E; ++Reg) {
>     VarInfo &VI = getVarInfo(Reg);
> -
> -    // Anything live through DomBB is also live through BB.
> -    if (VI.AliveBlocks.test(NumDom)) {
> +    if (!VI.AliveBlocks.test(NumNew) && VI.isLiveIn(*SuccBB, Reg, *MRI))
>       VI.AliveBlocks.set(NumNew);
> -      continue;
> -    }
> -
> -    // Variables not defined in DomBB cannot be live out.
> -    const MachineInstr *Def = MRI->getVRegDef(Reg);
> -    if (!Def || Def->getParent() != DomBB)
> -      continue;
> -
> -    // Killed by DomBB?
> -    if (VI.findKill(DomBB))
> -      continue;
> -
> -    // This register is defined in DomBB and live out
> -    VI.AliveBlocks.set(NumNew);
>   }
> }
> 
> Modified: llvm/trunk/lib/CodeGen/PHIElimination.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/PHIElimination.cpp?rev=89530&r1=89529&r2=89530&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/PHIElimination.cpp (original)
> +++ llvm/trunk/lib/CodeGen/PHIElimination.cpp Fri Nov 20 20:05:21 2009
> @@ -353,7 +353,7 @@
>       // We break edges when registers are live out from the predecessor block
>       // (not considering PHI nodes). If the register is live in to this block
>       // anyway, we would gain nothing from splitting.
> -      if (isLiveOut(Reg, *PreMBB, LV) && !isLiveIn(Reg, MBB, LV))
> +      if (!LV.isLiveIn(Reg, MBB) && isLiveOut(Reg, *PreMBB, LV))
>         SplitCriticalEdge(PreMBB, &MBB);
>     }
>   }
> @@ -406,22 +406,6 @@
>   return false;
> }
> 
> -bool llvm::PHIElimination::isLiveIn(unsigned Reg, const MachineBasicBlock &MBB,
> -                                    LiveVariables &LV) {
> -  LiveVariables::VarInfo &VI = LV.getVarInfo(Reg);
> -
> -  if (VI.AliveBlocks.test(MBB.getNumber()))
> -    return true;
> -
> -  // defined in MBB?
> -  const MachineInstr *Def = MRI->getVRegDef(Reg);
> -  if (Def && Def->getParent() == &MBB)
> -    return false;
> -
> -  // killed in MBB?
> -  return VI.findKill(&MBB);
> -}
> -
> MachineBasicBlock *PHIElimination::SplitCriticalEdge(MachineBasicBlock *A,
>                                                      MachineBasicBlock *B) {
>   assert(A && B && "Missing MBB end point");
> @@ -463,7 +447,7 @@
>         i->getOperand(ni+1).setMBB(NMBB);
> 
>   if (LiveVariables *LV=getAnalysisIfAvailable<LiveVariables>())
> -    LV->addNewBlock(NMBB, A);
> +    LV->addNewBlock(NMBB, A, B);
> 
>   if (MachineDominatorTree *MDT=getAnalysisIfAvailable<MachineDominatorTree>())
>     MDT->addNewBlock(NMBB, A);
> 
> Modified: llvm/trunk/lib/CodeGen/PHIElimination.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/PHIElimination.h?rev=89530&r1=89529&r2=89530&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/PHIElimination.h (original)
> +++ llvm/trunk/lib/CodeGen/PHIElimination.h Fri Nov 20 20:05:21 2009
> @@ -99,12 +99,6 @@
>     bool isLiveOut(unsigned Reg, const MachineBasicBlock &MBB,
>                    LiveVariables &LV);
> 
> -    /// isLiveIn - Determine if Reg is live in to MBB, not considering PHI
> -    /// source registers. This means that Reg is either killed by MBB or passes
> -    /// through it.
> -    bool isLiveIn(unsigned Reg, const MachineBasicBlock &MBB,
> -                  LiveVariables &LV);
> -
>     /// SplitCriticalEdge - Split a critical edge from A to B by
>     /// inserting a new MBB. Update branches in A and PHI instructions
>     /// in B. Return the new block.
> 
> 
> _______________________________________________
> 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