[LLVMdev] df_ext_iterator in LiveIntervalAnalysis
Evan Cheng
evan.cheng at apple.com
Fri Jun 22 12:55:33 PDT 2007
Nice idea. Please also try using SmallPtrSet (with a sufficiently
large size) instead of std::set for traversal after everything is
working. Using std::set can really hurt compile time in case of large
basic block numbers.
Is there a way to dynamically adjust "SmallSize" based on number of
basic blocks in the function?
Evan
On Jun 21, 2007, at 10:20 PM, 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:
>
> //===---------------------------------------
> 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
More information about the llvm-dev
mailing list