// Scan all instructions inside the loop. If any instruction has a use of a // definition that is defined outside its containing loop, then stack space // for that definition must be reserved ahead of time. Otherwise, we could // re-use storage that has been temporarily allocated - see bug 694481. bool GreedyAllocator::findLoopCarriedUses(LBlock *backedge) { Vector<LBlock *, 4, SystemAllocPolicy> worklist; MBasicBlock *mheader = backedge->mir()->loopHeaderOfBackedge(); uint32 upperBound = backedge->lastId(); uint32 lowerBound = mheader->lir()->firstId(); IonSpew(IonSpew_RegAlloc, " Finding loop-carried uses."); for (size_t i = 0; i < mheader->numContainedInLoop(); i++) { LBlock *block = mheader->getContainedInLoop(i)->lir(); for (LInstructionIterator i = block->begin(); i != block->end(); i++) findLoopCarriedUses(*i, lowerBound, upperBound); for (size_t i = 0; i < block->numPhis(); i++) findLoopCarriedUses(block->getPhi(i), lowerBound, upperBound); } IonSpew(IonSpew_RegAlloc, " Done finding loop-carried uses."); return true; }