Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(292)

Side by Side Diff: src/crankshaft/hydrogen.cc

Issue 1811693002: [crankshaft] Fix inlining to always connect both branches of test context. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/crankshaft/hydrogen.h" 5 #include "src/crankshaft/hydrogen.h"
6 6
7 #include <sstream> 7 #include <sstream>
8 8
9 #include "src/allocation-site-scopes.h" 9 #include "src/allocation-site-scopes.h"
10 #include "src/ast/ast-numbering.h" 10 #include "src/ast/ast-numbering.h"
(...skipping 4906 matching lines...) Expand 10 before | Expand all | Expand 10 after
4917 if (context == NULL) { 4917 if (context == NULL) {
4918 // Not an inlined return, so an actual one. 4918 // Not an inlined return, so an actual one.
4919 CHECK_ALIVE(VisitForValue(stmt->expression())); 4919 CHECK_ALIVE(VisitForValue(stmt->expression()));
4920 HValue* result = environment()->Pop(); 4920 HValue* result = environment()->Pop();
4921 Add<HReturn>(result); 4921 Add<HReturn>(result);
4922 } else if (state->inlining_kind() == CONSTRUCT_CALL_RETURN) { 4922 } else if (state->inlining_kind() == CONSTRUCT_CALL_RETURN) {
4923 // Return from an inlined construct call. In a test context the return value 4923 // Return from an inlined construct call. In a test context the return value
4924 // will always evaluate to true, in a value context the return value needs 4924 // will always evaluate to true, in a value context the return value needs
4925 // to be a JSObject. 4925 // to be a JSObject.
4926 if (context->IsTest()) { 4926 if (context->IsTest()) {
4927 TestContext* test = TestContext::cast(context);
4928 CHECK_ALIVE(VisitForEffect(stmt->expression())); 4927 CHECK_ALIVE(VisitForEffect(stmt->expression()));
4929 Goto(test->if_true(), state); 4928 context->ReturnValue(graph()->GetConstantTrue());
4930 } else if (context->IsEffect()) { 4929 } else if (context->IsEffect()) {
4931 CHECK_ALIVE(VisitForEffect(stmt->expression())); 4930 CHECK_ALIVE(VisitForEffect(stmt->expression()));
4932 Goto(function_return(), state); 4931 Goto(function_return(), state);
4933 } else { 4932 } else {
4934 DCHECK(context->IsValue()); 4933 DCHECK(context->IsValue());
4935 CHECK_ALIVE(VisitForValue(stmt->expression())); 4934 CHECK_ALIVE(VisitForValue(stmt->expression()));
4936 HValue* return_value = Pop(); 4935 HValue* return_value = Pop();
4937 HValue* receiver = environment()->arguments_environment()->Lookup(0); 4936 HValue* receiver = environment()->arguments_environment()->Lookup(0);
4938 HHasInstanceTypeAndBranch* typecheck = 4937 HHasInstanceTypeAndBranch* typecheck =
4939 New<HHasInstanceTypeAndBranch>(return_value, 4938 New<HHasInstanceTypeAndBranch>(return_value,
(...skipping 3617 matching lines...) Expand 10 before | Expand all | Expand 10 after
8557 8556
8558 TraceInline(target, caller, NULL, syntactic_tail_call_mode); 8557 TraceInline(target, caller, NULL, syntactic_tail_call_mode);
8559 8558
8560 if (current_block() != NULL) { 8559 if (current_block() != NULL) {
8561 FunctionState* state = function_state(); 8560 FunctionState* state = function_state();
8562 if (state->inlining_kind() == CONSTRUCT_CALL_RETURN) { 8561 if (state->inlining_kind() == CONSTRUCT_CALL_RETURN) {
8563 // Falling off the end of an inlined construct call. In a test context the 8562 // Falling off the end of an inlined construct call. In a test context the
8564 // return value will always evaluate to true, in a value context the 8563 // return value will always evaluate to true, in a value context the
8565 // return value is the newly allocated receiver. 8564 // return value is the newly allocated receiver.
8566 if (call_context()->IsTest()) { 8565 if (call_context()->IsTest()) {
8567 Goto(inlined_test_context()->if_true(), state); 8566 inlined_test_context()->ReturnValue(graph()->GetConstantTrue());
8568 } else if (call_context()->IsEffect()) { 8567 } else if (call_context()->IsEffect()) {
8569 Goto(function_return(), state); 8568 Goto(function_return(), state);
8570 } else { 8569 } else {
8571 DCHECK(call_context()->IsValue()); 8570 DCHECK(call_context()->IsValue());
8572 AddLeaveInlined(implicit_return_value, state); 8571 AddLeaveInlined(implicit_return_value, state);
8573 } 8572 }
8574 } else if (state->inlining_kind() == SETTER_CALL_RETURN) { 8573 } else if (state->inlining_kind() == SETTER_CALL_RETURN) {
8575 // Falling off the end of an inlined setter call. The returned value is 8574 // Falling off the end of an inlined setter call. The returned value is
8576 // never used, the value of an assignment is always the value of the RHS 8575 // never used, the value of an assignment is always the value of the RHS
8577 // of the assignment. 8576 // of the assignment.
8578 if (call_context()->IsTest()) { 8577 if (call_context()->IsTest()) {
8579 inlined_test_context()->ReturnValue(implicit_return_value); 8578 inlined_test_context()->ReturnValue(implicit_return_value);
8580 } else if (call_context()->IsEffect()) { 8579 } else if (call_context()->IsEffect()) {
8581 Goto(function_return(), state); 8580 Goto(function_return(), state);
8582 } else { 8581 } else {
8583 DCHECK(call_context()->IsValue()); 8582 DCHECK(call_context()->IsValue());
8584 AddLeaveInlined(implicit_return_value, state); 8583 AddLeaveInlined(implicit_return_value, state);
8585 } 8584 }
8586 } else { 8585 } else {
8587 // Falling off the end of a normal inlined function. This basically means 8586 // Falling off the end of a normal inlined function. This basically means
8588 // returning undefined. 8587 // returning undefined.
8589 if (call_context()->IsTest()) { 8588 if (call_context()->IsTest()) {
8590 Goto(inlined_test_context()->if_false(), state); 8589 inlined_test_context()->ReturnValue(graph()->GetConstantFalse());
8591 } else if (call_context()->IsEffect()) { 8590 } else if (call_context()->IsEffect()) {
8592 Goto(function_return(), state); 8591 Goto(function_return(), state);
8593 } else { 8592 } else {
8594 DCHECK(call_context()->IsValue()); 8593 DCHECK(call_context()->IsValue());
8595 AddLeaveInlined(undefined, state); 8594 AddLeaveInlined(undefined, state);
8596 } 8595 }
8597 } 8596 }
8598 } 8597 }
8599 8598
8600 // Fix up the function exits. 8599 // Fix up the function exits.
(...skipping 4894 matching lines...) Expand 10 before | Expand all | Expand 10 after
13495 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); 13494 isolate()->GetHTracer()->TraceHydrogen(name(), graph_);
13496 } 13495 }
13497 13496
13498 #ifdef DEBUG 13497 #ifdef DEBUG
13499 graph_->Verify(false); // No full verify. 13498 graph_->Verify(false); // No full verify.
13500 #endif 13499 #endif
13501 } 13500 }
13502 13501
13503 } // namespace internal 13502 } // namespace internal
13504 } // namespace v8 13503 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | test/mjsunit/regress/regress-v8-4839.js » ('j') | test/mjsunit/regress/regress-v8-4839.js » ('J')

Powered by Google App Engine
This is Rietveld 408576698