OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/crankshaft/hydrogen.h" | 5 #include "src/crankshaft/hydrogen.h" |
6 | 6 |
7 #include <sstream> | 7 #include <sstream> |
8 | 8 |
9 #include "src/allocation-site-scopes.h" | 9 #include "src/allocation-site-scopes.h" |
10 #include "src/ast/ast-numbering.h" | 10 #include "src/ast/ast-numbering.h" |
(...skipping 669 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
680 | 680 |
681 HConstant* HGraph::GetConstantMinus1() { | 681 HConstant* HGraph::GetConstantMinus1() { |
682 return GetConstant(&constant_minus1_, -1); | 682 return GetConstant(&constant_minus1_, -1); |
683 } | 683 } |
684 | 684 |
685 | 685 |
686 HConstant* HGraph::GetConstantBool(bool value) { | 686 HConstant* HGraph::GetConstantBool(bool value) { |
687 return value ? GetConstantTrue() : GetConstantFalse(); | 687 return value ? GetConstantTrue() : GetConstantFalse(); |
688 } | 688 } |
689 | 689 |
| 690 #define DEFINE_GET_CONSTANT(Name, name, type, htype, boolean_value, \ |
| 691 undetectable) \ |
| 692 HConstant* HGraph::GetConstant##Name() { \ |
| 693 if (!constant_##name##_.is_set()) { \ |
| 694 HConstant* constant = new (zone()) HConstant( \ |
| 695 Unique<Object>::CreateImmovable( \ |
| 696 isolate()->factory()->name##_value()), \ |
| 697 Unique<Map>::CreateImmovable(isolate()->factory()->type##_map()), \ |
| 698 false, Representation::Tagged(), htype, true, boolean_value, \ |
| 699 undetectable, ODDBALL_TYPE); \ |
| 700 constant->InsertAfter(entry_block()->first()); \ |
| 701 constant_##name##_.set(constant); \ |
| 702 } \ |
| 703 return ReinsertConstantIfNecessary(constant_##name##_.get()); \ |
| 704 } |
690 | 705 |
691 #define DEFINE_GET_CONSTANT(Name, name, type, htype, boolean_value) \ | 706 DEFINE_GET_CONSTANT(Undefined, undefined, undefined, HType::Undefined(), false, |
692 HConstant* HGraph::GetConstant##Name() { \ | 707 true) |
693 if (!constant_##name##_.is_set()) { \ | 708 DEFINE_GET_CONSTANT(True, true, boolean, HType::Boolean(), true, false) |
694 HConstant* constant = new(zone()) HConstant( \ | 709 DEFINE_GET_CONSTANT(False, false, boolean, HType::Boolean(), false, false) |
695 Unique<Object>::CreateImmovable(isolate()->factory()->name##_value()), \ | 710 DEFINE_GET_CONSTANT(Hole, the_hole, the_hole, HType::None(), false, false) |
696 Unique<Map>::CreateImmovable(isolate()->factory()->type##_map()), \ | 711 DEFINE_GET_CONSTANT(Null, null, null, HType::Null(), false, true) |
697 false, \ | |
698 Representation::Tagged(), \ | |
699 htype, \ | |
700 true, \ | |
701 boolean_value, \ | |
702 false, \ | |
703 ODDBALL_TYPE); \ | |
704 constant->InsertAfter(entry_block()->first()); \ | |
705 constant_##name##_.set(constant); \ | |
706 } \ | |
707 return ReinsertConstantIfNecessary(constant_##name##_.get()); \ | |
708 } | |
709 | |
710 | |
711 DEFINE_GET_CONSTANT(Undefined, undefined, undefined, HType::Undefined(), false) | |
712 DEFINE_GET_CONSTANT(True, true, boolean, HType::Boolean(), true) | |
713 DEFINE_GET_CONSTANT(False, false, boolean, HType::Boolean(), false) | |
714 DEFINE_GET_CONSTANT(Hole, the_hole, the_hole, HType::None(), false) | |
715 DEFINE_GET_CONSTANT(Null, null, null, HType::Null(), false) | |
716 | |
717 | 712 |
718 #undef DEFINE_GET_CONSTANT | 713 #undef DEFINE_GET_CONSTANT |
719 | 714 |
720 #define DEFINE_IS_CONSTANT(Name, name) \ | 715 #define DEFINE_IS_CONSTANT(Name, name) \ |
721 bool HGraph::IsConstant##Name(HConstant* constant) { \ | 716 bool HGraph::IsConstant##Name(HConstant* constant) { \ |
722 return constant_##name##_.is_set() && constant == constant_##name##_.get(); \ | 717 return constant_##name##_.is_set() && constant == constant_##name##_.get(); \ |
723 } | 718 } |
724 DEFINE_IS_CONSTANT(Undefined, undefined) | 719 DEFINE_IS_CONSTANT(Undefined, undefined) |
725 DEFINE_IS_CONSTANT(0, 0) | 720 DEFINE_IS_CONSTANT(0, 0) |
726 DEFINE_IS_CONSTANT(1, 1) | 721 DEFINE_IS_CONSTANT(1, 1) |
(...skipping 2445 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3172 BuildCopyElements(boilerplate_elements, kind, elements, | 3167 BuildCopyElements(boilerplate_elements, kind, elements, |
3173 kind, length, NULL); | 3168 kind, length, NULL); |
3174 return result; | 3169 return result; |
3175 } | 3170 } |
3176 | 3171 |
3177 | 3172 |
3178 void HGraphBuilder::BuildCompareNil(HValue* value, Type* type, | 3173 void HGraphBuilder::BuildCompareNil(HValue* value, Type* type, |
3179 HIfContinuation* continuation, | 3174 HIfContinuation* continuation, |
3180 MapEmbedding map_embedding) { | 3175 MapEmbedding map_embedding) { |
3181 IfBuilder if_nil(this); | 3176 IfBuilder if_nil(this); |
3182 bool some_case_handled = false; | |
3183 bool some_case_missing = false; | |
3184 | |
3185 if (type->Maybe(Type::Null())) { | |
3186 if (some_case_handled) if_nil.Or(); | |
3187 if_nil.If<HCompareObjectEqAndBranch>(value, graph()->GetConstantNull()); | |
3188 some_case_handled = true; | |
3189 } else { | |
3190 some_case_missing = true; | |
3191 } | |
3192 | |
3193 if (type->Maybe(Type::Undefined())) { | |
3194 if (some_case_handled) if_nil.Or(); | |
3195 if_nil.If<HCompareObjectEqAndBranch>(value, | |
3196 graph()->GetConstantUndefined()); | |
3197 some_case_handled = true; | |
3198 } else { | |
3199 some_case_missing = true; | |
3200 } | |
3201 | 3177 |
3202 if (type->Maybe(Type::Undetectable())) { | 3178 if (type->Maybe(Type::Undetectable())) { |
3203 if (some_case_handled) if_nil.Or(); | |
3204 if_nil.If<HIsUndetectableAndBranch>(value); | 3179 if_nil.If<HIsUndetectableAndBranch>(value); |
3205 some_case_handled = true; | |
3206 } else { | 3180 } else { |
3207 some_case_missing = true; | 3181 bool maybe_null = type->Maybe(Type::Null()); |
3208 } | 3182 if (maybe_null) { |
| 3183 if_nil.If<HCompareObjectEqAndBranch>(value, graph()->GetConstantNull()); |
| 3184 } |
3209 | 3185 |
3210 if (some_case_missing) { | 3186 if (type->Maybe(Type::Undefined())) { |
| 3187 if (maybe_null) if_nil.Or(); |
| 3188 if_nil.If<HCompareObjectEqAndBranch>(value, |
| 3189 graph()->GetConstantUndefined()); |
| 3190 } |
| 3191 |
3211 if_nil.Then(); | 3192 if_nil.Then(); |
3212 if_nil.Else(); | 3193 if_nil.Else(); |
| 3194 |
3213 if (type->NumClasses() == 1) { | 3195 if (type->NumClasses() == 1) { |
3214 BuildCheckHeapObject(value); | 3196 BuildCheckHeapObject(value); |
3215 // For ICs, the map checked below is a sentinel map that gets replaced by | 3197 // For ICs, the map checked below is a sentinel map that gets replaced by |
3216 // the monomorphic map when the code is used as a template to generate a | 3198 // the monomorphic map when the code is used as a template to generate a |
3217 // new IC. For optimized functions, there is no sentinel map, the map | 3199 // new IC. For optimized functions, there is no sentinel map, the map |
3218 // emitted below is the actual monomorphic map. | 3200 // emitted below is the actual monomorphic map. |
3219 if (map_embedding == kEmbedMapsViaWeakCells) { | 3201 if (map_embedding == kEmbedMapsViaWeakCells) { |
3220 HValue* cell = | 3202 HValue* cell = |
3221 Add<HConstant>(Map::WeakCellForMap(type->Classes().Current())); | 3203 Add<HConstant>(Map::WeakCellForMap(type->Classes().Current())); |
3222 HValue* expected_map = Add<HLoadNamedField>( | 3204 HValue* expected_map = Add<HLoadNamedField>( |
(...skipping 10425 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13648 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 13630 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
13649 } | 13631 } |
13650 | 13632 |
13651 #ifdef DEBUG | 13633 #ifdef DEBUG |
13652 graph_->Verify(false); // No full verify. | 13634 graph_->Verify(false); // No full verify. |
13653 #endif | 13635 #endif |
13654 } | 13636 } |
13655 | 13637 |
13656 } // namespace internal | 13638 } // namespace internal |
13657 } // namespace v8 | 13639 } // namespace v8 |
OLD | NEW |