From eaab533fd8df1bc3cad5b548ec2dfc6da4c679c3 Mon Sep 17 00:00:00 2001 From: "bmeurer@chromium.org" Date: Mon, 17 Feb 2014 13:23:04 +0000 Subject: [PATCH] Cleanup the double field tracking in Hydrogen. Use a dedicated BuildLoadNamedField() with PropertyAccessInfo, similar to BuildStoreNamedField() for optimized graph building, and a dedicated BuildLoadNamedField() for the code stubs, and don't depend on FLAG_track_double_fields during code generation. R=verwaest@chromium.org Review URL: https://codereview.chromium.org/168583006 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@19411 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/code-stubs-hydrogen.cc | 45 ++++++++++++++++++++++--------- src/hydrogen.cc | 66 +++++++++++++++++++++++----------------------- src/hydrogen.h | 4 +-- 3 files changed, 68 insertions(+), 47 deletions(-) diff --git a/src/code-stubs-hydrogen.cc b/src/code-stubs-hydrogen.cc index c0e66bc..b7247eb 100644 --- a/src/code-stubs-hydrogen.cc +++ b/src/code-stubs-hydrogen.cc @@ -81,6 +81,11 @@ class CodeStubGraphBuilderBase : public HGraphBuilder { HContext* context() { return context_; } Isolate* isolate() { return info_.isolate(); } + HLoadNamedField* BuildLoadNamedField(HValue* object, + Representation representation, + int offset, + bool is_inobject); + enum ArgumentClass { NONE, SINGLE, @@ -559,14 +564,32 @@ Handle KeyedLoadFastElementStub::GenerateCode(Isolate* isolate) { } +HLoadNamedField* CodeStubGraphBuilderBase::BuildLoadNamedField( + HValue* object, + Representation representation, + int offset, + bool is_inobject) { + HObjectAccess access = is_inobject + ? HObjectAccess::ForObservableJSObjectOffset(offset, representation) + : HObjectAccess::ForBackingStoreOffset(offset, representation); + if (representation.IsDouble()) { + // Load the heap number. + object = Add( + object, static_cast(NULL), + access.WithRepresentation(Representation::Tagged())); + // Load the double value from it. + access = HObjectAccess::ForHeapNumberValue(); + } + return Add(object, static_cast(NULL), access); +} + + template<> HValue* CodeStubGraphBuilder::BuildCodeStub() { - Representation rep = casted_stub()->representation(); - int offset = casted_stub()->offset(); - HObjectAccess access = casted_stub()->is_inobject() ? - HObjectAccess::ForObservableJSObjectOffset(offset, rep) : - HObjectAccess::ForBackingStoreOffset(offset, rep); - return AddLoadNamedField(GetParameter(0), access); + return BuildLoadNamedField(GetParameter(0), + casted_stub()->representation(), + casted_stub()->offset(), + casted_stub()->is_inobject()); } @@ -577,12 +600,10 @@ Handle LoadFieldStub::GenerateCode(Isolate* isolate) { template<> HValue* CodeStubGraphBuilder::BuildCodeStub() { - Representation rep = casted_stub()->representation(); - int offset = casted_stub()->offset(); - HObjectAccess access = casted_stub()->is_inobject() ? - HObjectAccess::ForObservableJSObjectOffset(offset, rep) : - HObjectAccess::ForBackingStoreOffset(offset, rep); - return AddLoadNamedField(GetParameter(0), access); + return BuildLoadNamedField(GetParameter(0), + casted_stub()->representation(), + casted_stub()->offset(), + casted_stub()->is_inobject()); } diff --git a/src/hydrogen.cc b/src/hydrogen.cc index fb9806e..2975758 100644 --- a/src/hydrogen.cc +++ b/src/hydrogen.cc @@ -2821,7 +2821,8 @@ HValue* HGraphBuilder::JSArrayBuilder::EmitMapCode() { // No need for a context lookup if the kind_ matches the initial // map, because we can just load the map in that case. HObjectAccess access = HObjectAccess::ForPrototypeOrInitialMap(); - return builder()->AddLoadNamedField(constructor_function_, access); + return builder()->Add( + constructor_function_, static_cast(NULL), access); } // TODO(mvstanton): we should always have a constructor function if we @@ -2846,7 +2847,8 @@ HValue* HGraphBuilder::JSArrayBuilder::EmitMapCode() { HValue* HGraphBuilder::JSArrayBuilder::EmitInternalMapCode() { // Find the map near the constructor function HObjectAccess access = HObjectAccess::ForPrototypeOrInitialMap(); - return builder()->AddLoadNamedField(constructor_function_, access); + return builder()->Add( + constructor_function_, static_cast(NULL), access); } @@ -4889,8 +4891,9 @@ HValue* HOptimizedGraphBuilder::BuildContextChainWalk(Variable* var) { HValue* context = environment()->context(); int length = current_info()->scope()->ContextChainLength(var->scope()); while (length-- > 0) { - context = AddLoadNamedField( - context, HObjectAccess::ForContextSlot(Context::PREVIOUS_INDEX)); + context = Add( + context, static_cast(NULL), + HObjectAccess::ForContextSlot(Context::PREVIOUS_INDEX)); } return context; } @@ -5344,6 +5347,24 @@ HCheckMaps* HOptimizedGraphBuilder::AddCheckMap(HValue* object, } +HInstruction* HOptimizedGraphBuilder::BuildLoadNamedField( + PropertyAccessInfo* info, + HValue* checked_object) { + HObjectAccess access = info->access(); + if (access.representation().IsDouble()) { + // Load the heap number. + checked_object = Add( + checked_object, static_cast(NULL), + access.WithRepresentation(Representation::Tagged())); + checked_object->set_type(HType::HeapNumber()); + // Load the double value from it. + access = HObjectAccess::ForHeapNumberValue(); + } + return New( + checked_object, static_cast(NULL), access); +} + + HInstruction* HOptimizedGraphBuilder::BuildStoreNamedField( PropertyAccessInfo* info, HValue* checked_object, @@ -5354,7 +5375,7 @@ HInstruction* HOptimizedGraphBuilder::BuildStoreNamedField( info->map(), info->lookup(), info->name()); HStoreNamedField *instr; - if (FLAG_track_double_fields && field_access.representation().IsDouble()) { + if (field_access.representation().IsDouble()) { HObjectAccess heap_number_access = field_access.WithRepresentation(Representation::Tagged()); if (transition_to_field) { @@ -5615,7 +5636,7 @@ HInstruction* HOptimizedGraphBuilder::BuildMonomorphicAccess( if (info->lookup()->IsField()) { if (info->IsLoad()) { - return BuildLoadNamedField(checked_holder, info->access()); + return BuildLoadNamedField(info, checked_holder); } else { return BuildStoreNamedField(info, checked_object, value); } @@ -6186,29 +6207,6 @@ void HOptimizedGraphBuilder::VisitThrow(Throw* expr) { } -HLoadNamedField* HGraphBuilder::BuildLoadNamedField(HValue* object, - HObjectAccess access) { - if (FLAG_track_double_fields && access.representation().IsDouble()) { - // load the heap number - HLoadNamedField* heap_number = Add( - object, static_cast(NULL), - access.WithRepresentation(Representation::Tagged())); - heap_number->set_type(HType::HeapNumber()); - // load the double value from it - return New( - heap_number, static_cast(NULL), - HObjectAccess::ForHeapNumberValue()); - } - return New(object, static_cast(NULL), access); -} - - -HInstruction* HGraphBuilder::AddLoadNamedField(HValue* object, - HObjectAccess access) { - return AddInstruction(BuildLoadNamedField(object, access)); -} - - HInstruction* HGraphBuilder::AddLoadStringInstanceType(HValue* string) { if (string->IsConstant()) { HConstant* c_string = HConstant::cast(string); @@ -6216,9 +6214,10 @@ HInstruction* HGraphBuilder::AddLoadStringInstanceType(HValue* string) { return Add(c_string->StringValue()->map()->instance_type()); } } - return AddLoadNamedField( - AddLoadNamedField(string, HObjectAccess::ForMap()), - HObjectAccess::ForMapInstanceType()); + return Add( + Add(string, static_cast(NULL), + HObjectAccess::ForMap()), + static_cast(NULL), HObjectAccess::ForMapInstanceType()); } @@ -6229,7 +6228,8 @@ HInstruction* HGraphBuilder::AddLoadStringLength(HValue* string) { return Add(c_string->StringValue()->length()); } } - return AddLoadNamedField(string, HObjectAccess::ForStringLength()); + return Add(string, static_cast(NULL), + HObjectAccess::ForStringLength()); } diff --git a/src/hydrogen.h b/src/hydrogen.h index 8668698..cf0b484 100644 --- a/src/hydrogen.h +++ b/src/hydrogen.h @@ -1398,8 +1398,6 @@ class HGraphBuilder { PropertyAccessType access_type, LoadKeyedHoleMode load_mode = NEVER_RETURN_HOLE); - HLoadNamedField* BuildLoadNamedField(HValue* object, HObjectAccess access); - HInstruction* AddLoadNamedField(HValue* object, HObjectAccess access); HInstruction* AddLoadStringInstanceType(HValue* string); HInstruction* AddLoadStringLength(HValue* string); HStoreNamedField* AddStoreMapNoWriteBarrier(HValue* object, HValue* map) { @@ -2559,6 +2557,8 @@ class HOptimizedGraphBuilder : public HGraphBuilder, public AstVisitor { BailoutId return_id, bool is_uninitialized = false); + HInstruction* BuildLoadNamedField(PropertyAccessInfo* info, + HValue* checked_object); HInstruction* BuildStoreNamedField(PropertyAccessInfo* info, HValue* checked_object, HValue* value); -- 2.7.4