Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 3699 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3710 } | 3710 } |
| 3711 | 3711 |
| 3712 | 3712 |
| 3713 void HGraph::InsertRepresentationChanges() { | 3713 void HGraph::InsertRepresentationChanges() { |
| 3714 HPhase phase("H_Representation changes", this); | 3714 HPhase phase("H_Representation changes", this); |
| 3715 | 3715 |
| 3716 // Compute truncation flag for phis: Initially assume that all | 3716 // Compute truncation flag for phis: Initially assume that all |
| 3717 // int32-phis allow truncation and iteratively remove the ones that | 3717 // int32-phis allow truncation and iteratively remove the ones that |
| 3718 // are used in an operation that does not allow a truncating | 3718 // are used in an operation that does not allow a truncating |
| 3719 // conversion. | 3719 // conversion. |
| 3720 // TODO(fschneider): Replace this with a worklist-based iteration. | 3720 ZoneList<HPhi*> worklist(8, zone()); |
| 3721 | |
| 3721 for (int i = 0; i < phi_list()->length(); i++) { | 3722 for (int i = 0; i < phi_list()->length(); i++) { |
| 3722 HPhi* phi = phi_list()->at(i); | 3723 HPhi* phi = phi_list()->at(i); |
| 3723 if (phi->representation().IsInteger32()) { | 3724 if (phi->representation().IsInteger32()) { |
| 3724 phi->SetFlag(HValue::kTruncatingToInt32); | 3725 phi->SetFlag(HValue::kTruncatingToInt32); |
| 3725 } | 3726 } |
| 3726 } | 3727 } |
| 3727 bool change = true; | 3728 |
| 3728 while (change) { | 3729 for (int i = 0; i < phi_list()->length(); i++) { |
| 3729 change = false; | 3730 HPhi* phi = phi_list()->at(i); |
| 3730 for (int i = 0; i < phi_list()->length(); i++) { | 3731 for (HUseIterator it(phi->uses()); !it.Done(); it.Advance()) { |
| 3731 HPhi* phi = phi_list()->at(i); | 3732 // If a Phi is used as a non-truncating int32 or as a double, |
| 3732 if (!phi->CheckFlag(HValue::kTruncatingToInt32)) continue; | 3733 // clear its "truncating" flag. |
| 3733 for (HUseIterator it(phi->uses()); !it.Done(); it.Advance()) { | 3734 HValue* use = it.value(); |
| 3734 // If a Phi is used as a non-truncating int32 or as a double, | 3735 Representation input_representation = |
| 3735 // clear its "truncating" flag. | 3736 use->RequiredInputRepresentation(it.index()); |
| 3736 HValue* use = it.value(); | 3737 if ((input_representation.IsInteger32() && |
| 3737 Representation input_representation = | 3738 !use->CheckFlag(HValue::kTruncatingToInt32)) || |
| 3738 use->RequiredInputRepresentation(it.index()); | 3739 input_representation.IsDouble()) { |
| 3739 if ((input_representation.IsInteger32() && | 3740 if (FLAG_trace_representation) { |
| 3740 !use->CheckFlag(HValue::kTruncatingToInt32)) || | 3741 PrintF("#%d Phi is not truncating because of #%d %s\n", |
| 3741 input_representation.IsDouble()) { | 3742 phi->id(), it.value()->id(), it.value()->Mnemonic()); |
| 3742 if (FLAG_trace_representation) { | |
| 3743 PrintF("#%d Phi is not truncating because of #%d %s\n", | |
| 3744 phi->id(), it.value()->id(), it.value()->Mnemonic()); | |
| 3745 } | |
| 3746 phi->ClearFlag(HValue::kTruncatingToInt32); | |
| 3747 change = true; | |
| 3748 break; | |
| 3749 } | 3743 } |
| 3744 phi->ClearFlag(HValue::kTruncatingToInt32); | |
| 3745 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
| |
| 3746 break; | |
| 3747 } | |
| 3748 } | |
| 3749 } | |
| 3750 | |
| 3751 while (!worklist.is_empty()) { | |
| 3752 HPhi* current = worklist.RemoveLast(); | |
| 3753 for (int i = 0; i < current->OperandCount(); ++i) { | |
| 3754 HValue* input = current->OperandAt(i); | |
| 3755 if (input->IsPhi() && | |
| 3756 input->representation().IsInteger32() && | |
| 3757 input->CheckFlag(HValue::kTruncatingToInt32)) { | |
| 3758 if (FLAG_trace_representation) { | |
| 3759 PrintF("#%d Phi is not truncating because of #%d %s\n", | |
| 3760 input->id(), current->id(), current->Mnemonic()); | |
| 3761 } | |
| 3762 input->ClearFlag(HValue::kTruncatingToInt32); | |
| 3763 worklist.Add(HPhi::cast(input), zone()); | |
| 3750 } | 3764 } |
| 3751 } | 3765 } |
| 3752 } | 3766 } |
| 3753 | 3767 |
| 3754 for (int i = 0; i < blocks_.length(); ++i) { | 3768 for (int i = 0; i < blocks_.length(); ++i) { |
| 3755 // Process phi instructions first. | 3769 // Process phi instructions first. |
| 3756 const ZoneList<HPhi*>* phis = blocks_[i]->phis(); | 3770 const ZoneList<HPhi*>* phis = blocks_[i]->phis(); |
| 3757 for (int j = 0; j < phis->length(); j++) { | 3771 for (int j = 0; j < phis->length(); j++) { |
| 3758 InsertRepresentationChangesForValue(phis->at(j)); | 3772 InsertRepresentationChangesForValue(phis->at(j)); |
| 3759 } | 3773 } |
| (...skipping 8049 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 11809 } | 11823 } |
| 11810 } | 11824 } |
| 11811 | 11825 |
| 11812 #ifdef DEBUG | 11826 #ifdef DEBUG |
| 11813 if (graph_ != NULL) graph_->Verify(false); // No full verify. | 11827 if (graph_ != NULL) graph_->Verify(false); // No full verify. |
| 11814 if (allocator_ != NULL) allocator_->Verify(); | 11828 if (allocator_ != NULL) allocator_->Verify(); |
| 11815 #endif | 11829 #endif |
| 11816 } | 11830 } |
| 11817 | 11831 |
| 11818 } } // namespace v8::internal | 11832 } } // namespace v8::internal |
| OLD | NEW |