RFR: 8204540: Automatic oop closure devirtualization

Stefan Karlsson stefan.karlsson at oracle.com
Thu Jun 21 09:44:32 UTC 2018


Hi Kim,

Thanks for reviewing this!

Updated webrevs:
  http://cr.openjdk.java.net/~stefank/8204540/webrev.02.delta
  http://cr.openjdk.java.net/~stefank/8204540/webrev.02

Comments below:

On 2018-06-21 03:52, Kim Barrett wrote:
>> On Jun 20, 2018, at 6:50 AM, Stefan Karlsson <stefan.karlsson at oracle.com> wrote:
>>
>> Hi all,
>>
>> Please review this patch to get rid of the macro based oop_iterate devirtualization layer, and replace it with a new implementation based on templates that automatically determines when the closure function calls can be devirtualized.
>>
>> http://cr.openjdk.java.net/~stefank/8204540/webrev.01/
>> https://bugs.openjdk.java.net/browse/JDK-8204540
> 
> Generally looks good, just a few minor comments and nits.
> 
> ------------------------------------------------------------------------------
> 
> Any libjvm.so size comparison? We ought to get some benefit from not
> generating code we don't use. OTOH, it's possible this change might
> result in more inlining than previously.

Before patch: 22833008 bytes
After patch:  22790160 bytes

> 
> Any performance comparisons?  My guess would be perhaps a small
> improvement, as we might get some inlining we weren't previously
> getting, in some (supposedly) not performance critical places.

I did runs on our internal perf system, and the scores were the same. I 
looked at pause times for some of the runs and couldn't find a 
difference. I'll run more runs over the weekend.

> 
> ------------------------------------------------------------------------------
> src/hotspot/share/gc/cms/cmsOopClosures.inline.hpp
>    60   inline void cls::do_oop(oop* p)       { cls::do_oop_work(p); }  \
>    61   inline void cls::do_oop(narrowOop* p) { cls::do_oop_work(p); }
> 
> [pre-existing]
> I think the "cls::" qualifiers in the body should be unnecessary.

Removed.

> 
> ------------------------------------------------------------------------------
>    58 #define DO_OOP_WORK_NV_IMPL(cls)                                  \
> 
> This is no longer defining "_nv" functions, so the "_NV" in the name
> seems odd.

OK. I merged DO_OOP_WORK_NV_IMPL and DO_OOP_WORK_IMPL.

> 
> ------------------------------------------------------------------------------
> src/hotspot/share/gc/cms/concurrentMarkSweepGeneration.cpp
> 3321                         MetadataVisitingOopIterateClosure(collector->ref_processor()),
> 
> Indentation messed up.

Fixed.

> 
> ------------------------------------------------------------------------------
> src/hotspot/share/memory/iterator.hpp
>   370 class OopClosureDispatch {
> 
> OopIterateClosureDispatch?

Yes. Fixed.

> 
> ------------------------------------------------------------------------------
> src/hotspot/share/gc/shared/genOopClosures.inline.hpp
> 
> I think it might be better to put the trivial forwarding do_oop
> definitions that have been moved to here instead directly into the
> class declarations.  I think doing so gives better / earlier error
> messages when forgetting to include the associated .inline.hpp file by
> callers.

I tried your proposal. It has the unfortunate effect that whenever you 
include genOopClosures.hpp you get a compile error, even when the 
functions are not used.

I think we can get what you are looking for by changing 'virtual void 
do_oop(oop* p)' to 'inline virtual void do_oop(oop* p)'. I'm not sure 
this should be done for this RFE, though?

> 
> ------------------------------------------------------------------------------
> src/hotspot/share/oops/instanceMirrorKlass.hpp
>   111  public:
> 
> Unnecessary, we're already in public section.

Removed.

> 
> ------------------------------------------------------------------------------
> src/hotspot/share/memory/iterator.inline.hpp
>   231     static const int NUM_KLASSES = 6;
> 
> The value 6 is derived from the number of entries in enum KlassId,
> which is far away.  How about defining KLASS_ID_COUNT with that enum?
> It might be that the enum and that constant need to be somewhere other
> than in klass.hpp though, to avoid include circularities.  But see
> next comment too.

I was thinking about that as well.

> 
> ------------------------------------------------------------------------------
> src/hotspot/share/memory/iterator.inline.hpp
>   106   const int   _id;
> 
> Maybe this should be of type KlassId?  And similarly the accessor.
> 
> Similarly the static const ID members in the various klass types.


Done.


> 
> I'm surprised it can be const, because of the no-arg constructor.

A dummy value is set in the non-arg Klass constructor. Klasses generated 
with this constructor is only used in CDS to copy the vtables.

> 
> ------------------------------------------------------------------------------
> src/hotspot/share/oops/typeArrayKlass.inline.hpp
>    38   // Performance tweak: We skip iterating over the klass pointer since we
>    39   // know that Universe::TypeArrayKlass never moves.
> 
> [pre-existing]
> 
> The wording of this comment seems like it might be left-over from
> permgen, and ought to be re-worded.

OK. Updated the text.

> 
> ------------------------------------------------------------------------------
> src/hotspot/share/memory/iterator.inline.hpp
>    77 //  - If &OopClosureType::do_oop is resolved to &Base::do_oop, then there are no
>    78 //    implementation of do_oop between Base and OopClosureType. However, there
> 
> Either "is no implementation of" or "are no implementations of"

Updated.

Thanks,
StefanK

> 
> ------------------------------------------------------------------------------
> 


More information about the hotspot-dev mailing list