RFR: 8273454: C2: Transform (-a)*(-b) into a*b [v4]

Eric Liu eliu at openjdk.java.net
Fri Sep 10 02:59:02 UTC 2021


On Thu, 9 Sep 2021 15:02:32 GMT, Zhengyu Gu <zgu at openjdk.org> wrote:

>> The transformation reduce instructions in generated code.
>> 
>> ### x86_64:
>> 
>> Before:
>> ```  
>>   0x00007fb92c78b3ac:   neg    %esi
>>   0x00007fb92c78b3ae:   neg    %edx
>>   0x00007fb92c78b3b0:   mov    %esi,%eax
>>   0x00007fb92c78b3b2:   imul   %edx,%eax                    ;*imul {reexecute=0 rethrow=0 return_oop=0}
>>                                                             ; - TestSub::runSub at 4 (line 9)
>> 
>> After:
>> 
>>                                                            ; - TestSub::runSub at -1 (line 9)
>>   0x00007fc8c05b74ac:   mov    %esi,%eax
>>   0x00007fc8c05b74ae:   imul   %edx,%eax                    ;*imul {reexecute=0 rethrow=0 return_oop=0}
>>                                                             ; - TestSub::runSub at 4 (line 9)
>> 
>> 
>> 
>> ### AArch64:
>> Before:
>> 
>>  0x0000ffff814b4a70:   neg     w11, w1
>>  0x0000ffff814b4a74:   mneg    w0, w2, w11                 ;*imul {reexecute=0 rethrow=0 return_oop=0}
>>                                                             ; - TestSub::runSub at 4 (line 9)
>> 
>> 
>> After:
>> 
>>  0x0000ffff794a67f0:   mul     w0, w1, w2                  ;*imul {reexecute=0 rethrow=0 return_oop=0}
>>                                                             ; - TestSub::runSub at 4 (line 9)
>
> Zhengyu Gu has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Fix node in place instead of creating new node

test/hotspot/jtreg/compiler/integerArithmetic/TestNegMultiply.java line 44:

> 42: 
> 43:     private static void testInt(int a, int b) {
> 44:         int expected = (-a) * (-b);

Are you sure about this is the expected value? As the method has been invoked 2000 times, I think it would be compiled by c2.

test/hotspot/jtreg/compiler/integerArithmetic/TestNegMultiply.java line 63:

> 61:             }
> 62:         }
> 63:     }

How about calculating the expected value outside the iteration to avoid it to be compiled?

``` java   
 private static void testLong() {
        for (int i = 0; i < 20_000; i++) {
            long a = random.nextLong();
            long b = random.nextLong();
            long expected = (-a) * (-b);
            if (expected != test(a, b)) {
                throw new RuntimeException("Incorrect result.");
            }
        }
    }

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

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


More information about the hotspot-compiler-dev mailing list