| Index: src/hydrogen.cc
|
| ===================================================================
|
| --- src/hydrogen.cc (revision 9206)
|
| +++ src/hydrogen.cc (working copy)
|
| @@ -1690,40 +1690,25 @@
|
| }
|
| }
|
|
|
| - // (3) Sum up the non-phi use counts of all connected phis. Don't include
|
| - // the non-phi uses of the phi itself.
|
| + // (3) Use the phi reachability information from step 2 to
|
| + // (a) sum up the non-phi use counts of all connected phis.
|
| + // (b) push information about values which can't be converted to integer
|
| + // without deoptimization through the phi use-def chains, avoiding
|
| + // unnecessary deoptimizations later.
|
| for (int i = 0; i < phi_count; ++i) {
|
| HPhi* phi = phi_list->at(i);
|
| + bool cti = phi->AllOperandsConvertibleToInteger();
|
| for (BitVector::Iterator it(connected_phis.at(i));
|
| !it.Done();
|
| it.Advance()) {
|
| int index = it.Current();
|
| - if (index != i) {
|
| - HPhi* it_use = phi_list->at(it.Current());
|
| - phi->AddNonPhiUsesFrom(it_use);
|
| - }
|
| + HPhi* it_use = phi_list->at(it.Current());
|
| + if (index != i) phi->AddNonPhiUsesFrom(it_use); // Don't count twice!
|
| + if (!cti) it_use->set_is_convertible_to_integer(false);
|
| }
|
| }
|
|
|
| - // (4) Compute phis that definitely can't be converted to integer
|
| - // without deoptimization and mark them to avoid unnecessary deoptimization.
|
| - change = true;
|
| - while (change) {
|
| - change = false;
|
| - for (int i = 0; i < phi_count; ++i) {
|
| - HPhi* phi = phi_list->at(i);
|
| - for (int j = 0; j < phi->OperandCount(); ++j) {
|
| - if (phi->IsConvertibleToInteger() &&
|
| - !phi->OperandAt(j)->IsConvertibleToInteger()) {
|
| - phi->set_is_convertible_to_integer(false);
|
| - change = true;
|
| - break;
|
| - }
|
| - }
|
| - }
|
| - }
|
| -
|
| -
|
| + // Initialize work list
|
| for (int i = 0; i < graph_->blocks()->length(); ++i) {
|
| HBasicBlock* block = graph_->blocks()->at(i);
|
| const ZoneList<HPhi*>* phis = block->phis();
|
| @@ -1738,6 +1723,7 @@
|
| }
|
| }
|
|
|
| + // Do a fixed point iteration, trying to improve representations
|
| while (!worklist_.is_empty()) {
|
| HValue* current = worklist_.RemoveLast();
|
| in_worklist_.Remove(current->id());
|
|
|