RFR (M): 8030863: PPC64: (part 220): ConstantTableBase for calls between args and jvms

Vladimir Kozlov vladimir.kozlov at oracle.com
Thu Dec 26 15:25:12 PST 2013

Thank you, now I understand, I think (at least why you can't use req()-1 

So the problem exist only for CallDynamicJava but you decided do set new 
const base edge for all call nodes (except leaf calls which do not have 
debug info). Right?

How it worked before? Expand() was called before all edges are added at 
the end of Matcher::match_tree().

Why you need to move clone_jvms() from Call node to SafePoint node 
(changes in node.cpp and callnode.hpp)? Only Call nodes are affected.
Add comment that we also need to clone jvms when call node needs to add 
an edge to MachConstantBaseNode during matching which will require jvms 

I don't like matcher_modifies_jvms name (it is too strong/general 
statement when it only shifts it). Can it be calls_need_constant_base? 
It affects almost all calls (even for Leaf calls it will be after 
arguments), it is more specific and can be used for other purposes.

Why you need to declare _matcher_modifies_jvms in FrameForm (changes in 

JVMState::adapt_position(int delta). I would suggest to use a loop as in 
other places (yes, recursion is not deep, as you pointed, but it could 
be called with deep stack already):

   for (JVMState* jvms = this; jvms != NULL; jvms = jvms->caller()) {


On 12/24/13 3:25 PM, Lindenmaier, Goetz wrote:
> Hi Vladimir,
> yes, I meant postalloc expand.
> I was aware of the problem with jvms and build_oop_map, i.e.,
> that you spoil build_oop_map if you add an edge and don't somehow
> tell build_oop_map where to find the derived base pairs after that.
> But as I replace the node by an other one without the edge during
> postalloc expand, I figured I'd be safe.  But, as regalloc added the
> derived base edges behind the one I added, req()-1 pointed to the
> last base edge, and I would have removed the wrong edge.
> For the same reason, regalloc associated the register mask I
> supplied for the ConstTableBase for the node at req()-1, again
> the base edge of a derived/base pair.
> So I need a fixed position, which is now between the args
> and the edges for jvms.
> Best regards,
>    Goetz.
> -----Original Message-----
> From: Vladimir Kozlov [mailto:vladimir.kozlov at oracle.com]
> Sent: Monday, December 23, 2013 9:01 PM
> To: Lindenmaier, Goetz; 'hotspot-dev at openjdk.java.net'; 'ppc-aix-port-dev at openjdk.java.net'
> Subject: Re: RFR (M): 8030863: PPC64: (part 220): ConstantTableBase for calls between args and jvms
> Goetz,
> Can you explain the problem in details? When you say 'during expand' do
> you mean 'during postalloc_expand'? Because normal expand happens during
> matching. And I did not get how it is related to derived/base pairs.
> Thanks,
> Vladimir
> On 12/20/13 7:20 AM, Lindenmaier, Goetz wrote:
>> Hi,
>> The change "8028580: PPC64 (part 114/120): Support for Call nodes with constants. "
>> adds MachConstantBase node for Calls at req()-1 during
>> expand. Register allocation adds the derived/base pairs and then
>> uses the wrong register maps for allocation, because the MachConstantBase
>> node is no more at req()-1
>> Now add the edge in the matcher when the node is complete. Add it
>> after parameters and before jvms. Adapt jvms offsets. Also assure
>> jvms is always cloned, else the offset gets wrong.
>> So far, $constanttablebase is only used in Calls on PPC, so this has no effect on
>> other platforms.
>> Please review and test this change.
>> http://cr.openjdk.java.net/~goetz/webrevs/8030863-0-call/
>> Best regards,
>>     Goetz.

More information about the hotspot-dev mailing list