[LLVMdev] df_ext_iterator in LiveIntervalAnalysis

Chris Lattner sabre at nondot.org
Fri Jun 22 10:55:46 PDT 2007


On Thu, 21 Jun 2007, Fernando Magno Quintao Pereira wrote:
> I would like to make a suggestion. In the LiveIntervalAnalysis class,
> instead of numbering the instructions in the order in which basic blocks
> are stored in the machine function, use the df_ext_iterator. It will order
> the instruction according to the dominance tree (or it seems to be doing
> so). There are many advantages in doing this. One of them is that, once
> you traverse the dominance tree to find the live intervals, they will be
> contiguous, you don't have to handle holes. Could someone tell me if there
> is any problem in doing this? In my version of LLVM, I just
> had to make two changes in LiveIntervalAnalysis:

That should work fine.  Please do it, then do some 
compile-time/code-quality comparisons to see if it's better :)

good numbers + code = patch committed to cvs :)

Thanks, nice idea btw!

-Chris

> //===---------------------------------------
> First: when numbering the instructions:
> // <-- new code
> //===---------------------------------------
>   unsigned miIndex = 0;
>   MachineBasicBlock *entry = mf_->begin();
>   std::set<MachineBasicBlock*> visited;
>   for (df_ext_iterator<MachineBasicBlock*> dfi = df_ext_begin(entry,
> visited),
>                       endi = df_ext_end(entry, visited); dfi != endi;
> ++dfi) {
>       MachineBasicBlock *mbb = *dfi;
>       for (MachineBasicBlock::iterator mi = mbb->begin(), miEnd =
> mbb->end();
>                                                           mi != miEnd;
> ++mi) {
>         bool inserted = mi2iMap_.insert(std::make_pair(mi,
> miIndex)).second;
>         assert(inserted && "multiple MachineInstr -> index mappings");
>         i2miMap_.push_back(mi);
>         miIndex += InstrSlots::NUM;
>       }
>   }
>   this->maxInstrIndex_ = miIndex;
> //===---------------------------------------
> // --> old code
> //===---------------------------------------
>   unsigned miIndex = 0;
>   for (MachineFunction::iterator mbb = mf_->begin(), mbbEnd = mf_->end();
>        mbb != mbbEnd; ++mbb) {
>     for (MachineBasicBlock::iterator mi = mbb->begin(), miEnd =
> mbb->end();
>          mi != miEnd; ++mi) {
>       bool inserted = mi2iMap_.insert(std::make_pair(mi, miIndex)).second;
>       assert(inserted && "multiple MachineInstr -> index mappings");
>       i2miMap_.push_back(mi);
>       miIndex += InstrSlots::NUM;
>     }
>   }
>   this->maxInstrIndex_ = miIndex;
>
> //===---------------------------------------
> Second: when computing the intervals:
> // <-- new code
> //===---------------------------------------
>   MachineBasicBlock *entry = mf_->begin();
>   std::set<MachineBasicBlock*> visited;
>   for (df_ext_iterator<MachineBasicBlock*> dfi = df_ext_begin(entry,
> visited),
>                          end = df_ext_end(entry, visited); dfi != end;
> ++dfi) {
>       MachineBasicBlock *mbb = *dfi;
> //===---------------------------------------
> // --> old code
> //===---------------------------------------
> //  for (MachineFunction::iterator I = mf_->begin(), E = mf_->end();
> //       I != E; ++I) {
> //    MachineBasicBlock* mbb = I;
>
> Fernando
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>

-Chris

-- 
http://nondot.org/sabre/
http://llvm.org/



More information about the llvm-dev mailing list