Index: src/hydrogen.cc |
=================================================================== |
--- src/hydrogen.cc (revision 14384) |
+++ src/hydrogen.cc (working copy) |
@@ -3717,40 +3717,54 @@ |
// int32-phis allow truncation and iteratively remove the ones that |
// are used in an operation that does not allow a truncating |
// conversion. |
- // TODO(fschneider): Replace this with a worklist-based iteration. |
+ ZoneList<HPhi*> worklist(8, zone()); |
+ |
for (int i = 0; i < phi_list()->length(); i++) { |
HPhi* phi = phi_list()->at(i); |
if (phi->representation().IsInteger32()) { |
phi->SetFlag(HValue::kTruncatingToInt32); |
} |
} |
- bool change = true; |
- while (change) { |
- change = false; |
- for (int i = 0; i < phi_list()->length(); i++) { |
- HPhi* phi = phi_list()->at(i); |
- if (!phi->CheckFlag(HValue::kTruncatingToInt32)) continue; |
- for (HUseIterator it(phi->uses()); !it.Done(); it.Advance()) { |
- // If a Phi is used as a non-truncating int32 or as a double, |
- // clear its "truncating" flag. |
- HValue* use = it.value(); |
- Representation input_representation = |
- use->RequiredInputRepresentation(it.index()); |
- if ((input_representation.IsInteger32() && |
- !use->CheckFlag(HValue::kTruncatingToInt32)) || |
- input_representation.IsDouble()) { |
- if (FLAG_trace_representation) { |
- PrintF("#%d Phi is not truncating because of #%d %s\n", |
- phi->id(), it.value()->id(), it.value()->Mnemonic()); |
- } |
- phi->ClearFlag(HValue::kTruncatingToInt32); |
- change = true; |
- break; |
+ |
+ for (int i = 0; i < phi_list()->length(); i++) { |
+ HPhi* phi = phi_list()->at(i); |
+ for (HUseIterator it(phi->uses()); !it.Done(); it.Advance()) { |
+ // If a Phi is used as a non-truncating int32 or as a double, |
+ // clear its "truncating" flag. |
+ HValue* use = it.value(); |
+ Representation input_representation = |
+ use->RequiredInputRepresentation(it.index()); |
+ if ((input_representation.IsInteger32() && |
+ !use->CheckFlag(HValue::kTruncatingToInt32)) || |
+ input_representation.IsDouble()) { |
+ if (FLAG_trace_representation) { |
+ PrintF("#%d Phi is not truncating because of #%d %s\n", |
+ phi->id(), it.value()->id(), it.value()->Mnemonic()); |
} |
+ phi->ClearFlag(HValue::kTruncatingToInt32); |
+ worklist.Add(phi, zone()); |
Jakob Kummerow
2013/04/25 16:32:36
I think you may want to prevent duplicate entries
haitao.feng
2013/04/26 04:38:13
Thanks for the review.
It seems that we do not ne
|
+ break; |
} |
} |
} |
+ while (!worklist.is_empty()) { |
+ HPhi* current = worklist.RemoveLast(); |
+ for (int i = 0; i < current->OperandCount(); ++i) { |
+ HValue* input = current->OperandAt(i); |
+ if (input->IsPhi() && |
+ input->representation().IsInteger32() && |
+ input->CheckFlag(HValue::kTruncatingToInt32)) { |
+ if (FLAG_trace_representation) { |
+ PrintF("#%d Phi is not truncating because of #%d %s\n", |
+ input->id(), current->id(), current->Mnemonic()); |
+ } |
+ input->ClearFlag(HValue::kTruncatingToInt32); |
+ worklist.Add(HPhi::cast(input), zone()); |
+ } |
+ } |
+ } |
+ |
for (int i = 0; i < blocks_.length(); ++i) { |
// Process phi instructions first. |
const ZoneList<HPhi*>* phis = blocks_[i]->phis(); |