| Index: src/crankshaft/hydrogen.cc
|
| diff --git a/src/crankshaft/hydrogen.cc b/src/crankshaft/hydrogen.cc
|
| index f3e151bba73568f3ae12fa2d9d80ce81a4dc90f8..78e0718c8d93250766fa79468d393b80b7620dfb 100644
|
| --- a/src/crankshaft/hydrogen.cc
|
| +++ b/src/crankshaft/hydrogen.cc
|
| @@ -1592,172 +1592,6 @@ HValue* HGraphBuilder::BuildCopyElementsOnWrite(HValue* object,
|
| return environment()->Pop();
|
| }
|
|
|
| -HValue* HGraphBuilder::BuildElementIndexHash(HValue* index) {
|
| - int32_t seed_value = static_cast<uint32_t>(isolate()->heap()->HashSeed());
|
| - HValue* seed = Add<HConstant>(seed_value);
|
| - HValue* hash = AddUncasted<HBitwise>(Token::BIT_XOR, index, seed);
|
| -
|
| - // hash = ~hash + (hash << 15);
|
| - HValue* shifted_hash = AddUncasted<HShl>(hash, Add<HConstant>(15));
|
| - HValue* not_hash = AddUncasted<HBitwise>(Token::BIT_XOR, hash,
|
| - graph()->GetConstantMinus1());
|
| - hash = AddUncasted<HAdd>(shifted_hash, not_hash);
|
| -
|
| - // hash = hash ^ (hash >> 12);
|
| - shifted_hash = AddUncasted<HShr>(hash, Add<HConstant>(12));
|
| - hash = AddUncasted<HBitwise>(Token::BIT_XOR, hash, shifted_hash);
|
| -
|
| - // hash = hash + (hash << 2);
|
| - shifted_hash = AddUncasted<HShl>(hash, Add<HConstant>(2));
|
| - hash = AddUncasted<HAdd>(hash, shifted_hash);
|
| -
|
| - // hash = hash ^ (hash >> 4);
|
| - shifted_hash = AddUncasted<HShr>(hash, Add<HConstant>(4));
|
| - hash = AddUncasted<HBitwise>(Token::BIT_XOR, hash, shifted_hash);
|
| -
|
| - // hash = hash * 2057;
|
| - hash = AddUncasted<HMul>(hash, Add<HConstant>(2057));
|
| - hash->ClearFlag(HValue::kCanOverflow);
|
| -
|
| - // hash = hash ^ (hash >> 16);
|
| - shifted_hash = AddUncasted<HShr>(hash, Add<HConstant>(16));
|
| - return AddUncasted<HBitwise>(Token::BIT_XOR, hash, shifted_hash);
|
| -}
|
| -
|
| -HValue* HGraphBuilder::BuildUncheckedDictionaryElementLoad(HValue* receiver,
|
| - HValue* elements,
|
| - HValue* key,
|
| - HValue* hash) {
|
| - HValue* capacity =
|
| - Add<HLoadKeyed>(elements, Add<HConstant>(NameDictionary::kCapacityIndex),
|
| - nullptr, nullptr, FAST_ELEMENTS);
|
| -
|
| - HValue* mask = AddUncasted<HSub>(capacity, graph()->GetConstant1());
|
| - mask->ChangeRepresentation(Representation::Integer32());
|
| - mask->ClearFlag(HValue::kCanOverflow);
|
| -
|
| - HValue* entry = hash;
|
| - HValue* count = graph()->GetConstant1();
|
| - Push(entry);
|
| - Push(count);
|
| -
|
| - HIfContinuation return_or_loop_continuation(graph()->CreateBasicBlock(),
|
| - graph()->CreateBasicBlock());
|
| - HIfContinuation found_key_match_continuation(graph()->CreateBasicBlock(),
|
| - graph()->CreateBasicBlock());
|
| - LoopBuilder probe_loop(this);
|
| - probe_loop.BeginBody(2); // Drop entry, count from last environment to
|
| - // appease live range building without simulates.
|
| -
|
| - count = Pop();
|
| - entry = Pop();
|
| - entry = AddUncasted<HBitwise>(Token::BIT_AND, entry, mask);
|
| - int entry_size = SeededNumberDictionary::kEntrySize;
|
| - HValue* base_index = AddUncasted<HMul>(entry, Add<HConstant>(entry_size));
|
| - base_index->ClearFlag(HValue::kCanOverflow);
|
| - int start_offset = SeededNumberDictionary::kElementsStartIndex;
|
| - HValue* key_index =
|
| - AddUncasted<HAdd>(base_index, Add<HConstant>(start_offset));
|
| - key_index->ClearFlag(HValue::kCanOverflow);
|
| -
|
| - HValue* candidate_key =
|
| - Add<HLoadKeyed>(elements, key_index, nullptr, nullptr, FAST_ELEMENTS);
|
| - IfBuilder if_undefined(this);
|
| - if_undefined.If<HCompareObjectEqAndBranch>(candidate_key,
|
| - graph()->GetConstantUndefined());
|
| - if_undefined.Then();
|
| - {
|
| - // element == undefined means "not found". Call the runtime.
|
| - // TODO(jkummerow): walk the prototype chain instead.
|
| - Add<HPushArguments>(receiver, key);
|
| - Push(Add<HCallRuntime>(Runtime::FunctionForId(Runtime::kKeyedGetProperty),
|
| - 2));
|
| - }
|
| - if_undefined.Else();
|
| - {
|
| - IfBuilder if_match(this);
|
| - if_match.If<HCompareObjectEqAndBranch>(candidate_key, key);
|
| - if_match.Then();
|
| - if_match.Else();
|
| -
|
| - // Update non-internalized string in the dictionary with internalized key?
|
| - IfBuilder if_update_with_internalized(this);
|
| - HValue* smi_check =
|
| - if_update_with_internalized.IfNot<HIsSmiAndBranch>(candidate_key);
|
| - if_update_with_internalized.And();
|
| - HValue* map = AddLoadMap(candidate_key, smi_check);
|
| - HValue* instance_type =
|
| - Add<HLoadNamedField>(map, nullptr, HObjectAccess::ForMapInstanceType());
|
| - HValue* not_internalized_bit = AddUncasted<HBitwise>(
|
| - Token::BIT_AND, instance_type,
|
| - Add<HConstant>(static_cast<int>(kIsNotInternalizedMask)));
|
| - if_update_with_internalized.If<HCompareNumericAndBranch>(
|
| - not_internalized_bit, graph()->GetConstant0(), Token::NE);
|
| - if_update_with_internalized.And();
|
| - if_update_with_internalized.IfNot<HCompareObjectEqAndBranch>(
|
| - candidate_key, graph()->GetConstantHole());
|
| - if_update_with_internalized.AndIf<HStringCompareAndBranch>(candidate_key,
|
| - key, Token::EQ);
|
| - if_update_with_internalized.Then();
|
| - // Replace a key that is a non-internalized string by the equivalent
|
| - // internalized string for faster further lookups.
|
| - Add<HStoreKeyed>(elements, key_index, key, nullptr, FAST_ELEMENTS);
|
| - if_update_with_internalized.Else();
|
| -
|
| - if_update_with_internalized.JoinContinuation(&found_key_match_continuation);
|
| - if_match.JoinContinuation(&found_key_match_continuation);
|
| -
|
| - IfBuilder found_key_match(this, &found_key_match_continuation);
|
| - found_key_match.Then();
|
| - // Key at current probe matches. Relevant bits in the |details| field must
|
| - // be zero, otherwise the dictionary element requires special handling.
|
| - HValue* details_index =
|
| - AddUncasted<HAdd>(base_index, Add<HConstant>(start_offset + 2));
|
| - details_index->ClearFlag(HValue::kCanOverflow);
|
| - HValue* details = Add<HLoadKeyed>(elements, details_index, nullptr, nullptr,
|
| - FAST_ELEMENTS);
|
| - int details_mask = PropertyDetails::KindField::kMask;
|
| - details = AddUncasted<HBitwise>(Token::BIT_AND, details,
|
| - Add<HConstant>(details_mask));
|
| - IfBuilder details_compare(this);
|
| - details_compare.If<HCompareNumericAndBranch>(details, New<HConstant>(kData),
|
| - Token::EQ);
|
| - details_compare.Then();
|
| - HValue* result_index =
|
| - AddUncasted<HAdd>(base_index, Add<HConstant>(start_offset + 1));
|
| - result_index->ClearFlag(HValue::kCanOverflow);
|
| - Push(Add<HLoadKeyed>(elements, result_index, nullptr, nullptr,
|
| - FAST_ELEMENTS));
|
| - details_compare.Else();
|
| - Add<HPushArguments>(receiver, key);
|
| - Push(Add<HCallRuntime>(Runtime::FunctionForId(Runtime::kKeyedGetProperty),
|
| - 2));
|
| - details_compare.End();
|
| -
|
| - found_key_match.Else();
|
| - found_key_match.JoinContinuation(&return_or_loop_continuation);
|
| - }
|
| - if_undefined.JoinContinuation(&return_or_loop_continuation);
|
| -
|
| - IfBuilder return_or_loop(this, &return_or_loop_continuation);
|
| - return_or_loop.Then();
|
| - probe_loop.Break();
|
| -
|
| - return_or_loop.Else();
|
| - entry = AddUncasted<HAdd>(entry, count);
|
| - entry->ClearFlag(HValue::kCanOverflow);
|
| - count = AddUncasted<HAdd>(count, graph()->GetConstant1());
|
| - count->ClearFlag(HValue::kCanOverflow);
|
| - Push(entry);
|
| - Push(count);
|
| -
|
| - probe_loop.EndBody();
|
| -
|
| - return_or_loop.End();
|
| -
|
| - return Pop();
|
| -}
|
| -
|
| HValue* HGraphBuilder::BuildCreateIterResultObject(HValue* value,
|
| HValue* done) {
|
| NoObservableSideEffectsScope scope(this);
|
| @@ -2969,74 +2803,6 @@ HInstruction* HGraphBuilder::BuildGetNativeContext() {
|
| HObjectAccess::ForContextSlot(Context::NATIVE_CONTEXT_INDEX));
|
| }
|
|
|
| -
|
| -HInstruction* HGraphBuilder::BuildGetNativeContext(HValue* closure) {
|
| - // Get the global object, then the native context
|
| - HInstruction* context = Add<HLoadNamedField>(
|
| - closure, nullptr, HObjectAccess::ForFunctionContextPointer());
|
| - return Add<HLoadNamedField>(
|
| - context, nullptr,
|
| - HObjectAccess::ForContextSlot(Context::NATIVE_CONTEXT_INDEX));
|
| -}
|
| -
|
| -
|
| -HValue* HGraphBuilder::BuildGetParentContext(HValue* depth, int depth_value) {
|
| - HValue* script_context = context();
|
| - if (depth != NULL) {
|
| - HValue* zero = graph()->GetConstant0();
|
| -
|
| - Push(script_context);
|
| - Push(depth);
|
| -
|
| - LoopBuilder loop(this);
|
| - loop.BeginBody(2); // Drop script_context and depth from last environment
|
| - // to appease live range building without simulates.
|
| - depth = Pop();
|
| - script_context = Pop();
|
| -
|
| - script_context = Add<HLoadNamedField>(
|
| - script_context, nullptr,
|
| - HObjectAccess::ForContextSlot(Context::PREVIOUS_INDEX));
|
| - depth = AddUncasted<HSub>(depth, graph()->GetConstant1());
|
| - depth->ClearFlag(HValue::kCanOverflow);
|
| -
|
| - IfBuilder if_break(this);
|
| - if_break.If<HCompareNumericAndBranch, HValue*>(depth, zero, Token::EQ);
|
| - if_break.Then();
|
| - {
|
| - Push(script_context); // The result.
|
| - loop.Break();
|
| - }
|
| - if_break.Else();
|
| - {
|
| - Push(script_context);
|
| - Push(depth);
|
| - }
|
| - loop.EndBody();
|
| - if_break.End();
|
| -
|
| - script_context = Pop();
|
| - } else if (depth_value > 0) {
|
| - // Unroll the above loop.
|
| - for (int i = 0; i < depth_value; i++) {
|
| - script_context = Add<HLoadNamedField>(
|
| - script_context, nullptr,
|
| - HObjectAccess::ForContextSlot(Context::PREVIOUS_INDEX));
|
| - }
|
| - }
|
| - return script_context;
|
| -}
|
| -
|
| -
|
| -HInstruction* HGraphBuilder::BuildGetArrayFunction() {
|
| - HInstruction* native_context = BuildGetNativeContext();
|
| - HInstruction* index =
|
| - Add<HConstant>(static_cast<int32_t>(Context::ARRAY_FUNCTION_INDEX));
|
| - return Add<HLoadKeyed>(native_context, index, nullptr, nullptr,
|
| - FAST_ELEMENTS);
|
| -}
|
| -
|
| -
|
| HValue* HGraphBuilder::BuildArrayBufferViewFieldAccessor(HValue* object,
|
| HValue* checked_object,
|
| FieldIndex index) {
|
| @@ -3066,12 +2832,6 @@ HValue* HGraphBuilder::BuildArrayBufferViewFieldAccessor(HValue* object,
|
| return Pop();
|
| }
|
|
|
| -HValue* HGraphBuilder::AddLoadJSBuiltin(int context_index) {
|
| - HValue* native_context = BuildGetNativeContext();
|
| - HObjectAccess function_access = HObjectAccess::ForContextSlot(context_index);
|
| - return Add<HLoadNamedField>(native_context, nullptr, function_access);
|
| -}
|
| -
|
| HOptimizedGraphBuilder::HOptimizedGraphBuilder(CompilationInfo* info,
|
| bool track_positions)
|
| : HGraphBuilder(info, CallInterfaceDescriptor(), track_positions),
|
|
|