Re-use phi reachability information to avoid a fixed-point computation.

When we propagate the information that a value is not convertible to integer,
there is no need for a separate fixed-point computation, we can do things the
"Millikin way" (tm), folding as much computation as possible into a single pass:
;-) We already have the phi node reachability information, so we can easily
propagate this while doing the representation histogram computation.
Review URL: http://codereview.chromium.org/7754010

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@9212 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 37e39ce3
......@@ -2209,6 +2209,13 @@ class HPhi: public HValue {
is_convertible_to_integer_ = b;
}
bool AllOperandsConvertibleToInteger() {
for (int i = 0; i < OperandCount(); ++i) {
if (!OperandAt(i)->IsConvertibleToInteger()) return false;
}
return true;
}
protected:
virtual void DeleteFromGraph();
virtual void InternalSetOperandAt(int index, HValue* value) {
......
......@@ -1701,40 +1701,25 @@ void HInferRepresentation::Analyze() {
}
}
// (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);
}
}
}
// (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;
}
}
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);
}
}
// Initialize work list
for (int i = 0; i < graph_->blocks()->length(); ++i) {
HBasicBlock* block = graph_->blocks()->at(i);
const ZoneList<HPhi*>* phis = block->phis();
......@@ -1749,6 +1734,7 @@ void HInferRepresentation::Analyze() {
}
}
// Do a fixed point iteration, trying to improve representations
while (!worklist_.is_empty()) {
HValue* current = worklist_.RemoveLast();
in_worklist_.Remove(current->id());
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment