[llvm-commits] [llvm] r62821 - /llvm/trunk/lib/CodeGen/PreAllocSplitting.cpp

Evan Cheng evan.cheng at apple.com
Thu Jan 22 16:41:31 PST 2009


Hi Owen,

Do you need a post pass for this? Couldn't it be done iteratively  
during splitting?

Evan

On Jan 22, 2009, at 4:23 PM, Owen Anderson wrote:

> Author: resistor
> Date: Thu Jan 22 18:23:32 2009
> New Revision: 62821
>
> URL: http://llvm.org/viewvc/llvm-project?rev=62821&view=rev
> Log:
> Add an initial pass at dead spill/restore removal for pre alloc  
> splitting.
>
> Modified:
>    llvm/trunk/lib/CodeGen/PreAllocSplitting.cpp
>
> Modified: llvm/trunk/lib/CodeGen/PreAllocSplitting.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/PreAllocSplitting.cpp?rev=62821&r1=62820&r2=62821&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/CodeGen/PreAllocSplitting.cpp (original)
> +++ llvm/trunk/lib/CodeGen/PreAllocSplitting.cpp Thu Jan 22 18:23:32  
> 2009
> @@ -42,6 +42,7 @@
> STATISTIC(NumRemats, "Number of intervals split by  
> rematerialization");
> STATISTIC(NumFolds, "Number of intervals split with spill folding");
> STATISTIC(NumRenumbers, "Number of intervals renumbered into new  
> registers");
> +STATISTIC(NumDeadSpills, "Number of dead spills removed");
>
> namespace {
>   class VISIBILITY_HIDDEN PreAllocSplitting : public  
> MachineFunctionPass {
> @@ -152,7 +153,8 @@
>
>     bool SplitRegLiveInterval(LiveInterval*);
>
> -    bool SplitRegLiveIntervals(const TargetRegisterClass **);
> +    bool SplitRegLiveIntervals(const TargetRegisterClass **,
> +                               SmallPtrSet<LiveInterval*, 8>&);
>
>     void RepairLiveInterval(LiveInterval* CurrLI, VNInfo* ValNo,
>                             MachineInstr* DefMI, unsigned RestoreIdx);
> @@ -172,6 +174,7 @@
>                             SmallPtrSet<MachineInstr*, 4>& RefsInMBB);
>     void RenumberValno(VNInfo* VN);
>     void ReconstructLiveInterval(LiveInterval* LI);
> +    bool removeDeadSpills(SmallPtrSet<LiveInterval*, 8>& split);
>     VNInfo* PerformPHIConstruction(MachineBasicBlock::iterator use,
>                                    MachineBasicBlock* MBB,
>                                    LiveInterval* LI,
> @@ -1340,7 +1343,8 @@
> /// SplitRegLiveIntervals - Split all register live intervals that  
> cross the
> /// barrier that's being processed.
> bool
> -PreAllocSplitting::SplitRegLiveIntervals(const TargetRegisterClass  
> **RCs) {
> +PreAllocSplitting::SplitRegLiveIntervals(const TargetRegisterClass  
> **RCs,
> +                                         SmallPtrSet<LiveInterval*,  
> 8>& Split) {
>   // First find all the virtual registers whose live intervals are  
> intercepted
>   // by the current barrier.
>   SmallVector<LiveInterval*, 8> Intervals;
> @@ -1369,12 +1373,56 @@
>       Change |= Change;
>     LiveInterval *LI = Intervals.back();
>     Intervals.pop_back();
> -    Change |= SplitRegLiveInterval(LI);
> +    bool result = SplitRegLiveInterval(LI);
> +    if (result) Split.insert(LI);
> +    Change |= result;
>   }
>
>   return Change;
> }
>
> +/// removeDeadSpills - After doing splitting, filter through all  
> intervals we've
> +/// split, and see if any of the spills are unnecessary.  If so,  
> remove them.
> +bool PreAllocSplitting::removeDeadSpills(SmallPtrSet<LiveInterval*,  
> 8>& split) {
> +  bool changed = false;
> +
> +  for (SmallPtrSet<LiveInterval*, 8>::iterator LI = split.begin(),
> +       LE = split.end(); LI != LE; ++LI) {
> +    DenseMap<VNInfo*, unsigned > VNUseCount;
> +
> +    for (MachineRegisterInfo::use_iterator UI = MRI- 
> >use_begin((*LI)->reg),
> +         UE = MRI->use_end(); UI != UE; ++UI) {
> +      unsigned index = LIs->getInstructionIndex(&*UI);
> +      index = LiveIntervals::getUseIndex(index);
> +
> +      const LiveRange* LR = (*LI)->getLiveRangeContaining(index);
> +      VNUseCount[LR->valno]++;
> +    }
> +
> +    for (LiveInterval::vni_iterator VI = (*LI)->vni_begin(),
> +         VE = (*LI)->vni_end(); VI != VE; ++VI) {
> +      VNInfo* CurrVN = *VI;
> +      if (CurrVN->hasPHIKill) continue;
> +      if (VNUseCount[CurrVN] > 0) continue;
> +
> +      unsigned DefIdx = CurrVN->def;
> +      if (DefIdx == ~0U || DefIdx == ~1U) continue;
> +
> +      MachineInstr* DefMI = LIs->getInstructionFromIndex(DefIdx);
> +      int FrameIndex;
> +      if (!TII->isLoadFromStackSlot(DefMI, FrameIndex)) continue;
> +
> +      LIs->RemoveMachineInstrFromMaps(DefMI);
> +      (*LI)->removeValNo(CurrVN);
> +      DefMI->eraseFromParent();
> +      NumDeadSpills++;
> +      changed = true;
> +    }
> +  }
> +
> +  return changed;
> +}
> +
> bool PreAllocSplitting::createsNewJoin(LiveRange* LR,
>                                        MachineBasicBlock* DefMBB,
>                                        MachineBasicBlock*  
> BarrierMBB) {
> @@ -1457,6 +1505,8 @@
>   MachineBasicBlock *Entry = MF.begin();
>   SmallPtrSet<MachineBasicBlock*,16> Visited;
>
> +  SmallPtrSet<LiveInterval*, 8> Split;
> +
>   for (df_ext_iterator<MachineBasicBlock*,  
> SmallPtrSet<MachineBasicBlock*,16> >
>          DFI = df_ext_begin(Entry, Visited), E = df_ext_end(Entry,  
> Visited);
>        DFI != E; ++DFI) {
> @@ -1469,9 +1519,11 @@
>       if (!BarrierRCs)
>         continue;
>       BarrierIdx = LIs->getInstructionIndex(Barrier);
> -      MadeChange |= SplitRegLiveIntervals(BarrierRCs);
> +      MadeChange |= SplitRegLiveIntervals(BarrierRCs, Split);
>     }
>   }
>
> +  MadeChange |= removeDeadSpills(Split);
> +
>   return MadeChange;
> }
>
>
> _______________________________________________
> 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