RFS(M): 8005031: Some cleanup in c2 to prepare for incremental inlining support

Roland Westrelin roland.westrelin at oracle.com
Fri Dec 14 05:58:04 PST 2012


Hi Vladimir,

Thanks for reviewing this.


> Why you removed asserts in callnode.cpp?

If inlining happens after the graph has been transformed then useless projections may have gone away. Anyway, this doesn't belong in this cleanup so I moved it to the incremental inlining change. I put the assert back but it's disabled if inlining is happening after the first round of parsing.

> I think "chunk" word is not appropriate for this. Maybe "Event" or something:
> 
> PrintInliningChunk --> PrintInliningEvent
> _print_inlining_chunks --> _print_inlining_list
> 
> Allocate the list in comp arena for use in later inlining: new(comp_arena())

Ok.

> LogCompilation output will be also affected. I remember fixing the tool for StringOpts. Could you verify that it works and fix it if it does not?

It's indeed broken but it doesn't look like a trivial fix to me. Can this be done separately? If yes, I'll file a new CR.
Also: in the current LogCompilation late_inline entries are listed at the end:

13    spec.benchmarks._213_javac.ScannerInputStream::read (513 bytes)
    @ 32 java.io.InputStream::read (0 bytes)
      type profile java/io/InputStream -> java/io/BufferedInputStream (100%)
    @ 32 java.io.BufferedInputStream::read (49 bytes)
    @ 95 java.io.InputStream::read (0 bytes)
      type profile java/io/InputStream -> java/io/BufferedInputStream (100%)
    @ 95 java.io.BufferedInputStream::read too big
    @ 151 java.io.InputStream::read (0 bytes)
    @ 151 java.io.InputStream::read (0 bytes)
    @ 408 spec.benchmarks._213_javac.Environment::error never executed
    @ 435 java.io.InputStream::read (0 bytes)
    @ 469 java.io.InputStream::read (0 bytes)
late inline:
    @ 32 java.io.BufferedInputStream::read (49 bytes) (end time: 1.7170 nodes: 792 live: 538)
      @ 12 java.io.BufferedInputStream::fill too big
      @ 29 java.io.BufferedInputStream::getBufIfOpen (21 bytes)
    @ 32 java.io.BufferedInputStream::read (49 bytes)
      @ 29 java.io.BufferedInputStream::getBufIfOpen (21 bytes) (end time: 1.7180 nodes: 826 live: 569)

(strange that @29 is twice in the late inline section)
But if there's a lot of late inlining going on, wouldn't we want to have everything together:
13    spec.benchmarks._213_javac.ScannerInputStream::read (513 bytes)
    @ 32 java.io.InputStream::read (0 bytes)
      type profile java/io/InputStream -> java/io/BufferedInputStream (100%)
    @ 32 java.io.BufferedInputStream::read (49 bytes) (end time: 1.7170 nodes: 792 live: 538)
      @ 12 java.io.BufferedInputStream::fill too big
      @ 29 java.io.BufferedInputStream::getBufIfOpen (21 bytes)
    @ 95 java.io.InputStream::read (0 bytes)
      type profile java/io/InputStream -> java/io/BufferedInputStream (100%)
    @ 95 java.io.BufferedInputStream::read too big
    @ 151 java.io.InputStream::read (0 bytes)
    @ 151 java.io.InputStream::read (0 bytes)
    @ 408 spec.benchmarks._213_javac.Environment::error never executed
    @ 435 java.io.InputStream::read (0 bytes)
    @ 469 java.io.InputStream::read (0 bytes)

with maybe an annotation that marked some call site as late inline. What do you think?

> I think you should put it on igvn._worklist because PhaseIterGVN::optimize() does removal of nodes with outcount() == 0. I don't think it is safe to do it inside Ideal() call.

Ok.

> Also, file RFE (starter_task) to find all similar cases (may be add the check for input nodes in transform_old()).

Ok.

Here is a new webrev:

http://cr.openjdk.java.net/~roland/8005031/webrev.01/

Roland.


More information about the hotspot-compiler-dev mailing list