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 1557 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1568 int double_count = use_count[Representation::kDouble]; | 1568 int double_count = use_count[Representation::kDouble]; |
1569 int int32_count = use_count[Representation::kInteger32]; | 1569 int int32_count = use_count[Representation::kInteger32]; |
1570 int non_tagged_count = double_count + int32_count; | 1570 int non_tagged_count = double_count + int32_count; |
1571 | 1571 |
1572 // If a non-loop phi has tagged uses, don't convert it to untagged. | 1572 // If a non-loop phi has tagged uses, don't convert it to untagged. |
1573 if (value->IsPhi() && !value->block()->IsLoopHeader()) { | 1573 if (value->IsPhi() && !value->block()->IsLoopHeader()) { |
1574 if (tagged_count > 0) return Representation::None(); | 1574 if (tagged_count > 0) return Representation::None(); |
1575 } | 1575 } |
1576 | 1576 |
1577 if (non_tagged_count >= tagged_count) { | 1577 if (non_tagged_count >= tagged_count) { |
1578 // More untagged than tagged. | 1578 if (int32_count > 0 && value->IsPhi()) { |
Kevin Millikin (Chromium)
2011/05/03 07:58:32
if (int32_count > 0) {
if (!value->IsPhi() || va
| |
1579 if (double_count > 0) { | 1579 HPhi* phi = HPhi::cast(value); |
1580 // There is at least one usage that is a double => guess that the | 1580 if (phi->IsConvertibleToInteger()) return Representation::Integer32(); |
1581 // correct representation is double. | |
1582 return Representation::Double(); | |
1583 } else if (int32_count > 0) { | 1581 } else if (int32_count > 0) { |
1584 return Representation::Integer32(); | 1582 return Representation::Integer32(); |
1585 } | 1583 } |
1584 if (double_count > 0) return Representation::Double(); | |
1586 } | 1585 } |
1587 return Representation::None(); | 1586 return Representation::None(); |
1588 } | 1587 } |
1589 | 1588 |
1590 | 1589 |
1591 void HInferRepresentation::Analyze() { | 1590 void HInferRepresentation::Analyze() { |
1592 HPhase phase("Infer representations", graph_); | 1591 HPhase phase("Infer representations", graph_); |
1593 | 1592 |
1594 // (1) Initialize bit vectors and count real uses. Each phi gets a | 1593 // (1) Initialize bit vectors and count real uses. Each phi gets a |
1595 // bit-vector of length <number of phis>. | 1594 // bit-vector of length <number of phis>. |
1596 const ZoneList<HPhi*>* phi_list = graph_->phi_list(); | 1595 const ZoneList<HPhi*>* phi_list = graph_->phi_list(); |
1597 int phi_count = phi_list->length(); | 1596 int phi_count = phi_list->length(); |
1598 ScopedVector<BitVector*> connected_phis(phi_count); | 1597 ZoneList<BitVector*> connected_phis(phi_count); |
1599 for (int i = 0; i < phi_count; ++i) { | 1598 for (int i = 0; i < phi_count; ++i) { |
1600 phi_list->at(i)->InitRealUses(i); | 1599 phi_list->at(i)->InitRealUses(i); |
1601 connected_phis[i] = new(zone()) BitVector(phi_count); | 1600 connected_phis[i] = new(zone()) BitVector(phi_count); |
1602 connected_phis[i]->Add(i); | 1601 connected_phis[i]->Add(i); |
1603 } | 1602 } |
1604 | 1603 |
1605 // (2) Do a fixed point iteration to find the set of connected phis. A | 1604 // (2) Do a fixed point iteration to find the set of connected phis. A |
1606 // phi is connected to another phi if its value is used either directly or | 1605 // phi is connected to another phi if its value is used either directly or |
1607 // indirectly through a transitive closure of the def-use relation. | 1606 // indirectly through a transitive closure of the def-use relation. |
1608 bool change = true; | 1607 bool change = true; |
(...skipping 20 matching lines...) Expand all Loading... | |
1629 !it.Done(); | 1628 !it.Done(); |
1630 it.Advance()) { | 1629 it.Advance()) { |
1631 int index = it.Current(); | 1630 int index = it.Current(); |
1632 if (index != i) { | 1631 if (index != i) { |
1633 HPhi* it_use = phi_list->at(it.Current()); | 1632 HPhi* it_use = phi_list->at(it.Current()); |
1634 phi->AddNonPhiUsesFrom(it_use); | 1633 phi->AddNonPhiUsesFrom(it_use); |
1635 } | 1634 } |
1636 } | 1635 } |
1637 } | 1636 } |
1638 | 1637 |
1638 // (4) Compute phis that definitely can't be converted to integer | |
1639 // without deoptimization and mark them to avoid unnecessary deoptimization. | |
1640 change = true; | |
1641 while (change) { | |
1642 change = false; | |
1643 for (int i = 0; i < phi_count; i++) { | |
Kevin Millikin (Chromium)
2011/05/03 07:58:32
All the other loops in this function use new-schoo
| |
1644 HPhi* phi = phi_list->at(i); | |
1645 for (int i = 0; i < phi->OperandCount(); i++) { | |
Kevin Millikin (Chromium)
2011/05/03 07:58:32
Please don't shadow the outer loop index even if y
| |
1646 if (phi->IsConvertibleToInteger() && | |
1647 !phi->OperandAt(i)->IsConvertibleToInteger()) { | |
1648 phi->set_is_convertible_to_integer(false); | |
1649 change = true; | |
1650 break; | |
1651 } | |
1652 } | |
1653 } | |
1654 } | |
1655 | |
1656 | |
1639 for (int i = 0; i < graph_->blocks()->length(); ++i) { | 1657 for (int i = 0; i < graph_->blocks()->length(); ++i) { |
1640 HBasicBlock* block = graph_->blocks()->at(i); | 1658 HBasicBlock* block = graph_->blocks()->at(i); |
1641 const ZoneList<HPhi*>* phis = block->phis(); | 1659 const ZoneList<HPhi*>* phis = block->phis(); |
1642 for (int j = 0; j < phis->length(); ++j) { | 1660 for (int j = 0; j < phis->length(); ++j) { |
1643 AddToWorklist(phis->at(j)); | 1661 AddToWorklist(phis->at(j)); |
1644 } | 1662 } |
1645 | 1663 |
1646 HInstruction* current = block->first(); | 1664 HInstruction* current = block->first(); |
1647 while (current != NULL) { | 1665 while (current != NULL) { |
1648 AddToWorklist(current); | 1666 AddToWorklist(current); |
(...skipping 4428 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
6077 } | 6095 } |
6078 } | 6096 } |
6079 | 6097 |
6080 #ifdef DEBUG | 6098 #ifdef DEBUG |
6081 if (graph_ != NULL) graph_->Verify(); | 6099 if (graph_ != NULL) graph_->Verify(); |
6082 if (allocator_ != NULL) allocator_->Verify(); | 6100 if (allocator_ != NULL) allocator_->Verify(); |
6083 #endif | 6101 #endif |
6084 } | 6102 } |
6085 | 6103 |
6086 } } // namespace v8::internal | 6104 } } // namespace v8::internal |
OLD | NEW |