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 825 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
836 | 836 |
837 void HNumericConstraint::PrintDataTo(StringStream* stream) { | 837 void HNumericConstraint::PrintDataTo(StringStream* stream) { |
838 stream->Add("("); | 838 stream->Add("("); |
839 constrained_value()->PrintNameTo(stream); | 839 constrained_value()->PrintNameTo(stream); |
840 stream->Add(" %s ", relation().Mnemonic()); | 840 stream->Add(" %s ", relation().Mnemonic()); |
841 related_value()->PrintNameTo(stream); | 841 related_value()->PrintNameTo(stream); |
842 stream->Add(")"); | 842 stream->Add(")"); |
843 } | 843 } |
844 | 844 |
845 | 845 |
| 846 HInductionVariableAnnotation* HInductionVariableAnnotation::AddToGraph( |
| 847 HPhi* phi, |
| 848 NumericRelation relation, |
| 849 int operand_index) { |
| 850 HInductionVariableAnnotation* result = |
| 851 new(phi->block()->zone()) HInductionVariableAnnotation(phi, relation, |
| 852 operand_index); |
| 853 result->InsertAfter(phi->block()->first()); |
| 854 return result; |
| 855 } |
| 856 |
| 857 |
| 858 void HInductionVariableAnnotation::PrintDataTo(StringStream* stream) { |
| 859 stream->Add("("); |
| 860 RedefinedOperand()->PrintNameTo(stream); |
| 861 stream->Add(" %s ", relation().Mnemonic()); |
| 862 induction_base()->PrintNameTo(stream); |
| 863 stream->Add(")"); |
| 864 } |
| 865 |
| 866 |
846 void HDummyUse::PrintDataTo(StringStream* stream) { | 867 void HDummyUse::PrintDataTo(StringStream* stream) { |
847 value()->PrintNameTo(stream); | 868 value()->PrintNameTo(stream); |
848 } | 869 } |
849 | 870 |
850 | 871 |
851 void HUnaryCall::PrintDataTo(StringStream* stream) { | 872 void HUnaryCall::PrintDataTo(StringStream* stream) { |
852 value()->PrintNameTo(stream); | 873 value()->PrintNameTo(stream); |
853 stream->Add(" "); | 874 stream->Add(" "); |
854 stream->Add("#%d", argument_count()); | 875 stream->Add("#%d", argument_count()); |
855 } | 876 } |
(...skipping 691 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1547 } | 1568 } |
1548 return result; | 1569 return result; |
1549 } else { | 1570 } else { |
1550 return HValue::InferRange(zone); | 1571 return HValue::InferRange(zone); |
1551 } | 1572 } |
1552 } | 1573 } |
1553 | 1574 |
1554 | 1575 |
1555 void HPhi::AddInformativeDefinitions() { | 1576 void HPhi::AddInformativeDefinitions() { |
1556 if (OperandCount() == 2) { | 1577 if (OperandCount() == 2) { |
| 1578 // If one of the operands is an OSR block give up (this cannot be an |
| 1579 // induction variable). |
| 1580 if (OperandAt(0)->block()->is_osr_entry() || |
| 1581 OperandAt(1)->block()->is_osr_entry()) return; |
| 1582 |
1557 for (int operand_index = 0; operand_index < 2; operand_index++) { | 1583 for (int operand_index = 0; operand_index < 2; operand_index++) { |
1558 int other_operand_index = (operand_index + 1) % 2; | 1584 int other_operand_index = (operand_index + 1) % 2; |
1559 | 1585 |
1560 // Add an idef that "discards" the OSR entry block branch. | |
1561 if (OperandAt(operand_index)->block()->is_osr_entry()) { | |
1562 HNumericConstraint::AddToGraph( | |
1563 this, NumericRelation::Eq(), OperandAt(other_operand_index)); | |
1564 } | |
1565 | |
1566 static NumericRelation relations[] = { | 1586 static NumericRelation relations[] = { |
1567 NumericRelation::Ge(), | 1587 NumericRelation::Ge(), |
1568 NumericRelation::Le() | 1588 NumericRelation::Le() |
1569 }; | 1589 }; |
1570 | 1590 |
1571 // Check if this phi is an induction variable. If, e.g., we know that | 1591 // Check if this phi is an induction variable. If, e.g., we know that |
1572 // its first input is greater than the phi itself, then that must be | 1592 // its first input is greater than the phi itself, then that must be |
1573 // the back edge, and the phi is always greater than its second input. | 1593 // the back edge, and the phi is always greater than its second input. |
1574 for (int relation_index = 0; relation_index < 2; relation_index++) { | 1594 for (int relation_index = 0; relation_index < 2; relation_index++) { |
1575 if (OperandAt(operand_index)->IsRelationTrue(relations[relation_index], | 1595 if (OperandAt(operand_index)->IsRelationTrue(relations[relation_index], |
1576 this)) { | 1596 this)) { |
1577 HNumericConstraint::AddToGraph(this, | 1597 HInductionVariableAnnotation::AddToGraph(this, |
1578 relations[relation_index], | 1598 relations[relation_index], |
1579 OperandAt(other_operand_index)); | 1599 other_operand_index); |
1580 } | 1600 } |
1581 } | 1601 } |
1582 } | 1602 } |
1583 } | 1603 } |
1584 } | 1604 } |
1585 | 1605 |
1586 | 1606 |
| 1607 bool HPhi::IsRelationTrueInternal(NumericRelation relation, HValue* other) { |
| 1608 if (CheckFlag(kNumericConstraintEvaluationInProgress)) return false; |
| 1609 |
| 1610 SetFlag(kNumericConstraintEvaluationInProgress); |
| 1611 bool result = true; |
| 1612 for (int i = 0; i < OperandCount(); i++) { |
| 1613 // Skip OSR entry blocks |
| 1614 if (OperandAt(i)->block()->is_osr_entry()) continue; |
| 1615 |
| 1616 if (!OperandAt(i)->IsRelationTrue(relation, other)) { |
| 1617 result = false; |
| 1618 break; |
| 1619 } |
| 1620 } |
| 1621 ClearFlag(kNumericConstraintEvaluationInProgress); |
| 1622 |
| 1623 return result; |
| 1624 } |
| 1625 |
| 1626 |
1587 Range* HMathMinMax::InferRange(Zone* zone) { | 1627 Range* HMathMinMax::InferRange(Zone* zone) { |
1588 if (representation().IsInteger32()) { | 1628 if (representation().IsInteger32()) { |
1589 Range* a = left()->range(); | 1629 Range* a = left()->range(); |
1590 Range* b = right()->range(); | 1630 Range* b = right()->range(); |
1591 Range* res = a->Copy(zone); | 1631 Range* res = a->Copy(zone); |
1592 if (operation_ == kMathMax) { | 1632 if (operation_ == kMathMax) { |
1593 res->CombinedMax(b); | 1633 res->CombinedMax(b); |
1594 } else { | 1634 } else { |
1595 ASSERT(operation_ == kMathMin); | 1635 ASSERT(operation_ == kMathMin); |
1596 res->CombinedMin(b); | 1636 res->CombinedMin(b); |
(...skipping 1463 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3060 | 3100 |
3061 | 3101 |
3062 void HCheckFunction::Verify() { | 3102 void HCheckFunction::Verify() { |
3063 HInstruction::Verify(); | 3103 HInstruction::Verify(); |
3064 ASSERT(HasNoUses()); | 3104 ASSERT(HasNoUses()); |
3065 } | 3105 } |
3066 | 3106 |
3067 #endif | 3107 #endif |
3068 | 3108 |
3069 } } // namespace v8::internal | 3109 } } // namespace v8::internal |
OLD | NEW |