RFR: 8254872: Optimize Rotate on AArch64

Eric Liu eric.c.liu at arm.com
Mon Nov 16 02:12:31 UTC 2020


Hi Andrew, 

Thanks for your review. I will update those cases soon.

B&R
Eric
-------------------------------------------------------------------------------
From: hotspot-compiler-dev <hotspot-compiler-dev-retn at openjdk.java.net> on behalf of Andrew Haley <aph at openjdk.java.net>
Sent: 14 November 2020 1:56
To: hotspot-compiler-dev at openjdk.java.net <hotspot-compiler-dev at openjdk.java.net>
Subject: Re: RFR: 8254872: Optimize Rotate on AArch64 
 
On Fri, 13 Nov 2020 10:33:41 GMT, Eric Liu <github.com+10482586+erik1iu at openjdk.org> wrote:

> This patch is a supplement for
> https://bugs.openjdk.java.net/browse/JDK-8248830.
> 
> With the implementation of rotate node in IR, this patch:
> 
> 1. canonicalizes RotateLeft into RotateRight when shift is a constant,
>    so that GVN could identify the pre-existing node better.
> 2. implements scalar rotate match rules and removes the original
>    combinations of Or and Shifts on AArch64.
> 
> This patch doesn't implement vector rotate due to the lack of
> corresponding vector instructions on AArch64.
> 
> Test case below is an explanation for this patch.
> 
>         public static int test(int i) {
>             int a =  (i >>> 29) | (i << -29);
>             int b = i << 3;
>             int c = i >>> -3;
>             int d = b | c;
>             return a ^ d;
>         }
> 
> Before:
> 
>         lsl     w12, w1, #3
>         lsr     w10, w1, #29
>         add     w11, w10, w12
>         orr     w12, w12, w10
>         eor     w0, w11, w12
> 
> After:
> 
>         ror     w10, w1, #29
>         eor     w0, w10, w10
> 
> Tested jtreg TestRotate.java, hotspot::hotspot_all_no_apps,
> jdk::jdk_core, langtools::tier1.

Looks very nice in general, but please add one more case for the EOR (shifted register) instructions with rotation. At present we only do LSR, ASL, and ASR. You could add ROR to

define(`ALL_SHIFT_KINDS',
`BOTH_SHIFT_INSNS($1, $2, URShift, LSR)
BOTH_SHIFT_INSNS($1, $2, RShift, ASR)
BOTH_SHIFT_INSNS($1, $2, LShift, LSL)')dnl

This is used in, for example, Java code for SHA 3.

-------------

Changes requested by aph (Reviewer).

PR: https://git.openjdk.java.net/jdk/pull/1199


More information about the hotspot-compiler-dev mailing list