[llvm-commits] [llvm] r65120 - /llvm/trunk/lib/CodeGen/StackSlotColoring.cpp

Evan Cheng evan.cheng at apple.com
Sat Feb 21 13:14:29 PST 2009


Then it should not be part of stack coloring. :). Isn't there a DCE  
part already? Just run it twice with the second run only check for  
spills and restores.

Evan

On Feb 21, 2009, at 12:23 AM, Owen Anderson <resistor at mac.com> wrote:

> Why?  The scan is stupidly fast and can improve code quality in rare
> cases even when no color is done.
>
> --Owen
>
> On Feb 20, 2009, at 7:15 PM, Evan Cheng wrote:
>
>> It probably should only do DCE when any coloring was done, right?
>>
>> Evan
>>
>> On Feb 20, 2009, at 1:11 AM, Owen Anderson wrote:
>>
>>> Author: resistor
>>> Date: Fri Feb 20 03:11:36 2009
>>> New Revision: 65120
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=65120&view=rev
>>> Log:
>>> Add a quick pass to the stack slot colorer to eliminate some
>>> trivially redundant spills after coloring.
>>> Ideally these would never get created in the first place, but until
>>> we enhance the spiller to have a more
>>> global picture of what's happening, this is necessary for code
>>> quality in some circumstances.
>>>
>>> Modified:
>>>  llvm/trunk/lib/CodeGen/StackSlotColoring.cpp
>>>
>>> Modified: llvm/trunk/lib/CodeGen/StackSlotColoring.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/StackSlotColoring.cpp?rev=65120&r1=65119&r2=65120&view=diff
>>>
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> === 
>>> ==================================================================
>>> --- llvm/trunk/lib/CodeGen/StackSlotColoring.cpp (original)
>>> +++ llvm/trunk/lib/CodeGen/StackSlotColoring.cpp Fri Feb 20 03:11:36
>>> 2009
>>> @@ -19,6 +19,8 @@
>>> #include "llvm/Support/CommandLine.h"
>>> #include "llvm/Support/Compiler.h"
>>> #include "llvm/Support/Debug.h"
>>> +#include "llvm/Target/TargetInstrInfo.h"
>>> +#include "llvm/Target/TargetMachine.h"
>>> #include "llvm/ADT/BitVector.h"
>>> #include "llvm/ADT/SmallVector.h"
>>> #include "llvm/ADT/Statistic.h"
>>> @@ -30,12 +32,20 @@
>>>            cl::init(false), cl::Hidden,
>>>            cl::desc("Surpress slot sharing during stack coloring"));
>>>
>>> +static cl::opt<bool>
>>> +EnableDCE("enable-ssc-dce",
>>> +               cl::init(false), cl::Hidden,
>>> +               cl::desc("Enable slot coloring DCE"));
>>> +
>>> STATISTIC(NumEliminated,   "Number of stack slots eliminated due to
>>> coloring");
>>> +STATISTIC(NumDeadAccesses,
>>> +                          "Number of trivially dead stack accesses
>>> eliminated");
>>>
>>> namespace {
>>> class VISIBILITY_HIDDEN StackSlotColoring : public
>>> MachineFunctionPass {
>>>   LiveStacks* LS;
>>>   MachineFrameInfo *MFI;
>>> +    const TargetInstrInfo  *TII;
>>>
>>>   // SSIntervals - Spill slot intervals.
>>>   std::vector<LiveInterval*> SSIntervals;
>>> @@ -67,6 +77,7 @@
>>>
>>>   virtual void getAnalysisUsage(AnalysisUsage &AU) const {
>>>     AU.addRequired<LiveStacks>();
>>> +
>>>     AU.addPreservedID(MachineLoopInfoID);
>>>     AU.addPreservedID(MachineDominatorsID);
>>>     MachineFunctionPass::getAnalysisUsage(AU);
>>> @@ -82,6 +93,7 @@
>>>   bool OverlapWithAssignments(LiveInterval *li, int Color) const;
>>>   int ColorSlot(LiveInterval *li);
>>>   bool ColorSlots(MachineFunction &MF);
>>> +    bool removeDeadStores(MachineBasicBlock* MBB);
>>> };
>>> } // end anonymous namespace
>>>
>>> @@ -260,10 +272,55 @@
>>> return true;
>>> }
>>>
>>> +/// removeDeadStores - Scan through a basic block and look for
>>> loads followed
>>> +/// by stores.  If they're both using the same stack slot, then the
>>> store is
>>> +/// definitely dead.  This could obviously be much more aggressive
>>> (consider
>>> +/// pairs with instructions between them), but such extensions
>>> might have a
>>> +/// considerable compile time impact.
>>> +bool StackSlotColoring::removeDeadStores(MachineBasicBlock* MBB) {
>>> +  // FIXME: This could be much more aggressive, but we need to
>>> investigate
>>> +  // the compile time impact of doing so.
>>> +  bool changed = false;
>>> +
>>> +  SmallVector<MachineInstr*, 4> toErase;
>>> +
>>> +  for (MachineBasicBlock::iterator I = MBB->begin(), E = MBB- 
>>> >end();
>>> +       I != E; ++I) {
>>> +    MachineBasicBlock::iterator NextMI = next(I);
>>> +    if (NextMI == MBB->end()) continue;
>>> +
>>> +    int FirstSS, SecondSS;
>>> +    unsigned LoadReg = 0;
>>> +    unsigned StoreReg = 0;
>>> +    if (!(LoadReg = TII->isLoadFromStackSlot(I, FirstSS)))  
>>> continue;
>>> +    if (!(StoreReg = TII->isStoreToStackSlot(NextMI, SecondSS)))
>>> continue;
>>> +    if (FirstSS != SecondSS || LoadReg != StoreReg || FirstSS ==
>>> -1) continue;
>>> +
>>> +    ++NumDeadAccesses;
>>> +    changed = true;
>>> +
>>> +    if (NextMI->findRegisterUseOperandIdx(LoadReg, true, 0) !=  
>>> -1) {
>>> +      ++NumDeadAccesses;
>>> +      toErase.push_back(I);
>>> +    }
>>> +
>>> +    toErase.push_back(NextMI);
>>> +    ++I;
>>> +  }
>>> +
>>> +  for (SmallVector<MachineInstr*, 4>::iterator I = toErase.begin(),
>>> +       E = toErase.end(); I != E; ++I)
>>> +    (*I)->eraseFromParent();
>>> +
>>> +  return changed;
>>> +}
>>> +
>>> +
>>> bool StackSlotColoring::runOnMachineFunction(MachineFunction &MF) {
>>> DOUT << "********** Stack Slot Coloring **********\n";
>>>
>>> MFI = MF.getFrameInfo();
>>> +  TII = MF.getTarget().getInstrInfo();
>>> LS = &getAnalysis<LiveStacks>();
>>>
>>> bool Changed = false;
>>> @@ -280,5 +337,10 @@
>>>   Assignments[i].clear();
>>> Assignments.clear();
>>>
>>> +  if (EnableDCE) {
>>> +    for (MachineFunction::iterator I = MF.begin(), E = MF.end();  
>>> I !
>>> = E; ++I)
>>> +      Changed |= removeDeadStores(I);
>>> +  }
>>> +
>>> return Changed;
>>> }
>>>
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
> _______________________________________________
> 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