OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 1631 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1642 if (rep.IsNone()) continue; | 1642 if (rep.IsNone()) continue; |
1643 if (use->IsPhi()) HPhi::cast(use)->AddIndirectUsesTo(&use_count[0]); | 1643 if (use->IsPhi()) HPhi::cast(use)->AddIndirectUsesTo(&use_count[0]); |
1644 ++use_count[rep.kind()]; | 1644 ++use_count[rep.kind()]; |
1645 } | 1645 } |
1646 int tagged_count = use_count[Representation::kTagged]; | 1646 int tagged_count = use_count[Representation::kTagged]; |
1647 int double_count = use_count[Representation::kDouble]; | 1647 int double_count = use_count[Representation::kDouble]; |
1648 int int32_count = use_count[Representation::kInteger32]; | 1648 int int32_count = use_count[Representation::kInteger32]; |
1649 int non_tagged_count = double_count + int32_count; | 1649 int non_tagged_count = double_count + int32_count; |
1650 | 1650 |
1651 // If a non-loop phi has tagged uses, don't convert it to untagged. | 1651 // If a non-loop phi has tagged uses, don't convert it to untagged. |
1652 if (value->IsPhi() && !value->block()->IsLoopHeader()) { | 1652 if (value->IsPhi() && !value->block()->IsLoopHeader() && tagged_count > 0) { |
1653 if (tagged_count > 0) return Representation::None(); | 1653 return Representation::None(); |
1654 } | 1654 } |
1655 | 1655 |
1656 if (non_tagged_count >= tagged_count) { | 1656 // Prefer unboxing over boxing, the latter is more expensive. |
1657 if (int32_count > 0) { | 1657 if (tagged_count > non_tagged_count) Representation::None(); |
1658 if (!value->IsPhi() || value->IsConvertibleToInteger()) { | 1658 |
1659 return Representation::Integer32(); | 1659 // Prefer Integer32 over Double, if possible. |
1660 } | 1660 if (int32_count > 0 && value->IsConvertibleToInteger()) { |
1661 } | 1661 return Representation::Integer32(); |
1662 if (double_count > 0) return Representation::Double(); | |
1663 } | 1662 } |
| 1663 |
| 1664 if (double_count > 0) return Representation::Double(); |
| 1665 |
1664 return Representation::None(); | 1666 return Representation::None(); |
1665 } | 1667 } |
1666 | 1668 |
1667 | 1669 |
1668 void HInferRepresentation::Analyze() { | 1670 void HInferRepresentation::Analyze() { |
1669 HPhase phase("Infer representations", graph_); | 1671 HPhase phase("Infer representations", graph_); |
1670 | 1672 |
1671 // (1) Initialize bit vectors and count real uses. Each phi gets a | 1673 // (1) Initialize bit vectors and count real uses. Each phi gets a |
1672 // bit-vector of length <number of phis>. | 1674 // bit-vector of length <number of phis>. |
1673 const ZoneList<HPhi*>* phi_list = graph_->phi_list(); | 1675 const ZoneList<HPhi*>* phi_list = graph_->phi_list(); |
(...skipping 5149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6823 } | 6825 } |
6824 } | 6826 } |
6825 | 6827 |
6826 #ifdef DEBUG | 6828 #ifdef DEBUG |
6827 if (graph_ != NULL) graph_->Verify(); | 6829 if (graph_ != NULL) graph_->Verify(); |
6828 if (allocator_ != NULL) allocator_->Verify(); | 6830 if (allocator_ != NULL) allocator_->Verify(); |
6829 #endif | 6831 #endif |
6830 } | 6832 } |
6831 | 6833 |
6832 } } // namespace v8::internal | 6834 } } // namespace v8::internal |
OLD | NEW |