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

Side by Side Diff: src/compiler/instruction-selector.cc

Issue 1709583002: [turbofan] Fixing ES6 tail calls in Turbofan. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Addressing comments Created 4 years, 10 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
« no previous file with comments | « no previous file | test/mjsunit/es6/tail-call.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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/compiler/instruction-selector.h" 5 #include "src/compiler/instruction-selector.h"
6 6
7 #include <limits> 7 #include <limits>
8 8
9 #include "src/base/adapters.h" 9 #include "src/base/adapters.h"
10 #include "src/compiler/instruction-selector-impl.h" 10 #include "src/compiler/instruction-selector-impl.h"
(...skipping 560 matching lines...) Expand 10 before | Expand all | Expand 10 after
571 } 571 }
572 DCHECK_EQ(1u, buffer->instruction_args.size()); 572 DCHECK_EQ(1u, buffer->instruction_args.size());
573 573
574 // If the call needs a frame state, we insert the state information as 574 // If the call needs a frame state, we insert the state information as
575 // follows (n is the number of value inputs to the frame state): 575 // follows (n is the number of value inputs to the frame state):
576 // arg 1 : deoptimization id. 576 // arg 1 : deoptimization id.
577 // arg 2 - arg (n + 1) : value inputs to the frame state. 577 // arg 2 - arg (n + 1) : value inputs to the frame state.
578 size_t frame_state_entries = 0; 578 size_t frame_state_entries = 0;
579 USE(frame_state_entries); // frame_state_entries is only used for debug. 579 USE(frame_state_entries); // frame_state_entries is only used for debug.
580 if (buffer->frame_state_descriptor != nullptr) { 580 if (buffer->frame_state_descriptor != nullptr) {
581 Node* frame_state =
582 call->InputAt(static_cast<int>(buffer->descriptor->InputCount()));
583
584 // If it was a syntactic tail call we need to drop the current frame and
585 // an arguments adaptor frame on top of it (if the latter is present).
586 if (buffer->descriptor->SupportsTailCalls()) {
587 frame_state = NodeProperties::GetFrameStateInput(frame_state, 0);
588 buffer->frame_state_descriptor =
589 buffer->frame_state_descriptor->outer_state();
590
591 if (buffer->frame_state_descriptor != nullptr &&
592 buffer->frame_state_descriptor->type() ==
593 FrameStateType::kArgumentsAdaptor) {
594 frame_state = NodeProperties::GetFrameStateInput(frame_state, 0);
595 buffer->frame_state_descriptor =
596 buffer->frame_state_descriptor->outer_state();
597 }
598 }
599
581 InstructionSequence::StateId state_id = 600 InstructionSequence::StateId state_id =
582 sequence()->AddFrameStateDescriptor(buffer->frame_state_descriptor); 601 sequence()->AddFrameStateDescriptor(buffer->frame_state_descriptor);
583 buffer->instruction_args.push_back(g.TempImmediate(state_id.ToInt())); 602 buffer->instruction_args.push_back(g.TempImmediate(state_id.ToInt()));
584 603
585 Node* frame_state =
586 call->InputAt(static_cast<int>(buffer->descriptor->InputCount()));
587
588 StateObjectDeduplicator deduplicator(instruction_zone()); 604 StateObjectDeduplicator deduplicator(instruction_zone());
589 605
590 frame_state_entries = 606 frame_state_entries =
591 1 + AddInputsToFrameStateDescriptor( 607 1 + AddInputsToFrameStateDescriptor(
592 buffer->frame_state_descriptor, frame_state, &g, &deduplicator, 608 buffer->frame_state_descriptor, frame_state, &g, &deduplicator,
593 &buffer->instruction_args, FrameStateInputKind::kStackSlot, 609 &buffer->instruction_args, FrameStateInputKind::kStackSlot,
594 instruction_zone()); 610 instruction_zone());
595 611
596 DCHECK_EQ(1 + frame_state_entries, buffer->instruction_args.size()); 612 DCHECK_EQ(1 + frame_state_entries, buffer->instruction_args.size());
597 } 613 }
(...skipping 1051 matching lines...) Expand 10 before | Expand all | Expand 10 after
1649 return new (instruction_zone()) FrameStateDescriptor( 1665 return new (instruction_zone()) FrameStateDescriptor(
1650 instruction_zone(), state_info.type(), state_info.bailout_id(), 1666 instruction_zone(), state_info.type(), state_info.bailout_id(),
1651 state_info.state_combine(), parameters, locals, stack, 1667 state_info.state_combine(), parameters, locals, stack,
1652 state_info.shared_info(), outer_state); 1668 state_info.shared_info(), outer_state);
1653 } 1669 }
1654 1670
1655 1671
1656 } // namespace compiler 1672 } // namespace compiler
1657 } // namespace internal 1673 } // namespace internal
1658 } // namespace v8 1674 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | test/mjsunit/es6/tail-call.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698