RFR(L): 8186027: C2: loop strip mining

Roland Westrelin rwestrel at redhat.com
Mon Oct 30 17:02:03 UTC 2017

Hi Vladimir,

> Should we just make _loop_flags field type uint (32-bit) since we hit 16-bit limit?

We don't hit the limit with this change. I have some other changes for
which I had to change _loop_flags to uint. That's where the int -> uint
tweaks are coming from. I can remove them if you like as they are not
required. Sorry for the confusion.

> There is confusion (because you did not have enough bits?) about which loops are marked as 
> strip_mined. I thought it is only inner loop but it looks like out (skeleton) loop also marked as 
> such. I would suggest to mark them differently.

The way it works currently is:

Opcode() == Op_Loop && is_strip_mined() => outer loop
Opcode() == Op_CountedLoop && is_strip_mined() => inner loop

The outer loop can't be transformed to a counted loop so that scheme
shouldn't break.

> I was thinking may be we should create new Loop node subclass for outer loop. Then you don't need 
> special flag for it and it will be obvious what they are in Ideal Graph. The same for outer loop end 
> node.

Ok. That sounds like it could clean up the code a bit. Do you want me to
look into that?

> src/hotspot/share/opto/superword.cpp
> Where next change come from?
> +      if (t2->Opcode() == Op_AddI && t2 == _lp->as_CountedLoop()->incr()) continue; // don't mess 
> with the iv

I saw a few cases where t2 is the increment of the CountedLoop
iv. SuperWord::opnd_positions_match() then swaps the edges of the AddI
and later CountedLoopEndNode::phi() fails because the edges of the iv's
AddI are not in the expected order anymore.


More information about the hotspot-compiler-dev mailing list