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), |