| Index: src/compiler/instruction-selector.cc
|
| diff --git a/src/compiler/instruction-selector.cc b/src/compiler/instruction-selector.cc
|
| index c170a01d4a2bebbfe51e246254c2d86600c96ce2..2d0b2bd8af18c44af2b4691d306ee2ed42713045 100644
|
| --- a/src/compiler/instruction-selector.cc
|
| +++ b/src/compiler/instruction-selector.cc
|
| @@ -485,34 +485,34 @@ void InstructionSelector::VisitBlock(BasicBlock* block) {
|
| }
|
|
|
|
|
| -namespace {
|
| -
|
| -V8_INLINE void CheckNoPhis(const BasicBlock* block) {
|
| +void InstructionSelector::VisitControl(BasicBlock* block) {
|
| #ifdef DEBUG
|
| - // Branch targets should not have phis.
|
| - for (BasicBlock::const_iterator i = block->begin(); i != block->end(); ++i) {
|
| - const Node* node = *i;
|
| - CHECK_NE(IrOpcode::kPhi, node->opcode());
|
| + // SSA deconstruction requires targets of branches not to have phis.
|
| + // Edge split form guarantees this property, but is more strict.
|
| + if (block->SuccessorCount() > 1) {
|
| + for (BasicBlock* const successor : block->successors()) {
|
| + for (Node* const node : *successor) {
|
| + CHECK(!IrOpcode::IsPhiOpcode(node->opcode()));
|
| + }
|
| + }
|
| }
|
| #endif
|
| -}
|
|
|
| -} // namespace
|
| -
|
| -
|
| -void InstructionSelector::VisitControl(BasicBlock* block) {
|
| Node* input = block->control_input();
|
| switch (block->control()) {
|
| case BasicBlock::kGoto:
|
| return VisitGoto(block->SuccessorAt(0));
|
| + case BasicBlock::kCall: {
|
| + DCHECK_EQ(IrOpcode::kCall, input->opcode());
|
| + BasicBlock* success = block->SuccessorAt(0);
|
| + // TODO(mstarzinger): Record location of {exception} in {handler_table}.
|
| + // BasicBlock* exception = block->SuccessorAt(1);
|
| + return VisitCall(input), VisitGoto(success);
|
| + }
|
| case BasicBlock::kBranch: {
|
| DCHECK_EQ(IrOpcode::kBranch, input->opcode());
|
| BasicBlock* tbranch = block->SuccessorAt(0);
|
| BasicBlock* fbranch = block->SuccessorAt(1);
|
| - // SSA deconstruction requires targets of branches not to have phis.
|
| - // Edge split form guarantees this property, but is more strict.
|
| - CheckNoPhis(tbranch);
|
| - CheckNoPhis(fbranch);
|
| if (tbranch == fbranch) return VisitGoto(tbranch);
|
| // Treat special Branch(Always, IfTrue, IfFalse) as Goto(IfTrue).
|
| Node* const condition = input->InputAt(0);
|
| @@ -524,9 +524,6 @@ void InstructionSelector::VisitControl(BasicBlock* block) {
|
| // Last successor must be Default.
|
| BasicBlock* default_branch = block->successors().back();
|
| DCHECK_EQ(IrOpcode::kIfDefault, default_branch->front()->opcode());
|
| - // SSA deconstruction requires targets of branches not to have phis.
|
| - // Edge split form guarantees this property, but is more strict.
|
| - CheckNoPhis(default_branch);
|
| // All other successors must be cases.
|
| size_t case_count = block->SuccessorCount() - 1;
|
| DCHECK_LE(1u, case_count);
|
| @@ -541,9 +538,6 @@ void InstructionSelector::VisitControl(BasicBlock* block) {
|
| case_values[index] = value;
|
| if (min_value > value) min_value = value;
|
| if (max_value < value) max_value = value;
|
| - // SSA deconstruction requires targets of branches not to have phis.
|
| - // Edge split form guarantees this property, but is more strict.
|
| - CheckNoPhis(branch);
|
| }
|
| DCHECK_LE(min_value, max_value);
|
| return VisitSwitch(input, default_branch, case_branches, case_values,
|
| @@ -721,6 +715,8 @@ void InstructionSelector::VisitNode(Node* node) {
|
| case IrOpcode::kBranch:
|
| case IrOpcode::kIfTrue:
|
| case IrOpcode::kIfFalse:
|
| + case IrOpcode::kIfSuccess:
|
| + case IrOpcode::kIfException:
|
| case IrOpcode::kSwitch:
|
| case IrOpcode::kIfValue:
|
| case IrOpcode::kIfDefault:
|
|
|