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

Side by Side Diff: src/compiler/effect-control-linearizer.cc

Issue 2833783002: [compiler] Add instrumentation for tracking down Node::New crashes. (Closed)
Patch Set: Take no risks. Created 3 years, 8 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 | « src/compiler/effect-control-linearizer.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/effect-control-linearizer.h" 5 #include "src/compiler/effect-control-linearizer.h"
6 6
7 #include "src/code-factory.h" 7 #include "src/code-factory.h"
8 #include "src/compiler/access-builder.h" 8 #include "src/compiler/access-builder.h"
9 #include "src/compiler/compiler-source-position-table.h" 9 #include "src/compiler/compiler-source-position-table.h"
10 #include "src/compiler/js-graph.h" 10 #include "src/compiler/js-graph.h"
11 #include "src/compiler/linkage.h" 11 #include "src/compiler/linkage.h"
12 #include "src/compiler/node-matchers.h" 12 #include "src/compiler/node-matchers.h"
13 #include "src/compiler/node-properties.h" 13 #include "src/compiler/node-properties.h"
14 #include "src/compiler/node.h" 14 #include "src/compiler/node.h"
15 #include "src/compiler/schedule.h" 15 #include "src/compiler/schedule.h"
16 #include "src/objects-inl.h" 16 #include "src/objects-inl.h"
17 17
18 namespace v8 { 18 namespace v8 {
19 namespace internal { 19 namespace internal {
20 namespace compiler { 20 namespace compiler {
21 21
22 EffectControlLinearizer::EffectControlLinearizer( 22 EffectControlLinearizer::EffectControlLinearizer(
23 JSGraph* js_graph, Schedule* schedule, Zone* temp_zone, 23 JSGraph* js_graph, Schedule* schedule, Zone* temp_zone,
24 SourcePositionTable* source_positions) 24 SourcePositionTable* source_positions)
25 : js_graph_(js_graph), 25 : js_graph_(js_graph),
26 schedule_(schedule), 26 schedule_(schedule),
27 temp_zone_(temp_zone), 27 temp_zone_(temp_zone),
28 source_positions_(source_positions), 28 source_positions_(source_positions),
29 graph_assembler_(js_graph, nullptr, nullptr, temp_zone) {} 29 graph_assembler_(js_graph, nullptr, nullptr, temp_zone),
30 frame_state_zapper_(nullptr) {}
30 31
31 Graph* EffectControlLinearizer::graph() const { return js_graph_->graph(); } 32 Graph* EffectControlLinearizer::graph() const { return js_graph_->graph(); }
32 CommonOperatorBuilder* EffectControlLinearizer::common() const { 33 CommonOperatorBuilder* EffectControlLinearizer::common() const {
33 return js_graph_->common(); 34 return js_graph_->common();
34 } 35 }
35 SimplifiedOperatorBuilder* EffectControlLinearizer::simplified() const { 36 SimplifiedOperatorBuilder* EffectControlLinearizer::simplified() const {
36 return js_graph_->simplified(); 37 return js_graph_->simplified();
37 } 38 }
38 MachineOperatorBuilder* EffectControlLinearizer::machine() const { 39 MachineOperatorBuilder* EffectControlLinearizer::machine() const {
39 return js_graph_->machine(); 40 return js_graph_->machine();
(...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after
422 Node* frame_state = nullptr; 423 Node* frame_state = nullptr;
423 if (block != schedule()->start()) { 424 if (block != schedule()->start()) {
424 // If all the predecessors have the same effect, we can use it 425 // If all the predecessors have the same effect, we can use it
425 // as our current effect. 426 // as our current effect.
426 frame_state = 427 frame_state =
427 block_effects.For(block->PredecessorAt(0), block).current_frame_state; 428 block_effects.For(block->PredecessorAt(0), block).current_frame_state;
428 for (size_t i = 1; i < block->PredecessorCount(); i++) { 429 for (size_t i = 1; i < block->PredecessorCount(); i++) {
429 if (block_effects.For(block->PredecessorAt(i), block) 430 if (block_effects.For(block->PredecessorAt(i), block)
430 .current_frame_state != frame_state) { 431 .current_frame_state != frame_state) {
431 frame_state = nullptr; 432 frame_state = nullptr;
433 frame_state_zapper_ = graph()->end();
432 break; 434 break;
433 } 435 }
434 } 436 }
435 } 437 }
436 438
437 // Process the ordinary instructions. 439 // Process the ordinary instructions.
438 for (; instr < block->NodeCount(); instr++) { 440 for (; instr < block->NodeCount(); instr++) {
439 Node* node = block->NodeAt(instr); 441 Node* node = block->NodeAt(instr);
440 ProcessNode(node, &frame_state, &effect, &control); 442 ProcessNode(node, &frame_state, &effect, &control);
441 } 443 }
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
495 if (TryWireInStateEffect(node, *frame_state, effect, control)) { 497 if (TryWireInStateEffect(node, *frame_state, effect, control)) {
496 return; 498 return;
497 } 499 }
498 500
499 // If the node has a visible effect, then there must be a checkpoint in the 501 // If the node has a visible effect, then there must be a checkpoint in the
500 // effect chain before we are allowed to place another eager deoptimization 502 // effect chain before we are allowed to place another eager deoptimization
501 // point. We zap the frame state to ensure this invariant is maintained. 503 // point. We zap the frame state to ensure this invariant is maintained.
502 if (region_observability_ == RegionObservability::kObservable && 504 if (region_observability_ == RegionObservability::kObservable &&
503 !node->op()->HasProperty(Operator::kNoWrite)) { 505 !node->op()->HasProperty(Operator::kNoWrite)) {
504 *frame_state = nullptr; 506 *frame_state = nullptr;
507 frame_state_zapper_ = node;
505 } 508 }
506 509
507 // Remove the end markers of 'atomic' allocation region because the 510 // Remove the end markers of 'atomic' allocation region because the
508 // region should be wired-in now. 511 // region should be wired-in now.
509 if (node->opcode() == IrOpcode::kFinishRegion) { 512 if (node->opcode() == IrOpcode::kFinishRegion) {
510 // Reset the current region observability. 513 // Reset the current region observability.
511 region_observability_ = RegionObservability::kObservable; 514 region_observability_ = RegionObservability::kObservable;
512 // Update the value uses to the value input of the finish node and 515 // Update the value uses to the value input of the finish node and
513 // the effect uses to the effect input. 516 // the effect uses to the effect input.
514 return RemoveRegionNode(node); 517 return RemoveRegionNode(node);
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
674 case IrOpcode::kCheckedUint32ToInt32: 677 case IrOpcode::kCheckedUint32ToInt32:
675 result = LowerCheckedUint32ToInt32(node, frame_state); 678 result = LowerCheckedUint32ToInt32(node, frame_state);
676 break; 679 break;
677 case IrOpcode::kCheckedUint32ToTaggedSigned: 680 case IrOpcode::kCheckedUint32ToTaggedSigned:
678 result = LowerCheckedUint32ToTaggedSigned(node, frame_state); 681 result = LowerCheckedUint32ToTaggedSigned(node, frame_state);
679 break; 682 break;
680 case IrOpcode::kCheckedFloat64ToInt32: 683 case IrOpcode::kCheckedFloat64ToInt32:
681 result = LowerCheckedFloat64ToInt32(node, frame_state); 684 result = LowerCheckedFloat64ToInt32(node, frame_state);
682 break; 685 break;
683 case IrOpcode::kCheckedTaggedSignedToInt32: 686 case IrOpcode::kCheckedTaggedSignedToInt32:
687 if (frame_state == nullptr) {
688 V8_Fatal(__FILE__, __LINE__, "No frame state (zapped by #%d: %s)",
689 frame_state_zapper_->id(),
690 frame_state_zapper_->op()->mnemonic());
691 }
684 result = LowerCheckedTaggedSignedToInt32(node, frame_state); 692 result = LowerCheckedTaggedSignedToInt32(node, frame_state);
685 break; 693 break;
686 case IrOpcode::kCheckedTaggedToInt32: 694 case IrOpcode::kCheckedTaggedToInt32:
687 result = LowerCheckedTaggedToInt32(node, frame_state); 695 result = LowerCheckedTaggedToInt32(node, frame_state);
688 break; 696 break;
689 case IrOpcode::kCheckedTaggedToFloat64: 697 case IrOpcode::kCheckedTaggedToFloat64:
690 result = LowerCheckedTaggedToFloat64(node, frame_state); 698 result = LowerCheckedTaggedToFloat64(node, frame_state);
691 break; 699 break;
692 case IrOpcode::kCheckedTaggedToTaggedSigned: 700 case IrOpcode::kCheckedTaggedToTaggedSigned:
693 result = LowerCheckedTaggedToTaggedSigned(node, frame_state); 701 result = LowerCheckedTaggedToTaggedSigned(node, frame_state);
(...skipping 2291 matching lines...) Expand 10 before | Expand all | Expand 10 after
2985 return isolate()->factory(); 2993 return isolate()->factory();
2986 } 2994 }
2987 2995
2988 Isolate* EffectControlLinearizer::isolate() const { 2996 Isolate* EffectControlLinearizer::isolate() const {
2989 return jsgraph()->isolate(); 2997 return jsgraph()->isolate();
2990 } 2998 }
2991 2999
2992 } // namespace compiler 3000 } // namespace compiler
2993 } // namespace internal 3001 } // namespace internal
2994 } // namespace v8 3002 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/effect-control-linearizer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698