| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 7661 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7672 | 7672 |
| 7673 | 7673 |
| 7674 HValue* HGraphBuilder::TruncateToNumber(HValue* value, Handle<Type>* expected) { | 7674 HValue* HGraphBuilder::TruncateToNumber(HValue* value, Handle<Type>* expected) { |
| 7675 if (value->IsConstant()) { | 7675 if (value->IsConstant()) { |
| 7676 HConstant* constant = HConstant::cast(value); | 7676 HConstant* constant = HConstant::cast(value); |
| 7677 Maybe<HConstant*> number = constant->CopyToTruncatedNumber(zone()); | 7677 Maybe<HConstant*> number = constant->CopyToTruncatedNumber(zone()); |
| 7678 if (number.has_value) { | 7678 if (number.has_value) { |
| 7679 *expected = handle(Type::Number(), isolate()); | 7679 *expected = handle(Type::Number(), isolate()); |
| 7680 return AddInstruction(number.value); | 7680 return AddInstruction(number.value); |
| 7681 } | 7681 } |
| 7682 return value; | |
| 7683 } | |
| 7684 | |
| 7685 Handle<Type> expected_type = *expected; | |
| 7686 Representation rep = Representation::FromType(expected_type); | |
| 7687 if (!rep.IsTagged()) return value; | |
| 7688 | |
| 7689 // If our type feedback suggests that we can non-observably truncate to number | |
| 7690 // we introduce the appropriate check here. This avoids 'value' having a | |
| 7691 // tagged representation later on. | |
| 7692 if (expected_type->Is(Type::Oddball())) { | |
| 7693 // TODO(olivf) The BinaryOpStub only records undefined. It might pay off to | |
| 7694 // also record booleans and convert them to 0/1 here. | |
| 7695 IfBuilder if_nan(this); | |
| 7696 if_nan.If<HCompareObjectEqAndBranch>(value, | |
| 7697 graph()->GetConstantUndefined()); | |
| 7698 if_nan.Then(); | |
| 7699 if_nan.ElseDeopt(); | |
| 7700 if_nan.End(); | |
| 7701 return Add<HConstant>(OS::nan_value()); | |
| 7702 } | 7682 } |
| 7703 | 7683 |
| 7704 return value; | 7684 return value; |
| 7705 } | 7685 } |
| 7706 | 7686 |
| 7707 | 7687 |
| 7708 HInstruction* HOptimizedGraphBuilder::BuildBinaryOperation( | 7688 HInstruction* HOptimizedGraphBuilder::BuildBinaryOperation( |
| 7709 BinaryOperation* expr, | 7689 BinaryOperation* expr, |
| 7710 HValue* left, | 7690 HValue* left, |
| 7711 HValue* right) { | 7691 HValue* right) { |
| (...skipping 2087 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9799 if (ShouldProduceTraceOutput()) { | 9779 if (ShouldProduceTraceOutput()) { |
| 9800 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 9780 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
| 9801 } | 9781 } |
| 9802 | 9782 |
| 9803 #ifdef DEBUG | 9783 #ifdef DEBUG |
| 9804 graph_->Verify(false); // No full verify. | 9784 graph_->Verify(false); // No full verify. |
| 9805 #endif | 9785 #endif |
| 9806 } | 9786 } |
| 9807 | 9787 |
| 9808 } } // namespace v8::internal | 9788 } } // namespace v8::internal |
| OLD | NEW |