Mercurial > hg > graal-compiler
comparison src/share/vm/c1/c1_Optimizer.cpp @ 1584:b812ff5abc73
6958292: C1: Enable parallel compilation
Summary: Enable parallel compilation in C1
Reviewed-by: never, kvn
author | iveresov |
---|---|
date | Fri, 04 Jun 2010 11:18:04 -0700 |
parents | c18cbe5936b8 |
children | d5d065957597 |
comparison
equal
deleted
inserted
replaced
1583:02e771df338e | 1584:b812ff5abc73 |
---|---|
435 | 435 |
436 | 436 |
437 // Because of a static contained within (for the purpose of iteration | 437 // Because of a static contained within (for the purpose of iteration |
438 // over instructions), it is only valid to have one of these active at | 438 // over instructions), it is only valid to have one of these active at |
439 // a time | 439 // a time |
440 class NullCheckEliminator { | 440 class NullCheckEliminator: public ValueVisitor { |
441 private: | 441 private: |
442 static NullCheckEliminator* _static_nce; | |
443 static void do_value(Value* vp); | |
444 | |
445 Optimizer* _opt; | 442 Optimizer* _opt; |
446 | 443 |
447 ValueSet* _visitable_instructions; // Visit each instruction only once per basic block | 444 ValueSet* _visitable_instructions; // Visit each instruction only once per basic block |
448 BlockList* _work_list; // Basic blocks to visit | 445 BlockList* _work_list; // Basic blocks to visit |
449 | 446 |
501 Optimizer* opt() { return _opt; } | 498 Optimizer* opt() { return _opt; } |
502 IR* ir () { return opt()->ir(); } | 499 IR* ir () { return opt()->ir(); } |
503 | 500 |
504 // Process a graph | 501 // Process a graph |
505 void iterate(BlockBegin* root); | 502 void iterate(BlockBegin* root); |
503 | |
504 void visit(Value* f); | |
506 | 505 |
507 // In some situations (like NullCheck(x); getfield(x)) the debug | 506 // In some situations (like NullCheck(x); getfield(x)) the debug |
508 // information from the explicit NullCheck can be used to populate | 507 // information from the explicit NullCheck can be used to populate |
509 // the getfield, even if the two instructions are in different | 508 // the getfield, even if the two instructions are in different |
510 // scopes; this allows implicit null checks to be used but the | 509 // scopes; this allows implicit null checks to be used but the |
600 void NullCheckVisitor::do_UnsafePrefetchWrite(UnsafePrefetchWrite* x) {} | 599 void NullCheckVisitor::do_UnsafePrefetchWrite(UnsafePrefetchWrite* x) {} |
601 void NullCheckVisitor::do_ProfileCall (ProfileCall* x) { nce()->clear_last_explicit_null_check(); } | 600 void NullCheckVisitor::do_ProfileCall (ProfileCall* x) { nce()->clear_last_explicit_null_check(); } |
602 void NullCheckVisitor::do_ProfileCounter (ProfileCounter* x) {} | 601 void NullCheckVisitor::do_ProfileCounter (ProfileCounter* x) {} |
603 | 602 |
604 | 603 |
605 NullCheckEliminator* NullCheckEliminator::_static_nce = NULL; | 604 void NullCheckEliminator::visit(Value* p) { |
606 | |
607 | |
608 void NullCheckEliminator::do_value(Value* p) { | |
609 assert(*p != NULL, "should not find NULL instructions"); | 605 assert(*p != NULL, "should not find NULL instructions"); |
610 if (_static_nce->visitable(*p)) { | 606 if (visitable(*p)) { |
611 _static_nce->mark_visited(*p); | 607 mark_visited(*p); |
612 (*p)->visit(&_static_nce->_visitor); | 608 (*p)->visit(&_visitor); |
613 } | 609 } |
614 } | 610 } |
615 | 611 |
616 bool NullCheckEliminator::merge_state_for(BlockBegin* block, ValueSet* incoming_state) { | 612 bool NullCheckEliminator::merge_state_for(BlockBegin* block, ValueSet* incoming_state) { |
617 ValueSet* state = state_for(block); | 613 ValueSet* state = state_for(block); |
635 } | 631 } |
636 } | 632 } |
637 | 633 |
638 | 634 |
639 void NullCheckEliminator::iterate_one(BlockBegin* block) { | 635 void NullCheckEliminator::iterate_one(BlockBegin* block) { |
640 _static_nce = this; | |
641 clear_visitable_state(); | 636 clear_visitable_state(); |
642 // clear out an old explicit null checks | 637 // clear out an old explicit null checks |
643 set_last_explicit_null_check(NULL); | 638 set_last_explicit_null_check(NULL); |
644 | 639 |
645 if (PrintNullCheckElimination) { | 640 if (PrintNullCheckElimination) { |
710 // visiting instructions which are references in other blocks or | 705 // visiting instructions which are references in other blocks or |
711 // visiting instructions more than once. | 706 // visiting instructions more than once. |
712 mark_visitable(instr); | 707 mark_visitable(instr); |
713 if (instr->is_root() || instr->can_trap() || (instr->as_NullCheck() != NULL)) { | 708 if (instr->is_root() || instr->can_trap() || (instr->as_NullCheck() != NULL)) { |
714 mark_visited(instr); | 709 mark_visited(instr); |
715 instr->input_values_do(&NullCheckEliminator::do_value); | 710 instr->input_values_do(this); |
716 instr->visit(&_visitor); | 711 instr->visit(&_visitor); |
717 } | 712 } |
718 } | 713 } |
719 | 714 |
720 // Propagate state to successors if necessary | 715 // Propagate state to successors if necessary |