[vector api] RFR: Fine-tune test cases for reduction operations

Vladimir Ivanov vladimir.x.ivanov at oracle.com
Thu Feb 14 21:07:43 UTC 2019


Thanks a lot for detailed explanation, Yang!

So, the root problem is that channeling a value through the heap limits 
the tests we can perform on it. Right?

Another approach would be to always operate on sub-word results as 
ints/longs. But I'm fine with your proposal. Feel free to push it.

Best regards,
Vladimir Ivanov

> The IR level is exactly correct. The issue of current test is as followed.
> 
> I write a simple test case: 
> http://cr.openjdk.java.net/~yzhang/vectorapi.test/testcase/TestShortVector128.java
> 
> ideal graph of vectMaxAll2 which checks result of one vector, just like 
> current test. 
> http://cr.openjdk.java.net/~yzhang/vectorapi.test/testcase/ig_vectMaxAll2.png
> 
>             ConI->
> LoadVector-> MaxReductionV -> StoreC
> 
> 
> This test makes sure that result of one vector is correct.
> 
> ideal graph of vectMaxAll1 which checks result of multiple vectors. 
> http://cr.openjdk.java.net/~yzhang/vectorapi.test/testcase/ig_vectMaxAll1.png
> 
> 
>             ConI->
> LoadVector-> MaxReductionV ->CmpI -> other operations
>                                            Phi  ->
> 
> MaxReductionV is implemented by multiple instructions and the 
> intermediate register value
> 
> may be reused in next step such as CmpI. This test can make sure the 
> intermediate register value is correct too.
> 
> 
> Assume input {1, 2, 3, 4, -1, -2, -3, -4} to ShortVector64:
> 
> For vectMaxAll2, the result is {4, -1}
> 
> For vectMaxAll1, the result should be CmpI (4, -1) -> 4.
> 
> But If I use umov(unsigned move) to transfer (-1, 0xFFFF) from vector 
> register carelessly, just like reduce_add4S, the result will be 
> CmpI(0x4, 0xFFFF) -> 0xFFFF(-1) >
> 
> So that I think we need to check the result of one vector and multiple 
> vectors to improve test coverage.
> 
> 
> Regards
> 
> Yang
> 
> 
> ------------------------------------------------------------------------
> *From:* Vladimir Ivanov <vladimir.x.ivanov at oracle.com>
> *Sent:* Thursday, February 14, 2019 6:18 AM
> *To:* Yang Zhang (Arm Technology China); 'panama-dev at openjdk.java.net'
> *Subject:* Re: [vector api] RFR: Fine-tune test cases for reduction 
> operations
> 
>> The following is an example on AArch64 platform. Without the patch, the test is passed . But it is failed with this patch.
>> 
>> I make a little change to this instruction:
>> instruct reduce_max8S(iRegINoSp dst, iRegIorL2I src1, vecX src2, vecX tmp, rFlagsReg cr) %{
>>    format %{ "smaxv  $tmp, T8H, $src2\n\t"
>>              "umov  $dst, $tmp, H, 0\n\t"----------------> smov should be used. because umov will recognize a negative as a great positive.
>>              "cmpw  $dst, $src1\n\t"
>>              "cselw $dst, $dst, $src1 gt\t max reduction8S" %}
>> 
>> %}
>> smov: Signed Move vector element to general-purpose register.
>> umov: Move vector element to general-purpose register.
>> 
>> The test is passed with original test. The error is missed, because src1 is always Short.MIN_VALUE, reduce_max8S could give the correct result of one vector.
>> test Short128VectorTests.maxAllShort128VectorTests(short[i * 5]): success
> 
> Can you, please, elaborate why there's a difference on IR level w.r.t.
> src1? (Sorry, haven't had time to explore that myself.)
> 
> bool LibraryCallKit::inline_vector_reduction() {
> ...
>     Node* init = ReductionNode::make_reduction_input(_gvn, opc, elem_bt);
>     Node* rn = gvn().transform(ReductionNode::make(opc, NULL, init, opd,
> elem_bt));
> ...
> 
> What I'm seeing in library_call.cpp is it always initializes the value
> with the same constant. Are there any transformations happening after
> that? If yes, then where do they happen?
> 
> Best regards,
> Vladimir Ivanov
> 
>> 
>> The test is failed with new test. The error is caught.
>> test Short128VectorTests.maxAllShort128VectorTests(short[i * 5]): failure
>> java.lang.AssertionError: Final result is incorrect! expected [32765] but found [-25541]
>> 
>> So that I think checking both the final and intermediate result is better.
>> I update the patch a little. Please check it.
>> http://cr.openjdk.java.net/~yzhang/vectorapi.test/webrev.01/
>> 
>> Regards,
>> Yang
>> 
>> -----Original Message-----
>> From: Vladimir Ivanov <vladimir.x.ivanov at oracle.com>
>> Sent: Tuesday, February 12, 2019 9:37 AM
>> To: Yang Zhang (Arm Technology China) <Yang.Zhang at arm.com>; 'panama-dev at openjdk.java.net' <panama-dev at openjdk.java.net>
>> Subject: Re: [vector api] RFR: Fine-tune test cases for reduction operations
>> 
>> Though I like the changes you propose, I don't see how they improve test coverage. It implies C2 does the following transformation, but I don't think that's the case (yet):
>> 
>>     AddI i (AddReductionVI (ConI 0) v) => AddReductionVI i v
>> 
>> Am I missing something?
>> 
>> Best regards,
>> Vladimir Ivanov
>> 
>> On 11/02/2019 00:25, Yang Zhang (Arm Technology China) wrote:
>>> Hi
>>>
>>> Currently, test cases of reduction operations only check the intermediate result (the result of one vector), not final result ( the result of one array). So that for following examples, src1 is always initial value without this patch.
>>> instruct rsadd2I_reduction_reg(rRegI dst, rRegI src1, vecD src2, vecD
>>> tmp, vecD tmp2) %{  ----------------------X86 instruct
>>> reduce_add2I(iRegINoSp dst, iRegIorL2I src1, vecD src2, iRegINoSp tmp, iRegINoSp tmp2) ------------------AArch64 To cover more cases, I add test cases that check the final result of reduction operations. Some indentation errors are also fixed.
>>> With this patch, all Vector API tests are passed.
>>>
>>> Could you please help to review this patch?
>>> http://cr.openjdk.java.net/~yzhang/vectorapi.test/webrev.00/
>>>
>>> Regards,
>>> Yang
>>>


More information about the panama-dev mailing list