C2: Unrolling and hoisting trivial expressions out of loops
aph at redhat.com
Sat Apr 28 07:45:57 UTC 2018
On 04/27/2018 08:54 PM, John Rose wrote:
> On Apr 27, 2018, at 11:08 AM, Vladimir Kozlov <vladimir.kozlov at oracle.com <mailto:vladimir.kozlov at oracle.com>> wrote:
>> I don't see it on SPARC
> I think this behavior is controlled by Matcher::clone_address_expressions,
> which is defined in <arch>.ad.
Interesting, Thanks, I'll kick that around and see what it does. The
problem seems to have been exacerbated by the fact that we seem to be
unrolling a lot more than we used to. This is in general a good
thing, I suppose, especially if unrolling is driving vector
> There is a processor-dependent decision about expressions which might
> be address expressions: Should we common them up (good for RISC)
> or keep separate instances under their consuming instructions (good for
Mmm, but commmoning then up isn't great in this case, which is typical
RISC addressing. It's never going to be great when you have 16-times
unrolling of a loop with two array inputs on a machine with fewer than
32 address registers.
> If they are commoned they are code-generated into registers.
> Otherwise, they should be matched into instruction definitions. If the
> latter step fails, you get duplicated address generation code, which
> looks bad, instead of duplicated addressing modes, which doesn't
> look bad. Of course it is a processor-dependent decision what exactly
> constitutes an address expression.
Sure. It's a tricky issue to get right, and I have a horrible feeling
that if I tweak this it'll cause regressions elsewhere.
Java Platform Lead Engineer
Red Hat UK Ltd. <https://www.redhat.com>
EAC8 43EB D3EF DB98 CC77 2FAD A5CD 6035 332F A671
More information about the hotspot-compiler-dev