OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/js-intrinsic-lowering.h" | 5 #include "src/compiler/js-intrinsic-lowering.h" |
6 | 6 |
7 #include <stack> | 7 #include <stack> |
8 | 8 |
9 #include "src/compiler/access-builder.h" | 9 #include "src/compiler/access-builder.h" |
10 #include "src/compiler/js-graph.h" | 10 #include "src/compiler/js-graph.h" |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
142 if (mode() != kDeoptimizationEnabled) return NoChange(); | 142 if (mode() != kDeoptimizationEnabled) return NoChange(); |
143 Node* const frame_state = NodeProperties::GetFrameStateInput(node, 0); | 143 Node* const frame_state = NodeProperties::GetFrameStateInput(node, 0); |
144 Node* const effect = NodeProperties::GetEffectInput(node); | 144 Node* const effect = NodeProperties::GetEffectInput(node); |
145 Node* const control = NodeProperties::GetControlInput(node); | 145 Node* const control = NodeProperties::GetControlInput(node); |
146 | 146 |
147 // TODO(bmeurer): Move MergeControlToEnd() to the AdvancedReducer. | 147 // TODO(bmeurer): Move MergeControlToEnd() to the AdvancedReducer. |
148 Node* deoptimize = | 148 Node* deoptimize = |
149 graph()->NewNode(common()->Deoptimize(), frame_state, effect, control); | 149 graph()->NewNode(common()->Deoptimize(), frame_state, effect, control); |
150 NodeProperties::MergeControlToEnd(graph(), common(), deoptimize); | 150 NodeProperties::MergeControlToEnd(graph(), common(), deoptimize); |
151 | 151 |
152 node->set_op(common()->Dead()); | |
153 node->TrimInputCount(0); | 152 node->TrimInputCount(0); |
| 153 NodeProperties::ChangeOp(node, common()->Dead()); |
154 return Changed(node); | 154 return Changed(node); |
155 } | 155 } |
156 | 156 |
157 | 157 |
158 Reduction JSIntrinsicLowering::ReduceDoubleHi(Node* node) { | 158 Reduction JSIntrinsicLowering::ReduceDoubleHi(Node* node) { |
159 return Change(node, machine()->Float64ExtractHighWord32()); | 159 return Change(node, machine()->Float64ExtractHighWord32()); |
160 } | 160 } |
161 | 161 |
162 | 162 |
163 Reduction JSIntrinsicLowering::ReduceDoubleLo(Node* node) { | 163 Reduction JSIntrinsicLowering::ReduceDoubleLo(Node* node) { |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
276 | 276 |
277 Reduction JSIntrinsicLowering::ReduceMathSqrt(Node* node) { | 277 Reduction JSIntrinsicLowering::ReduceMathSqrt(Node* node) { |
278 return Change(node, machine()->Float64Sqrt()); | 278 return Change(node, machine()->Float64Sqrt()); |
279 } | 279 } |
280 | 280 |
281 | 281 |
282 Reduction JSIntrinsicLowering::ReduceSeqStringGetChar( | 282 Reduction JSIntrinsicLowering::ReduceSeqStringGetChar( |
283 Node* node, String::Encoding encoding) { | 283 Node* node, String::Encoding encoding) { |
284 Node* effect = NodeProperties::GetEffectInput(node); | 284 Node* effect = NodeProperties::GetEffectInput(node); |
285 Node* control = NodeProperties::GetControlInput(node); | 285 Node* control = NodeProperties::GetControlInput(node); |
286 node->set_op( | |
287 simplified()->LoadElement(AccessBuilder::ForSeqStringChar(encoding))); | |
288 node->ReplaceInput(2, effect); | 286 node->ReplaceInput(2, effect); |
289 node->ReplaceInput(3, control); | 287 node->ReplaceInput(3, control); |
290 node->TrimInputCount(4); | 288 node->TrimInputCount(4); |
| 289 NodeProperties::ChangeOp( |
| 290 node, |
| 291 simplified()->LoadElement(AccessBuilder::ForSeqStringChar(encoding))); |
291 RelaxControls(node); | 292 RelaxControls(node); |
292 return Changed(node); | 293 return Changed(node); |
293 } | 294 } |
294 | 295 |
295 | 296 |
296 Reduction JSIntrinsicLowering::ReduceSeqStringSetChar( | 297 Reduction JSIntrinsicLowering::ReduceSeqStringSetChar( |
297 Node* node, String::Encoding encoding) { | 298 Node* node, String::Encoding encoding) { |
298 // Note: The intrinsic has a strange argument order, so we need to reshuffle. | 299 // Note: The intrinsic has a strange argument order, so we need to reshuffle. |
299 Node* index = NodeProperties::GetValueInput(node, 0); | 300 Node* index = NodeProperties::GetValueInput(node, 0); |
300 Node* chr = NodeProperties::GetValueInput(node, 1); | 301 Node* chr = NodeProperties::GetValueInput(node, 1); |
301 Node* string = NodeProperties::GetValueInput(node, 2); | 302 Node* string = NodeProperties::GetValueInput(node, 2); |
302 Node* effect = NodeProperties::GetEffectInput(node); | 303 Node* effect = NodeProperties::GetEffectInput(node); |
303 Node* control = NodeProperties::GetControlInput(node); | 304 Node* control = NodeProperties::GetControlInput(node); |
304 node->set_op( | |
305 simplified()->StoreElement(AccessBuilder::ForSeqStringChar(encoding))); | |
306 node->ReplaceInput(0, string); | 305 node->ReplaceInput(0, string); |
307 node->ReplaceInput(1, index); | 306 node->ReplaceInput(1, index); |
308 node->ReplaceInput(2, chr); | 307 node->ReplaceInput(2, chr); |
309 node->ReplaceInput(3, effect); | 308 node->ReplaceInput(3, effect); |
310 node->ReplaceInput(4, control); | 309 node->ReplaceInput(4, control); |
311 node->TrimInputCount(5); | 310 node->TrimInputCount(5); |
| 311 NodeProperties::ChangeOp( |
| 312 node, |
| 313 simplified()->StoreElement(AccessBuilder::ForSeqStringChar(encoding))); |
312 NodeProperties::RemoveType(node); | 314 NodeProperties::RemoveType(node); |
313 ReplaceWithValue(node, string, node); | 315 ReplaceWithValue(node, string, node); |
314 return Changed(node); | 316 return Changed(node); |
315 } | 317 } |
316 | 318 |
317 | 319 |
318 Reduction JSIntrinsicLowering::ReduceStringGetLength(Node* node) { | 320 Reduction JSIntrinsicLowering::ReduceStringGetLength(Node* node) { |
319 Node* value = NodeProperties::GetValueInput(node, 0); | 321 Node* value = NodeProperties::GetValueInput(node, 0); |
320 Node* effect = NodeProperties::GetEffectInput(node); | 322 Node* effect = NodeProperties::GetEffectInput(node); |
321 Node* control = NodeProperties::GetControlInput(node); | 323 Node* control = NodeProperties::GetControlInput(node); |
322 return Change(node, simplified()->LoadField( | 324 return Change(node, simplified()->LoadField( |
323 AccessBuilder::ForStringLength(graph()->zone())), | 325 AccessBuilder::ForStringLength(graph()->zone())), |
324 value, effect, control); | 326 value, effect, control); |
325 } | 327 } |
326 | 328 |
327 | 329 |
328 Reduction JSIntrinsicLowering::ReduceUnLikely(Node* node, BranchHint hint) { | 330 Reduction JSIntrinsicLowering::ReduceUnLikely(Node* node, BranchHint hint) { |
329 std::stack<Node*> nodes_to_visit; | 331 std::stack<Node*> nodes_to_visit; |
330 nodes_to_visit.push(node); | 332 nodes_to_visit.push(node); |
331 while (!nodes_to_visit.empty()) { | 333 while (!nodes_to_visit.empty()) { |
332 Node* current = nodes_to_visit.top(); | 334 Node* current = nodes_to_visit.top(); |
333 nodes_to_visit.pop(); | 335 nodes_to_visit.pop(); |
334 for (Node* use : current->uses()) { | 336 for (Node* use : current->uses()) { |
335 if (use->opcode() == IrOpcode::kJSToBoolean) { | 337 if (use->opcode() == IrOpcode::kJSToBoolean) { |
336 // We have to "look through" ToBoolean calls. | 338 // We have to "look through" ToBoolean calls. |
337 nodes_to_visit.push(use); | 339 nodes_to_visit.push(use); |
338 } else if (use->opcode() == IrOpcode::kBranch) { | 340 } else if (use->opcode() == IrOpcode::kBranch) { |
339 // Actually set the hint on any branch using the intrinsic node. | 341 // Actually set the hint on any branch using the intrinsic node. |
340 use->set_op(common()->Branch(hint)); | 342 NodeProperties::ChangeOp(use, common()->Branch(hint)); |
341 } | 343 } |
342 } | 344 } |
343 } | 345 } |
344 // Apart from adding hints to branchs nodes, this is the identity function. | 346 // Apart from adding hints to branchs nodes, this is the identity function. |
345 Node* value = NodeProperties::GetValueInput(node, 0); | 347 Node* value = NodeProperties::GetValueInput(node, 0); |
346 ReplaceWithValue(node, value); | 348 ReplaceWithValue(node, value); |
347 return Changed(value); | 349 return Changed(value); |
348 } | 350 } |
349 | 351 |
350 | 352 |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
410 return Change(node, phi_op, vtrue0, vfalse0, merge0); | 412 return Change(node, phi_op, vtrue0, vfalse0, merge0); |
411 } | 413 } |
412 | 414 |
413 | 415 |
414 Reduction JSIntrinsicLowering::Change(Node* node, const Operator* op) { | 416 Reduction JSIntrinsicLowering::Change(Node* node, const Operator* op) { |
415 // Replace all effect uses of {node} with the effect dependency. | 417 // Replace all effect uses of {node} with the effect dependency. |
416 RelaxEffectsAndControls(node); | 418 RelaxEffectsAndControls(node); |
417 // Remove the inputs corresponding to context, effect and control. | 419 // Remove the inputs corresponding to context, effect and control. |
418 NodeProperties::RemoveNonValueInputs(node); | 420 NodeProperties::RemoveNonValueInputs(node); |
419 // Finally update the operator to the new one. | 421 // Finally update the operator to the new one. |
420 node->set_op(op); | 422 NodeProperties::ChangeOp(node, op); |
421 return Changed(node); | 423 return Changed(node); |
422 } | 424 } |
423 | 425 |
424 | 426 |
425 Reduction JSIntrinsicLowering::ReduceIsMinusZero(Node* node) { | 427 Reduction JSIntrinsicLowering::ReduceIsMinusZero(Node* node) { |
426 Node* value = NodeProperties::GetValueInput(node, 0); | 428 Node* value = NodeProperties::GetValueInput(node, 0); |
427 Node* effect = NodeProperties::GetEffectInput(node); | 429 Node* effect = NodeProperties::GetEffectInput(node); |
428 | 430 |
429 Node* double_lo = | 431 Node* double_lo = |
430 graph()->NewNode(machine()->Float64ExtractLowWord32(), value); | 432 graph()->NewNode(machine()->Float64ExtractLowWord32(), value); |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
512 if (mode() != kDeoptimizationEnabled) return NoChange(); | 514 if (mode() != kDeoptimizationEnabled) return NoChange(); |
513 Node* const frame_state = NodeProperties::GetFrameStateInput(node, 1); | 515 Node* const frame_state = NodeProperties::GetFrameStateInput(node, 1); |
514 Node* const effect = NodeProperties::GetEffectInput(node); | 516 Node* const effect = NodeProperties::GetEffectInput(node); |
515 Node* const control = NodeProperties::GetControlInput(node); | 517 Node* const control = NodeProperties::GetControlInput(node); |
516 | 518 |
517 // TODO(bmeurer): Move MergeControlToEnd() to the AdvancedReducer. | 519 // TODO(bmeurer): Move MergeControlToEnd() to the AdvancedReducer. |
518 Node* deoptimize = | 520 Node* deoptimize = |
519 graph()->NewNode(common()->Deoptimize(), frame_state, effect, control); | 521 graph()->NewNode(common()->Deoptimize(), frame_state, effect, control); |
520 NodeProperties::MergeControlToEnd(graph(), common(), deoptimize); | 522 NodeProperties::MergeControlToEnd(graph(), common(), deoptimize); |
521 | 523 |
522 node->set_op(common()->Dead()); | |
523 node->TrimInputCount(0); | 524 node->TrimInputCount(0); |
| 525 NodeProperties::ChangeOp(node, common()->Dead()); |
524 return Changed(node); | 526 return Changed(node); |
525 } | 527 } |
526 | 528 |
527 | 529 |
528 Reduction JSIntrinsicLowering::ReduceToObject(Node* node) { | 530 Reduction JSIntrinsicLowering::ReduceToObject(Node* node) { |
529 node->set_op(javascript()->ToObject()); | 531 NodeProperties::ChangeOp(node, javascript()->ToObject()); |
530 return Changed(node); | 532 return Changed(node); |
531 } | 533 } |
532 | 534 |
533 | 535 |
534 Reduction JSIntrinsicLowering::ReduceCallFunction(Node* node) { | 536 Reduction JSIntrinsicLowering::ReduceCallFunction(Node* node) { |
535 CallRuntimeParameters params = OpParameter<CallRuntimeParameters>(node->op()); | 537 CallRuntimeParameters params = OpParameter<CallRuntimeParameters>(node->op()); |
536 size_t arity = params.arity(); | 538 size_t arity = params.arity(); |
537 node->set_op(javascript()->CallFunction(arity, NO_CALL_FUNCTION_FLAGS, STRICT, | |
538 VectorSlotPair(), ALLOW_TAIL_CALLS)); | |
539 Node* function = node->InputAt(static_cast<int>(arity - 1)); | 539 Node* function = node->InputAt(static_cast<int>(arity - 1)); |
540 while (--arity != 0) { | 540 while (--arity != 0) { |
541 node->ReplaceInput(static_cast<int>(arity), | 541 node->ReplaceInput(static_cast<int>(arity), |
542 node->InputAt(static_cast<int>(arity - 1))); | 542 node->InputAt(static_cast<int>(arity - 1))); |
543 } | 543 } |
544 node->ReplaceInput(0, function); | 544 node->ReplaceInput(0, function); |
| 545 NodeProperties::ChangeOp( |
| 546 node, |
| 547 javascript()->CallFunction(params.arity(), NO_CALL_FUNCTION_FLAGS, STRICT, |
| 548 VectorSlotPair(), ALLOW_TAIL_CALLS)); |
545 return Changed(node); | 549 return Changed(node); |
546 } | 550 } |
547 | 551 |
548 | 552 |
549 Reduction JSIntrinsicLowering::Change(Node* node, const Operator* op, Node* a, | 553 Reduction JSIntrinsicLowering::Change(Node* node, const Operator* op, Node* a, |
550 Node* b) { | 554 Node* b) { |
551 node->set_op(op); | |
552 node->ReplaceInput(0, a); | 555 node->ReplaceInput(0, a); |
553 node->ReplaceInput(1, b); | 556 node->ReplaceInput(1, b); |
554 node->TrimInputCount(2); | 557 node->TrimInputCount(2); |
| 558 NodeProperties::ChangeOp(node, op); |
555 RelaxControls(node); | 559 RelaxControls(node); |
556 return Changed(node); | 560 return Changed(node); |
557 } | 561 } |
558 | 562 |
559 | 563 |
560 Reduction JSIntrinsicLowering::Change(Node* node, const Operator* op, Node* a, | 564 Reduction JSIntrinsicLowering::Change(Node* node, const Operator* op, Node* a, |
561 Node* b, Node* c) { | 565 Node* b, Node* c) { |
562 node->set_op(op); | |
563 node->ReplaceInput(0, a); | 566 node->ReplaceInput(0, a); |
564 node->ReplaceInput(1, b); | 567 node->ReplaceInput(1, b); |
565 node->ReplaceInput(2, c); | 568 node->ReplaceInput(2, c); |
566 node->TrimInputCount(3); | 569 node->TrimInputCount(3); |
| 570 NodeProperties::ChangeOp(node, op); |
567 RelaxControls(node); | 571 RelaxControls(node); |
568 return Changed(node); | 572 return Changed(node); |
569 } | 573 } |
570 | 574 |
571 | 575 |
572 Reduction JSIntrinsicLowering::Change(Node* node, const Operator* op, Node* a, | 576 Reduction JSIntrinsicLowering::Change(Node* node, const Operator* op, Node* a, |
573 Node* b, Node* c, Node* d) { | 577 Node* b, Node* c, Node* d) { |
574 node->set_op(op); | |
575 node->ReplaceInput(0, a); | 578 node->ReplaceInput(0, a); |
576 node->ReplaceInput(1, b); | 579 node->ReplaceInput(1, b); |
577 node->ReplaceInput(2, c); | 580 node->ReplaceInput(2, c); |
578 node->ReplaceInput(3, d); | 581 node->ReplaceInput(3, d); |
579 node->TrimInputCount(4); | 582 node->TrimInputCount(4); |
| 583 NodeProperties::ChangeOp(node, op); |
580 RelaxControls(node); | 584 RelaxControls(node); |
581 return Changed(node); | 585 return Changed(node); |
582 } | 586 } |
583 | 587 |
584 | 588 |
585 Reduction JSIntrinsicLowering::ChangeToUndefined(Node* node, Node* effect) { | 589 Reduction JSIntrinsicLowering::ChangeToUndefined(Node* node, Node* effect) { |
586 ReplaceWithValue(node, jsgraph()->UndefinedConstant(), effect); | 590 ReplaceWithValue(node, jsgraph()->UndefinedConstant(), effect); |
587 return Changed(node); | 591 return Changed(node); |
588 } | 592 } |
589 | 593 |
(...skipping 10 matching lines...) Expand all Loading... |
600 } | 604 } |
601 | 605 |
602 | 606 |
603 MachineOperatorBuilder* JSIntrinsicLowering::machine() const { | 607 MachineOperatorBuilder* JSIntrinsicLowering::machine() const { |
604 return jsgraph()->machine(); | 608 return jsgraph()->machine(); |
605 } | 609 } |
606 | 610 |
607 } // namespace compiler | 611 } // namespace compiler |
608 } // namespace internal | 612 } // namespace internal |
609 } // namespace v8 | 613 } // namespace v8 |
OLD | NEW |