Mercurial > hg > truffle
comparison src/share/vm/gc_implementation/g1/g1RemSet.cpp @ 4839:b4ebad3520bb
7133038: G1: Some small profile based optimizations
Summary: Some minor profile based optimizations. Reduce the number of branches and branch mispredicts by removing some virtual calls, through closure specalization, and refactoring some conditional statements.
Reviewed-by: brutisso, tonyp
author | johnc |
---|---|
date | Thu, 26 Jan 2012 14:14:55 -0800 |
parents | 441e946dc1af |
children | d2a62e0f25eb 922993931b3d |
comparison
equal
deleted
inserted
replaced
4838:a5244e07b761 | 4839:b4ebad3520bb |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. | 2 * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | 4 * |
5 * This code is free software; you can redistribute it and/or modify it | 5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as | 6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
567 } | 567 } |
568 | 568 |
569 | 569 |
570 static IntHistogram out_of_histo(50, 50); | 570 static IntHistogram out_of_histo(50, 50); |
571 | 571 |
572 class TriggerClosure : public OopClosure { | 572 |
573 bool _trigger; | 573 G1TriggerClosure::G1TriggerClosure() : |
574 public: | 574 _triggered(false) { } |
575 TriggerClosure() : _trigger(false) { } | 575 |
576 bool value() const { return _trigger; } | 576 G1InvokeIfNotTriggeredClosure::G1InvokeIfNotTriggeredClosure(G1TriggerClosure* t_cl, |
577 template <class T> void do_oop_nv(T* p) { _trigger = true; } | 577 OopClosure* oop_cl) : |
578 virtual void do_oop(oop* p) { do_oop_nv(p); } | 578 _trigger_cl(t_cl), _oop_cl(oop_cl) { } |
579 virtual void do_oop(narrowOop* p) { do_oop_nv(p); } | 579 |
580 }; | 580 G1Mux2Closure::G1Mux2Closure(OopClosure *c1, OopClosure *c2) : |
581 | 581 _c1(c1), _c2(c2) { } |
582 class InvokeIfNotTriggeredClosure: public OopClosure { | 582 |
583 TriggerClosure* _t; | 583 G1UpdateRSOrPushRefOopClosure:: |
584 OopClosure* _oc; | 584 G1UpdateRSOrPushRefOopClosure(G1CollectedHeap* g1h, |
585 public: | 585 G1RemSet* rs, |
586 InvokeIfNotTriggeredClosure(TriggerClosure* t, OopClosure* oc): | 586 OopsInHeapRegionClosure* push_ref_cl, |
587 _t(t), _oc(oc) { } | 587 bool record_refs_into_cset, |
588 template <class T> void do_oop_nv(T* p) { | 588 int worker_i) : |
589 if (!_t->value()) _oc->do_oop(p); | 589 _g1(g1h), _g1_rem_set(rs), _from(NULL), |
590 } | 590 _record_refs_into_cset(record_refs_into_cset), |
591 virtual void do_oop(oop* p) { do_oop_nv(p); } | 591 _push_ref_cl(push_ref_cl), _worker_i(worker_i) { } |
592 virtual void do_oop(narrowOop* p) { do_oop_nv(p); } | |
593 }; | |
594 | |
595 class Mux2Closure : public OopClosure { | |
596 OopClosure* _c1; | |
597 OopClosure* _c2; | |
598 public: | |
599 Mux2Closure(OopClosure *c1, OopClosure *c2) : _c1(c1), _c2(c2) { } | |
600 template <class T> void do_oop_nv(T* p) { | |
601 _c1->do_oop(p); _c2->do_oop(p); | |
602 } | |
603 virtual void do_oop(oop* p) { do_oop_nv(p); } | |
604 virtual void do_oop(narrowOop* p) { do_oop_nv(p); } | |
605 }; | |
606 | 592 |
607 bool G1RemSet::concurrentRefineOneCard_impl(jbyte* card_ptr, int worker_i, | 593 bool G1RemSet::concurrentRefineOneCard_impl(jbyte* card_ptr, int worker_i, |
608 bool check_for_refs_into_cset) { | 594 bool check_for_refs_into_cset) { |
609 // Construct the region representing the card. | 595 // Construct the region representing the card. |
610 HeapWord* start = _ct_bs->addr_for(card_ptr); | 596 HeapWord* start = _ct_bs->addr_for(card_ptr); |
627 // only be active outside of a collection which means that when they | 613 // only be active outside of a collection which means that when they |
628 // reach here they should have check_for_refs_into_cset == false. | 614 // reach here they should have check_for_refs_into_cset == false. |
629 assert((size_t)worker_i < n_workers(), "index of worker larger than _cset_rs_update_cl[].length"); | 615 assert((size_t)worker_i < n_workers(), "index of worker larger than _cset_rs_update_cl[].length"); |
630 oops_in_heap_closure = _cset_rs_update_cl[worker_i]; | 616 oops_in_heap_closure = _cset_rs_update_cl[worker_i]; |
631 } | 617 } |
632 UpdateRSOrPushRefOopClosure update_rs_oop_cl(_g1, | 618 G1UpdateRSOrPushRefOopClosure update_rs_oop_cl(_g1, |
633 _g1->g1_rem_set(), | 619 _g1->g1_rem_set(), |
634 oops_in_heap_closure, | 620 oops_in_heap_closure, |
635 check_for_refs_into_cset, | 621 check_for_refs_into_cset, |
636 worker_i); | 622 worker_i); |
637 update_rs_oop_cl.set_from(r); | 623 update_rs_oop_cl.set_from(r); |
638 | 624 |
639 TriggerClosure trigger_cl; | 625 G1TriggerClosure trigger_cl; |
640 FilterIntoCSClosure into_cs_cl(NULL, _g1, &trigger_cl); | 626 FilterIntoCSClosure into_cs_cl(NULL, _g1, &trigger_cl); |
641 InvokeIfNotTriggeredClosure invoke_cl(&trigger_cl, &into_cs_cl); | 627 G1InvokeIfNotTriggeredClosure invoke_cl(&trigger_cl, &into_cs_cl); |
642 Mux2Closure mux(&invoke_cl, &update_rs_oop_cl); | 628 G1Mux2Closure mux(&invoke_cl, &update_rs_oop_cl); |
643 | 629 |
644 FilterOutOfRegionClosure filter_then_update_rs_oop_cl(r, | 630 FilterOutOfRegionClosure filter_then_update_rs_oop_cl(r, |
645 (check_for_refs_into_cset ? | 631 (check_for_refs_into_cset ? |
646 (OopClosure*)&mux : | 632 (OopClosure*)&mux : |
647 (OopClosure*)&update_rs_oop_cl)); | 633 (OopClosure*)&update_rs_oop_cl)); |
686 } else { | 672 } else { |
687 out_of_histo.add_entry(filter_then_update_rs_oop_cl.out_of_region()); | 673 out_of_histo.add_entry(filter_then_update_rs_oop_cl.out_of_region()); |
688 _conc_refine_cards++; | 674 _conc_refine_cards++; |
689 } | 675 } |
690 | 676 |
691 return trigger_cl.value(); | 677 return trigger_cl.triggered(); |
692 } | 678 } |
693 | 679 |
694 bool G1RemSet::concurrentRefineOneCard(jbyte* card_ptr, int worker_i, | 680 bool G1RemSet::concurrentRefineOneCard(jbyte* card_ptr, int worker_i, |
695 bool check_for_refs_into_cset) { | 681 bool check_for_refs_into_cset) { |
696 // If the card is no longer dirty, nothing to do. | 682 // If the card is no longer dirty, nothing to do. |