> From: "daniel smith" <[email protected]> > To: "Remi Forax" <[email protected]> > Cc: "John Rose" <[email protected]>, "valhalla-spec-experts" > <[email protected]> > Sent: Monday, August 21, 2023 9:12:03 PM > Subject: Re: The last miles
>> On Aug 21, 2023, at 11:39 AM, [email protected] wrote: >>> 1) A larval value object is an identity object. This means, in the hand-off >>> between the <init> method and the caller, the object must be heap allocated: >>> the caller and the <init> method need an agreed-upon memory location where >>> state will be set up. >>> I can see this being optimized away if the <init> method can be inlined. >>> But if >>> not (e.g., the constructor logic is sufficiently complex/large), that's a >>> new >>> cost for value object creation: every 'new' needs a heap allocation. (For >>> <vnew>, we are able to optimize the return value calling convention without >>> needing inlining.) >> A larval value object is a value object with the larval state to "on", it's >> not >> an identity object. >> At the end of the call of <init>, the larval state is set to "off". >> The larval bit controls if putfield is allowed or not. > I mean it is an "identity object" in the sense that it must live at a > canonical, > mutable memory location. E.g., you can't scalarize it across calls, you have > to > pass it by reference. But, agreed, "larval object" and "identity object" are > distinct concepts. It's just that both of them depend on some sort of > "identity" capability. > (Separately, we can dig further into the question of whether you actually need > runtime flags to detect this state change, or can leave it to verification. > That's my point (5).) >> In the interpreter, a larval value object is buffered, so there is an heap >> allocation. >> But in JITed code, if everything is inlined > Exactly: "if everything is inlined". My point (1) is that if everything *is > not* > inlined, there are allocations that <vnew> was able to optimize away. inside <vnew>, yes, but at the end of <vnew> if it goes back into the interpreter, the return value will be buffered. I do not think it is obvious if there will be performance regression or not until the new scheme is implemented and tested. Rémi
