RFR: 8270366: C2: Add associative rule to add/sub node

Andrew Dinn adinn at openjdk.java.net
Tue Jul 13 14:07:57 UTC 2021


On Tue, 13 Jul 2021 12:23:27 GMT, Zhengyu Gu <zgu at openjdk.org> wrote:

> Please review this small patch that add associative rule to add/sub node, that eliminates a multiply instruction.
> 
> e.g.
> 
> private static int assocInt(int a, int b, int c) {
>   return a * c + b * c;
> }
> 
> 
> x86_64:
> Before:
> 
>   0x00007fda1506152c:   imul   %ecx,%esi
>   0x00007fda1506152f:   imul   %ecx,%edx
>   0x00007fda15061532:   mov    %esi,%eax
>   0x00007fda15061534:   add    %edx,%eax                    ;*iadd {reexecute=0 rethrow=0 return_oop=0}
>                                                             ; - TestAssoc::assocInt at 6 (line 9)
> 
> 
> After:
> 
>   0x00007fc1c078d52c:   add    %edx,%esi
>   0x00007fc1c078d52e:   mov    %ecx,%eax
>   0x00007fc1c078d530:   imul   %esi,%eax                    ;*iadd {reexecute=0 rethrow=0 return_oop=0}
>                                                             ; - TestAssoc::assocInt at 6 (line 9)

Hi Zhengyu,

It looks like you are missing a case for both long and int. Your code looks for these patterns:

    a*b+a*c --> a*(b+c)
    a*b+b*c --> b*(a+c)
    a*c+b*c --> (a+b)*c

So you are not transforming this this case

    a*b+c*a -> a*(b+c)

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

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


More information about the hotspot-compiler-dev mailing list