| Index: src/interpreter/bytecode-peephole-optimizer.cc
|
| diff --git a/src/interpreter/bytecode-peephole-optimizer.cc b/src/interpreter/bytecode-peephole-optimizer.cc
|
| index dfc40a2c194ec18892d52215c645ea5cda3d38da..887f9ce9737525c9e12231d4f1dcfac796cb7016 100644
|
| --- a/src/interpreter/bytecode-peephole-optimizer.cc
|
| +++ b/src/interpreter/bytecode-peephole-optimizer.cc
|
| @@ -13,7 +13,8 @@ namespace interpreter {
|
|
|
| BytecodePeepholeOptimizer::BytecodePeepholeOptimizer(
|
| BytecodePipelineStage* next_stage)
|
| - : next_stage_(next_stage), last_(Bytecode::kIllegal, BytecodeSourceInfo()) {
|
| + : next_stage_(next_stage),
|
| + last_(BytecodeNode::Illegal(BytecodeSourceInfo())) {
|
| InvalidateLast();
|
| }
|
|
|
| @@ -65,7 +66,7 @@ void BytecodePeepholeOptimizer::Flush() {
|
| }
|
|
|
| void BytecodePeepholeOptimizer::InvalidateLast() {
|
| - last_.set_bytecode(Bytecode::kIllegal);
|
| + last_ = BytecodeNode::Illegal(BytecodeSourceInfo());
|
| }
|
|
|
| bool BytecodePeepholeOptimizer::LastIsValid() const {
|
| @@ -116,37 +117,41 @@ bool BytecodePeepholeOptimizer::CanElideLastBasedOnSourcePosition(
|
|
|
| namespace {
|
|
|
| -void TransformLdaSmiBinaryOpToBinaryOpWithSmi(Bytecode new_bytecode,
|
| - BytecodeNode* const last,
|
| - BytecodeNode* const current) {
|
| +BytecodeNode TransformLdaSmiBinaryOpToBinaryOpWithSmi(
|
| + Bytecode new_bytecode, BytecodeNode* const last,
|
| + BytecodeNode* const current) {
|
| DCHECK_EQ(last->bytecode(), Bytecode::kLdaSmi);
|
| - current->set_bytecode(new_bytecode, last->operand(0), current->operand(0),
|
| - current->operand(1));
|
| + BytecodeNode node(new_bytecode, last->operand(0), current->operand(0),
|
| + current->operand(1), current->source_info());
|
| if (last->source_info().is_valid()) {
|
| - current->set_source_info(last->source_info());
|
| + node.set_source_info(last->source_info());
|
| }
|
| + return node;
|
| }
|
|
|
| -void TransformLdaZeroBinaryOpToBinaryOpWithZero(Bytecode new_bytecode,
|
| - BytecodeNode* const last,
|
| - BytecodeNode* const current) {
|
| +BytecodeNode TransformLdaZeroBinaryOpToBinaryOpWithZero(
|
| + Bytecode new_bytecode, BytecodeNode* const last,
|
| + BytecodeNode* const current) {
|
| DCHECK_EQ(last->bytecode(), Bytecode::kLdaZero);
|
| - current->set_bytecode(new_bytecode, 0, current->operand(0),
|
| - current->operand(1));
|
| + BytecodeNode node(new_bytecode, 0, current->operand(0), current->operand(1),
|
| + current->source_info());
|
| if (last->source_info().is_valid()) {
|
| - current->set_source_info(last->source_info());
|
| + node.set_source_info(last->source_info());
|
| }
|
| + return node;
|
| }
|
|
|
| -void TransformEqualityWithNullOrUndefinedToTestUndetectable(
|
| +BytecodeNode TransformEqualityWithNullOrUndefinedToTestUndetectable(
|
| BytecodeNode* const last, BytecodeNode* const current) {
|
| DCHECK((last->bytecode() == Bytecode::kLdaNull) ||
|
| (last->bytecode() == Bytecode::kLdaUndefined));
|
| DCHECK_EQ(current->bytecode(), Bytecode::kTestEqual);
|
| - current->set_bytecode(Bytecode::kTestUndetectable, current->operand(0));
|
| + BytecodeNode node(BytecodeNode::TestUndetectable(current->source_info(),
|
| + current->operand(0)));
|
| if (last->source_info().is_valid()) {
|
| - current->set_source_info(last->source_info());
|
| + node.set_source_info(last->source_info());
|
| }
|
| + return node;
|
| }
|
|
|
| } // namespace
|
| @@ -186,8 +191,8 @@ void BytecodePeepholeOptimizer::ElideCurrentAction(
|
| if (node->source_info().is_valid()) {
|
| // Preserve the source information by replacing the node bytecode
|
| // with a no op bytecode.
|
| - node->set_bytecode(Bytecode::kNop);
|
| - DefaultAction(node);
|
| + BytecodeNode new_node(BytecodeNode::Nop(node->source_info()));
|
| + DefaultAction(&new_node);
|
| } else {
|
| // Nothing to do, keep last and wait for next bytecode to pair with it.
|
| }
|
| @@ -239,9 +244,9 @@ void BytecodePeepholeOptimizer::TransformLdaSmiBinaryOpToBinaryOpWithSmiAction(
|
|
|
| if (!node->source_info().is_valid() || !last()->source_info().is_valid()) {
|
| // Fused last and current into current.
|
| - TransformLdaSmiBinaryOpToBinaryOpWithSmi(action_data->bytecode, last(),
|
| - node);
|
| - SetLast(node);
|
| + BytecodeNode new_node(TransformLdaSmiBinaryOpToBinaryOpWithSmi(
|
| + action_data->bytecode, last(), node));
|
| + SetLast(&new_node);
|
| } else {
|
| DefaultAction(node);
|
| }
|
| @@ -254,9 +259,9 @@ void BytecodePeepholeOptimizer::
|
| DCHECK(!Bytecodes::IsJump(node->bytecode()));
|
| if (!node->source_info().is_valid() || !last()->source_info().is_valid()) {
|
| // Fused last and current into current.
|
| - TransformLdaZeroBinaryOpToBinaryOpWithZero(action_data->bytecode, last(),
|
| - node);
|
| - SetLast(node);
|
| + BytecodeNode new_node(TransformLdaZeroBinaryOpToBinaryOpWithZero(
|
| + action_data->bytecode, last(), node));
|
| + SetLast(&new_node);
|
| } else {
|
| DefaultAction(node);
|
| }
|
| @@ -268,8 +273,9 @@ void BytecodePeepholeOptimizer::
|
| DCHECK(LastIsValid());
|
| DCHECK(!Bytecodes::IsJump(node->bytecode()));
|
| // Fused last and current into current.
|
| - TransformEqualityWithNullOrUndefinedToTestUndetectable(last(), node);
|
| - SetLast(node);
|
| + BytecodeNode new_node(
|
| + TransformEqualityWithNullOrUndefinedToTestUndetectable(last(), node));
|
| + SetLast(&new_node);
|
| }
|
|
|
| void BytecodePeepholeOptimizer::DefaultJumpAction(
|
| @@ -294,7 +300,7 @@ void BytecodePeepholeOptimizer::ChangeJumpBytecodeAction(
|
|
|
| next_stage()->Write(last());
|
| InvalidateLast();
|
| - node->set_bytecode(action_data->bytecode, node->operand(0));
|
| + node->replace_bytecode(action_data->bytecode);
|
| }
|
|
|
| void BytecodePeepholeOptimizer::ElideLastBeforeJumpAction(
|
|
|