bool run()
 {
     ASSERT(m_graph.m_form == ThreadedCPS);
     ASSERT(m_graph.m_unificationState == LocallyUnified);
     
     // Ensure that all Phi functions are unified.
     for (BlockIndex blockIndex = m_graph.m_blocks.size(); blockIndex--;) {
         BasicBlock* block = m_graph.m_blocks[blockIndex].get();
         if (!block)
             continue;
         ASSERT(block->isReachable);
         
         for (unsigned phiIndex = block->phis.size(); phiIndex--;) {
             Node* phi = block->phis[phiIndex];
             for (unsigned childIdx = 0; childIdx < AdjacencyList::Size; ++childIdx) {
                 if (!phi->children.child(childIdx))
                     break;
                 
                 phi->variableAccessData()->unify(
                     phi->children.child(childIdx)->variableAccessData());
             }
         }
     }
     
     // Ensure that all predictions are fixed up based on the unification.
     for (unsigned i = 0; i < m_graph.m_variableAccessData.size(); ++i) {
         VariableAccessData* data = &m_graph.m_variableAccessData[i];
         data->find()->predict(data->nonUnifiedPrediction());
         data->find()->mergeIsCaptured(data->isCaptured());
         data->find()->mergeStructureCheckHoistingFailed(data->structureCheckHoistingFailed());
         data->find()->mergeShouldNeverUnbox(data->shouldNeverUnbox());
         data->find()->mergeIsLoadedFrom(data->isLoadedFrom());
     }
     
     m_graph.m_unificationState = GloballyUnified;
     return true;
 }