RFR(S): 8207773: [lworld] C2 should not allocate when returning a value type as Object from an inlined method

John Rose john.r.rose at oracle.com
Thu Jul 19 07:11:51 UTC 2018


On Jul 18, 2018, at 11:23 PM, Tobias Hartmann <tobias.hartmann at oracle.com> wrote:
> 
> Hi John,
> 
> thanks for looking at this.
> 
> On 18.07.2018 22:08, John Rose wrote:
>> That looks good, but the pre-existing assert may be overly restrictive:
>> 
>>       assert(tr->isa_instptr()->klass()->is_java_lang_Object(), "must be java.lang.Object");
> 
> I think the assert is fine because the interface case is handled just above in line 2365. We could
> handle value type to interface type returns here as well though. I've seen that you've filed
> JDK-8207811, we can do some code cleanups in that context.

In the context of JDK-8207811 I'd suggest adding a comment saying
something like "interfaces are handled above".  The theory I'm proposing
is that a bare test for Object (without interfaces also) needs an excuse.
…But it's mainly a suggestion for avoiding future bugs, of a kind I've
seen several times in the (long-gone) past.

> 
>> The JVM treats all interfaces as untyped pointers, as well as Object.
>> The verifier allows pervasive unchecked conversions between any interface
>> and Object.  See VerificationType::resolve_and_check_assignability
>> and note that from_field_is_protected is false almost always.
>> 
>> This odd status of interfaces has often been forgotten in JIT code.
>> Any C2 TypeInstPtr whose klass is an interface is a general reference,
>> a value of which may or may not implement the interface in question.
>> In other words, anywhere an Object is allows, an interface is probably
>> also valid.
> 
> Yes, we've introduced TypeOopPtr::can_be_value_type() for this:
> http://hg.openjdk.java.net/valhalla/valhalla/file/d44793ca7966/src/hotspot/share/opto/type.hpp#l1090

OK.  The name reads oddly; Object itself isn't (and so can't) be a value
type, but can be a super of value types, and its domain is able to contain
value instances; same point for any interface.  I won't bikeshed here.

> 
>> I wonder, do we have to do a round of assert adjustment the first time we
>> mix values with interfaces?  And one of the advantages of L-world is simple
>> interop between interfaces and values:  Are we giving up on this in LW1?
> 
> No, this *is* supported for LW1 and we have the corresponding JIT functionality and tests (basically
> whenever we have tests with java.lang.Object, we (should) have added tests with "MyInterface" which
> is implemented by our test value types). For example:
> http://hg.openjdk.java.net/valhalla/valhalla/file/d44793ca7966/test/hotspot/jtreg/compiler/valhalla/valuetypes/TestLWorld.java#l741

Oh, good.  I was slightly worried, along the lines of "how can that
possibly work?"

— John


More information about the valhalla-dev mailing list