Integrated: 8276673: Optimize abs operations in C2 compiler

Fei Gao fgao at openjdk.java.net
Mon Jan 17 02:20:35 UTC 2022


On Wed, 8 Dec 2021 01:32:22 GMT, Fei Gao <fgao at openjdk.org> wrote:

> The patch aims to help optimize Math.abs() mainly from these three parts:
> 1) Remove redundant instructions for abs with constant values
> 2) Remove redundant instructions for abs with char type
> 3) Convert some common abs operations to ideal forms
> 
> 1. Remove redundant instructions for abs with constant values
> 
> If we can decide the value of the input node for function Math.abs()
> at compile-time, we can substitute the Abs node with the absolute
> value of the constant and don't have to calculate it at runtime.
> 
> For example,
>   int[] a
>   for (int i = 0; i < SIZE; i++) {
>     a[i] = Math.abs(-38);
>   }
> 
> Before the patch, the generated code for the testcase above is:
> ...
>   mov   w10, #0xffffffda
>   cmp   w10, wzr
>   cneg  w17, w10, lt
>   dup   v16.8h, w17
> ...
> After the patch, the generated code for the testcase above is :
> ...
>   movi  v16.4s, #0x26
> ...
> 
> 2. Remove redundant instructions for abs with char type
> 
> In Java semantics, as the char type is always non-negative, we
> could actually remove the absI node in the C2 middle end.
> 
> As for vectorization part, in current SLP, the vectorization of
> Math.abs() with char type is intentionally disabled after
> JDK-8261022 because it generates incorrect result before. After
> removing the AbsI node in the middle end, Math.abs(char) can be
> vectorized naturally.
> 
> For example,
> 
>   char[] a;
>   char[] b;
>   for (int i = 0; i < SIZE; i++) {
>     b[i] = (char) Math.abs(a[i]);
>   }
> 
> Before the patch, the generated assembly code for the testcase
> above is:
> 
> B15:
>   add   x13, x21, w20, sxtw #1
>   ldrh  w11, [x13, #16]
>   cmp   w11, wzr
>   cneg  w10, w11, lt
>   strh  w10, [x13, #16]
>   ldrh  w10, [x13, #18]
>   cmp   w10, wzr
>   cneg  w10, w10, lt
>   strh  w10, [x13, #18]
>   ...
>   add   w20, w20, #0x1
>   cmp   w20, w17
>   b.lt  B15
> 
> After the patch, the generated assembly code is:
> B15:
>   sbfiz x18, x19, #1, #32
>   add   x0, x14, x18
>   ldr   q16, [x0, #16]
>   add   x18, x21, x18
>   str   q16, [x18, #16]
>   ldr   q16, [x0, #32]
>   str   q16, [x18, #32]
>   ...
>   add   w19, w19, #0x40
>   cmp   w19, w17
>   b.lt  B15
> 
> 3. Convert some common abs operations to ideal forms
> 
> The patch overrides some virtual support functions for AbsNode
> so that optimization of gvn can work on it. Here are the optimizable
> forms:
> 
> a) abs(0 - x) => abs(x)
> 
> Before the patch:
>   ...
>   ldr   w13, [x13, #16]
>   neg   w13, w13
>   cmp   w13, wzr
>   cneg  w14, w13, lt
>   ...
> After the patch:
>   ...
>   ldr   w13, [x13, #16]
>   cmp   w13, wzr
>   cneg  w13, w13, lt
>   ...
> 
> b) abs(abs(x))  => abs(x)
> 
> Before the patch:
>   ...
>   ldr   w12, [x12, #16]
>   cmp   w12, wzr
>   cneg  w12, w12, lt
>   cmp   w12, wzr
>   cneg  w12, w12, lt
>   ...
> After the patch:
>   ...
>   ldr   w13, [x13, #16]
>   cmp   w13, wzr
>   cneg  w13, w13, lt
>   ...

This pull request has now been integrated.

Changeset: c6196662
Author:    Fei Gao <fgao at openjdk.org>
Committer: Jie Fu <jiefu at openjdk.org>
URL:       https://git.openjdk.java.net/jdk/commit/c6196662b8a15276916badd333291057980a6552
Stats:     303 lines in 5 files changed: 298 ins; 0 del; 5 mod

8276673: Optimize abs operations in C2 compiler

Reviewed-by: thartmann, jiefu

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

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


More information about the hotspot-compiler-dev mailing list