| Index: src/crankshaft/hydrogen.cc
|
| diff --git a/src/crankshaft/hydrogen.cc b/src/crankshaft/hydrogen.cc
|
| index 9e934f0a13fcfe11eff106da036461d70efe6175..6868f5563ea4bef76fb023a0f193b538e1b124b7 100644
|
| --- a/src/crankshaft/hydrogen.cc
|
| +++ b/src/crankshaft/hydrogen.cc
|
| @@ -8820,13 +8820,9 @@
|
| BailoutId ast_id,
|
| BailoutId return_id) {
|
| if (TryInlineApiGetter(getter, receiver_map, ast_id)) return true;
|
| - if (getter->IsJSFunction()) {
|
| - Handle<JSFunction> getter_function = Handle<JSFunction>::cast(getter);
|
| - return TryInlineBuiltinGetterCall(getter_function, receiver_map, ast_id) ||
|
| - TryInline(getter_function, 0, NULL, ast_id, return_id,
|
| - GETTER_CALL_RETURN, TailCallMode::kDisallow);
|
| - }
|
| - return false;
|
| + return getter->IsJSFunction() &&
|
| + TryInline(Handle<JSFunction>::cast(getter), 0, NULL, ast_id, return_id,
|
| + GETTER_CALL_RETURN, TailCallMode::kDisallow);
|
| }
|
|
|
| bool HOptimizedGraphBuilder::TryInlineSetter(Handle<Object> setter,
|
| @@ -8918,62 +8914,9 @@
|
| !IsReadOnlyLengthDescriptor(receiver_map);
|
| }
|
|
|
| -bool HOptimizedGraphBuilder::TryInlineBuiltinGetterCall(
|
| - Handle<JSFunction> function, Handle<Map> receiver_map, BailoutId ast_id) {
|
| - if (!function->shared()->HasBuiltinFunctionId()) return false;
|
| - BuiltinFunctionId id = function->shared()->builtin_function_id();
|
| -
|
| - // Try to inline getter calls like DataView.prototype.byteLength/byteOffset
|
| - // as operations in the calling function.
|
| - switch (id) {
|
| - case kDataViewBuffer: {
|
| - if (!receiver_map->IsJSDataViewMap()) return false;
|
| - HObjectAccess access = HObjectAccess::ForMapAndOffset(
|
| - receiver_map, JSDataView::kBufferOffset);
|
| - HValue* object = Pop(); // receiver
|
| - HInstruction* result = New<HLoadNamedField>(object, object, access);
|
| - ast_context()->ReturnInstruction(result, ast_id);
|
| - return true;
|
| - }
|
| - case kDataViewByteLength:
|
| - case kDataViewByteOffset: {
|
| - if (!receiver_map->IsJSDataViewMap()) return false;
|
| - int offset = (id == kDataViewByteLength) ? JSDataView::kByteLengthOffset
|
| - : JSDataView::kByteOffsetOffset;
|
| - HObjectAccess access =
|
| - HObjectAccess::ForMapAndOffset(receiver_map, offset);
|
| - HValue* object = Pop(); // receiver
|
| - HValue* checked_object = Add<HCheckArrayBufferNotNeutered>(object);
|
| - HInstruction* result =
|
| - New<HLoadNamedField>(object, checked_object, access);
|
| - ast_context()->ReturnInstruction(result, ast_id);
|
| - return true;
|
| - }
|
| - case kTypedArrayByteLength:
|
| - case kTypedArrayByteOffset:
|
| - case kTypedArrayLength: {
|
| - if (!receiver_map->IsJSTypedArrayMap()) return false;
|
| - int offset = (id == kTypedArrayLength)
|
| - ? JSTypedArray::kLengthOffset
|
| - : (id == kTypedArrayByteLength)
|
| - ? JSTypedArray::kByteLengthOffset
|
| - : JSTypedArray::kByteOffsetOffset;
|
| - HObjectAccess access =
|
| - HObjectAccess::ForMapAndOffset(receiver_map, offset);
|
| - HValue* object = Pop(); // receiver
|
| - HValue* checked_object = Add<HCheckArrayBufferNotNeutered>(object);
|
| - HInstruction* result =
|
| - New<HLoadNamedField>(object, checked_object, access);
|
| - ast_context()->ReturnInstruction(result, ast_id);
|
| - return true;
|
| - }
|
| - default:
|
| - return false;
|
| - }
|
| -}
|
|
|
| bool HOptimizedGraphBuilder::TryInlineBuiltinMethodCall(
|
| - Handle<JSFunction> function, Handle<Map> receiver_map, BailoutId ast_id,
|
| + Call* expr, Handle<JSFunction> function, Handle<Map> receiver_map,
|
| int args_count_no_receiver) {
|
| if (!function->shared()->HasBuiltinFunctionId()) return false;
|
| BuiltinFunctionId id = function->shared()->builtin_function_id();
|
| @@ -9018,12 +8961,12 @@
|
| HInstruction* char_code =
|
| BuildStringCharCodeAt(string, index);
|
| if (id == kStringCharCodeAt) {
|
| - ast_context()->ReturnInstruction(char_code, ast_id);
|
| + ast_context()->ReturnInstruction(char_code, expr->id());
|
| return true;
|
| }
|
| AddInstruction(char_code);
|
| HInstruction* result = NewUncasted<HStringCharFromCode>(char_code);
|
| - ast_context()->ReturnInstruction(result, ast_id);
|
| + ast_context()->ReturnInstruction(result, expr->id());
|
| return true;
|
| }
|
| break;
|
| @@ -9035,7 +8978,7 @@
|
| argument, Representation::Integer32());
|
| argument->SetFlag(HValue::kTruncatingToInt32);
|
| HInstruction* result = NewUncasted<HStringCharFromCode>(argument);
|
| - ast_context()->ReturnInstruction(result, ast_id);
|
| + ast_context()->ReturnInstruction(result, expr->id());
|
| return true;
|
| }
|
| break;
|
| @@ -9053,7 +8996,7 @@
|
| HValue* argument = Pop();
|
| Drop(2); // Receiver and function.
|
| HInstruction* op = NewUncasted<HUnaryMathOperation>(argument, id);
|
| - ast_context()->ReturnInstruction(op, ast_id);
|
| + ast_context()->ReturnInstruction(op, expr->id());
|
| return true;
|
| }
|
| break;
|
| @@ -9084,7 +9027,7 @@
|
| if (result == NULL) {
|
| result = NewUncasted<HPower>(left, right);
|
| }
|
| - ast_context()->ReturnInstruction(result, ast_id);
|
| + ast_context()->ReturnInstruction(result, expr->id());
|
| return true;
|
| }
|
| break;
|
| @@ -9097,7 +9040,7 @@
|
| HMathMinMax::Operation op = (id == kMathMin) ? HMathMinMax::kMathMin
|
| : HMathMinMax::kMathMax;
|
| HInstruction* result = NewUncasted<HMathMinMax>(left, right, op);
|
| - ast_context()->ReturnInstruction(result, ast_id);
|
| + ast_context()->ReturnInstruction(result, expr->id());
|
| return true;
|
| }
|
| break;
|
| @@ -9108,7 +9051,7 @@
|
| Drop(2); // Receiver and function.
|
| HInstruction* result =
|
| HMul::NewImul(isolate(), zone(), context(), left, right);
|
| - ast_context()->ReturnInstruction(result, ast_id);
|
| + ast_context()->ReturnInstruction(result, expr->id());
|
| return true;
|
| }
|
| break;
|
| @@ -9164,7 +9107,7 @@
|
| length_checker.End();
|
| }
|
| result = ast_context()->IsEffect() ? graph()->GetConstant0() : Top();
|
| - Add<HSimulate>(ast_id, REMOVABLE_SIMULATE);
|
| + Add<HSimulate>(expr->id(), REMOVABLE_SIMULATE);
|
| if (!ast_context()->IsEffect()) Drop(1);
|
|
|
| ast_context()->ReturnValue(result);
|
| @@ -9217,7 +9160,7 @@
|
| STORE, NEVER_RETURN_HOLE, STORE_AND_GROW_NO_TRANSITION);
|
|
|
| if (!ast_context()->IsEffect()) Push(new_size);
|
| - Add<HSimulate>(ast_id, REMOVABLE_SIMULATE);
|
| + Add<HSimulate>(expr->id(), REMOVABLE_SIMULATE);
|
| if (!ast_context()->IsEffect()) Drop(1);
|
| }
|
|
|
| @@ -9331,7 +9274,7 @@
|
| if_lengthiszero.End();
|
| }
|
| result = ast_context()->IsEffect() ? graph()->GetConstant0() : Top();
|
| - Add<HSimulate>(ast_id, REMOVABLE_SIMULATE);
|
| + Add<HSimulate>(expr->id(), REMOVABLE_SIMULATE);
|
| if (!ast_context()->IsEffect()) Drop(1);
|
| ast_context()->ReturnValue(result);
|
| return true;
|
| @@ -9368,7 +9311,7 @@
|
| HValue* index = BuildArrayIndexOf(receiver, search_element, kind, mode);
|
|
|
| if (!ast_context()->IsEffect()) Push(index);
|
| - Add<HSimulate>(ast_id, REMOVABLE_SIMULATE);
|
| + Add<HSimulate>(expr->id(), REMOVABLE_SIMULATE);
|
| if (!ast_context()->IsEffect()) Drop(1);
|
| ast_context()->ReturnValue(index);
|
| return true;
|
| @@ -9565,7 +9508,7 @@
|
| HConstant::cast(function)->handle(isolate())->IsJSFunction()) {
|
| known_function =
|
| Handle<JSFunction>::cast(HConstant::cast(function)->handle(isolate()));
|
| - if (TryInlineBuiltinMethodCall(known_function, Handle<Map>(), expr->id(),
|
| + if (TryInlineBuiltinMethodCall(expr, known_function, Handle<Map>(),
|
| args_count_no_receiver)) {
|
| if (FLAG_trace_inlining) {
|
| PrintF("Inlining builtin ");
|
| @@ -9966,7 +9909,7 @@
|
| CHECK_ALIVE(VisitExpressions(expr->arguments()));
|
|
|
| Handle<Map> map = maps->length() == 1 ? maps->first() : Handle<Map>();
|
| - if (TryInlineBuiltinMethodCall(known_function, map, expr->id(),
|
| + if (TryInlineBuiltinMethodCall(expr, known_function, map,
|
| expr->arguments()->length())) {
|
| if (FLAG_trace_inlining) {
|
| PrintF("Inlining builtin ");
|
|
|