| Index: runtime/vm/flow_graph.cc
|
| diff --git a/runtime/vm/flow_graph.cc b/runtime/vm/flow_graph.cc
|
| index 599fce04311de948c0aa5ab34877a8cc61bdb6b5..8c69bc743a0631118836b20db6276a9ca49ceae6 100644
|
| --- a/runtime/vm/flow_graph.cc
|
| +++ b/runtime/vm/flow_graph.cc
|
| @@ -372,40 +372,57 @@ static void VerifyUseListsInInstruction(Instruction* instr) {
|
| }
|
| }
|
|
|
| -
|
| -void FlowGraph::ComputeIsReceiverRecursive(PhiInstr* phi,
|
| - BitVector* processed) const {
|
| +void FlowGraph::ComputeIsReceiverRecursive(
|
| + PhiInstr* phi, GrowableArray<PhiInstr*>* unmark) const {
|
| if (phi->is_receiver() != PhiInstr::kUnknownReceiver) return;
|
| - if (processed->Contains(phi->ssa_temp_index())) return;
|
| - processed->Add(phi->ssa_temp_index());
|
| + phi->set_is_receiver(PhiInstr::kReceiver);
|
| for (intptr_t i = 0; i < phi->InputCount(); ++i) {
|
| Definition* def = phi->InputAt(i)->definition();
|
| if (def->IsParameter() && (def->AsParameter()->index() == 0)) continue;
|
| if (!def->IsPhi()) {
|
| phi->set_is_receiver(PhiInstr::kNotReceiver);
|
| - return;
|
| + break;
|
| }
|
| - ComputeIsReceiverRecursive(def->AsPhi(), processed);
|
| + ComputeIsReceiverRecursive(def->AsPhi(), unmark);
|
| if (def->AsPhi()->is_receiver() == PhiInstr::kNotReceiver) {
|
| phi->set_is_receiver(PhiInstr::kNotReceiver);
|
| - return;
|
| + break;
|
| + }
|
| + }
|
| +
|
| + if (phi->is_receiver() == PhiInstr::kNotReceiver) {
|
| + unmark->Add(phi);
|
| + }
|
| +}
|
| +
|
| +
|
| +void FlowGraph::ComputeIsReceiver(PhiInstr* phi) const {
|
| + GrowableArray<PhiInstr*> unmark;
|
| + ComputeIsReceiverRecursive(phi, &unmark);
|
| +
|
| + // Now drain unmark.
|
| + while (!unmark.is_empty()) {
|
| + PhiInstr* phi = unmark.RemoveLast();
|
| + for (Value::Iterator it(phi->input_use_list()); !it.Done(); it.Advance()) {
|
| + PhiInstr* use = it.Current()->instruction()->AsPhi();
|
| + if ((use != NULL) && (use->is_receiver() == PhiInstr::kReceiver)) {
|
| + use->set_is_receiver(PhiInstr::kNotReceiver);
|
| + unmark.Add(use);
|
| + }
|
| }
|
| }
|
| - phi->set_is_receiver(PhiInstr::kReceiver);
|
| }
|
|
|
|
|
| bool FlowGraph::IsReceiver(Definition* def) const {
|
| if (def->IsParameter()) return (def->AsParameter()->index() == 0);
|
| - if (!def->IsPhi()) return false;
|
| + if (!def->IsPhi() || graph_entry()->catch_entries().is_empty()) return false;
|
| PhiInstr* phi = def->AsPhi();
|
| if (phi->is_receiver() != PhiInstr::kUnknownReceiver) {
|
| return (phi->is_receiver() == PhiInstr::kReceiver);
|
| }
|
| // Not known if this phi is the receiver yet. Compute it now.
|
| - BitVector* processed =
|
| - new(zone()) BitVector(zone(), max_virtual_register_number());
|
| - ComputeIsReceiverRecursive(phi, processed);
|
| + ComputeIsReceiver(phi);
|
| return (phi->is_receiver() == PhiInstr::kReceiver);
|
| }
|
|
|
|
|