// Test whether there are any phis in |header| which are newly optimizable, as a // result of optimizations done inside the loop. This is not a sparse approach, // but restarting is rare enough in practice. Termination is ensured by // discarding the phi triggering the iteration. bool ValueNumberer::loopHasOptimizablePhi(MBasicBlock* header) const { // If the header is unreachable, don't bother re-optimizing it. if (header->isMarked()) return false; // Rescan the phis for any that can be simplified, since they may be reading // values from backedges. for (MPhiIterator iter(header->phisBegin()), end(header->phisEnd()); iter != end; ++iter) { MPhi* phi = *iter; MOZ_ASSERT(phi->hasUses(), "Missed an unused phi"); if (phi->operandIfRedundant() || hasLeader(phi, header)) return true; // Phi can be simplified. } return false; }