RFR: 8276673: Optimize abs operations in C2 compiler [v6]

Fei Gao fgao at openjdk.java.net
Fri Dec 17 11:29:56 UTC 2021


> 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
>   ...

Fei Gao has updated the pull request incrementally with one additional commit since the last revision:

  Use uabs() to calculate the absolute value of constant
  
  Change-Id: Ie6f37ab159fb7092e1443b9af8d620562a45ae47

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

Changes:
  - all: https://git.openjdk.java.net/jdk/pull/6755/files
  - new: https://git.openjdk.java.net/jdk/pull/6755/files/2d122a2d..e254d9f7

Webrevs:
 - full: https://webrevs.openjdk.java.net/?repo=jdk&pr=6755&range=05
 - incr: https://webrevs.openjdk.java.net/?repo=jdk&pr=6755&range=04-05

  Stats: 6 lines in 1 file changed: 0 ins; 4 del; 2 mod
  Patch: https://git.openjdk.java.net/jdk/pull/6755.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/6755/head:pull/6755

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


More information about the hotspot-compiler-dev mailing list