RFR 8249893: AARCH64: optimize the construction of the value from the bits of the other two

Boris Ulasevich boris.ulasevich at bell-sw.com
Tue Aug 25 08:57:14 UTC 2020


Hi,

On 25.08.2020 11:10, Andrew Haley wrote:
> Hi,
>
> On 23/08/2020 19:20, Boris Ulasevich wrote:
>  >
>  > Please review the updated change to C2 and AArch64 which introduces
>  > a new BitfieldInsert node to replace Or+Shift+And sequence when 
> possible.
>  > Single BFI instruction is emitted for the new node.
>  >
>  > With the current change all the transformation logic is moved out of
>  > aarch64.ad file into the common C2 code.
>  >
>  > http://bugs.openjdk.java.net/browse/JDK-8249893
>  > http://cr.openjdk.java.net/~bulasevich/8249893/webrev.01
>  >
>  > The change in compiler.cpp was done to implicitly ask IGVN to run
>  > the idealization once again after the loop optimization phase.
>  > This extra step is necessary to make the BFI transform happen
>  > only after loop optimization.
>
> So here's a strange thing. When I run a simple JMH test
>
>      @State(Scope.Benchmark)
>      public static class Result {
>          public int a, b;
>          public long x;
>      }
>
>      @Benchmark
>      public static int bfm(Result r) {
>          return (r.a & 0xFF) | ((r.b & 0xFF) << 8);
>      }
>
> I get
>
>    0x0000ffff84644df0:   ubfiz    w12, w11, #8, #8
>    0x0000ffff84644df4:   and    w10, w10, #0xff
>    0x0000ffff84644df8:   orr    w2, w10, w12                ;*ior 
> {reexecute=0 rethrow=0 return_oop=0}
>                                                              ; - 
> org.openjdk.Rotates::bfm at 19 (line 22)
>                                                              ; - 
> org.openjdk.generated.Rotates_bfm_jmhTest::bfm_avgt_jmhStub at 20 (line 199)
>
> instead of
>
>    0x0000ffff808554b4: and    w10, w10, #0xff
>    0x0000ffff808554b8: and    w12, w12, #0xff
>    0x0000ffff808554bc: orr    w2, w12, w10, lsl #8  ;*ior
>                                                  ; - 
> org.openjdk.Rotates::bfm at 19 (line 22)
>                                                  ; - 
> org.openjdk.generated.Rotates_bfm_jmhTest::bfm_avgt_jmhStub at 20 (line 199)
>
> Do you have any ideas why this might be? Thanks.
>

Both variants are correct, isn't it?

I think matcher preferred UBFIZto OR rule becauseins_costwas set to 1.9 
for OR:
https://hg.openjdk.java.net/jdk/jdk/file/92ddc6fe60eb/src/hotspot/cpu/aarch64/aarch64.ad#l12130
https://hg.openjdk.java.net/jdk/jdk/file/92ddc6fe60eb/src/hotspot/cpu/aarch64/aarch64.ad#l11675

With my change it would work like this:

0x0000ffff7c587fe0:   and    w2, w10, #0xff
0x0000ffff7c587fe8:   bfi    x2, x12, #8, #8



More information about the hotspot-compiler-dev mailing list