OLD | NEW |
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 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/interpreter/bytecode-peephole-optimizer.h" | 5 #include "src/interpreter/bytecode-peephole-optimizer.h" |
6 | 6 |
7 #include "src/objects-inl.h" | 7 #include "src/objects-inl.h" |
8 #include "src/objects.h" | 8 #include "src/objects.h" |
9 | 9 |
10 namespace v8 { | 10 namespace v8 { |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
109 // default, the upstream bytecode generator filters out unneeded | 109 // default, the upstream bytecode generator filters out unneeded |
110 // expression position information so there is neglible benefit to | 110 // expression position information so there is neglible benefit to |
111 // handling MAYBE specially. Hence MAYBE is treated the same as NO. | 111 // handling MAYBE specially. Hence MAYBE is treated the same as NO. |
112 // | 112 // |
113 return (!last_.source_info().is_valid() || | 113 return (!last_.source_info().is_valid() || |
114 !current->source_info().is_valid()); | 114 !current->source_info().is_valid()); |
115 } | 115 } |
116 | 116 |
117 namespace { | 117 namespace { |
118 | 118 |
119 void TransformLdaStarToLdrLdar(Bytecode new_bytecode, BytecodeNode* const last, | |
120 BytecodeNode* const current) { | |
121 DCHECK_EQ(current->bytecode(), Bytecode::kStar); | |
122 | |
123 // | |
124 // An example transformation here would be: | |
125 // | |
126 // LdaGlobal i0, i1 ____\ LdrGlobal i0, i1, R | |
127 // Star R ====/ Ldar R | |
128 // | |
129 // which loads a global value into both a register and the | |
130 // accumulator. However, in the second form the Ldar can often be | |
131 // peephole optimized away unlike the Star in the first form. | |
132 // | |
133 last->Transform(new_bytecode, current->operand(0)); | |
134 current->set_bytecode(Bytecode::kLdar, current->operand(0)); | |
135 } | |
136 | |
137 void TransformLdaSmiBinaryOpToBinaryOpWithSmi(Bytecode new_bytecode, | 119 void TransformLdaSmiBinaryOpToBinaryOpWithSmi(Bytecode new_bytecode, |
138 BytecodeNode* const last, | 120 BytecodeNode* const last, |
139 BytecodeNode* const current) { | 121 BytecodeNode* const current) { |
140 DCHECK_EQ(last->bytecode(), Bytecode::kLdaSmi); | 122 DCHECK_EQ(last->bytecode(), Bytecode::kLdaSmi); |
141 current->set_bytecode(new_bytecode, last->operand(0), current->operand(0), | 123 current->set_bytecode(new_bytecode, last->operand(0), current->operand(0), |
142 current->operand(1)); | 124 current->operand(1)); |
143 if (last->source_info().is_valid()) { | 125 if (last->source_info().is_valid()) { |
144 current->set_source_info(last->source_info()); | 126 current->set_source_info(last->source_info()); |
145 } | 127 } |
146 } | 128 } |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
232 | 214 |
233 void BytecodePeepholeOptimizer::ChangeBytecodeAction( | 215 void BytecodePeepholeOptimizer::ChangeBytecodeAction( |
234 BytecodeNode* const node, const PeepholeActionAndData* action_data) { | 216 BytecodeNode* const node, const PeepholeActionAndData* action_data) { |
235 DCHECK(LastIsValid()); | 217 DCHECK(LastIsValid()); |
236 DCHECK(!Bytecodes::IsJump(node->bytecode())); | 218 DCHECK(!Bytecodes::IsJump(node->bytecode())); |
237 | 219 |
238 node->replace_bytecode(action_data->bytecode); | 220 node->replace_bytecode(action_data->bytecode); |
239 DefaultAction(node); | 221 DefaultAction(node); |
240 } | 222 } |
241 | 223 |
242 void BytecodePeepholeOptimizer::TransformLdaStarToLdrLdarAction( | |
243 BytecodeNode* const node, const PeepholeActionAndData* action_data) { | |
244 DCHECK(LastIsValid()); | |
245 DCHECK(!Bytecodes::IsJump(node->bytecode())); | |
246 | |
247 if (!node->source_info().is_statement()) { | |
248 TransformLdaStarToLdrLdar(action_data->bytecode, last(), node); | |
249 } | |
250 DefaultAction(node); | |
251 } | |
252 | |
253 void BytecodePeepholeOptimizer::TransformLdaSmiBinaryOpToBinaryOpWithSmiAction( | 224 void BytecodePeepholeOptimizer::TransformLdaSmiBinaryOpToBinaryOpWithSmiAction( |
254 BytecodeNode* const node, const PeepholeActionAndData* action_data) { | 225 BytecodeNode* const node, const PeepholeActionAndData* action_data) { |
255 DCHECK(LastIsValid()); | 226 DCHECK(LastIsValid()); |
256 DCHECK(!Bytecodes::IsJump(node->bytecode())); | 227 DCHECK(!Bytecodes::IsJump(node->bytecode())); |
257 | 228 |
258 if (!node->source_info().is_valid() || !last()->source_info().is_valid()) { | 229 if (!node->source_info().is_valid() || !last()->source_info().is_valid()) { |
259 // Fused last and current into current. | 230 // Fused last and current into current. |
260 TransformLdaSmiBinaryOpToBinaryOpWithSmi(action_data->bytecode, last(), | 231 TransformLdaSmiBinaryOpToBinaryOpWithSmi(action_data->bytecode, last(), |
261 node); | 232 node); |
262 SetLast(node); | 233 SetLast(node); |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
335 #undef CASE | 306 #undef CASE |
336 default: | 307 default: |
337 UNREACHABLE(); | 308 UNREACHABLE(); |
338 break; | 309 break; |
339 } | 310 } |
340 } | 311 } |
341 | 312 |
342 } // namespace interpreter | 313 } // namespace interpreter |
343 } // namespace internal | 314 } // namespace internal |
344 } // namespace v8 | 315 } // namespace v8 |
OLD | NEW |