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 "); |