RFR: 8295926: RISC-V: C1: Fix LIRGenerator::do_LibmIntrinsic [v3]
Yadong Wang
yadongwang at openjdk.org
Fri Oct 28 03:20:29 UTC 2022
On Wed, 26 Oct 2022 09:04:48 GMT, Xiaolin Zheng <xlinzheng at openjdk.org> wrote:
>> The ported logic of LIRGenerator::do_LibmIntrinsic has a correctness problem, which will kill argument registers when the current libm intrinsic's operand is also a libm intrinsic, such as:
>>
>> (dpow val1 (dlog val2))
>>
>> LIRItem walks operands, so the `value.load_item_force(cc->at(0));` should be moved below after the LIRItem, or the result of `cc->at(0)` would be killed. But we might as well keep aligning AArch64's style to reduce some maintenance work.
>>
>>
>> Reproducer:
>>
>>
>> public class A {
>>
>> static int count = 0;
>>
>> public static void print(double var) {
>> if (count % 10000 == 0) {
>> System.out.println(var);
>> }
>> count++;
>> }
>>
>> public static void a(double var1, double var2, double var3) {
>> double var4 = Math.pow(var3, Math.log(var1 / var2));
>> print(var4);
>> }
>>
>> public static void main(String[] args) {
>>
>> for (int i = 0; i < 50000; i++) {
>> double var21 = 2.2250738585072014E-308D;
>> double var15 = 1.1102230246251565E-16D;
>> double d1 = 2.0D;
>> A.a(var21, var15, d1);
>> }
>>
>> }
>>
>> }
>>
>>
>> The right answer is
>>
>> 6.461124611136231E-203
>> 6.461124611136231E-203
>> 6.461124611136231E-203
>> 6.461124611136231E-203
>> 6.461124611136231E-203
>>
>>
>> The current backend gives
>>
>> 6.461124611136231E-203
>> NaN
>> NaN
>> NaN
>> NaN
>>
>>
>> Testing a hotspot tier1~4 on qemu.
>>
>> Thanks,
>> Xiaolin
>
> Xiaolin Zheng has updated the pull request incrementally with one additional commit since the last revision:
>
> Maybe a license
@zhengxiaolinX Nice catch. LGTM.
-------------
Marked as reviewed by yadongwang (Author).
PR: https://git.openjdk.org/jdk/pull/10867
More information about the hotspot-compiler-dev
mailing list