RFR: 8295926: RISC-V: C1: Fix LIRGenerator::do_LibmIntrinsic

Xiaolin Zheng xlinzheng at openjdk.org
Wed Oct 26 05:04:54 UTC 2022


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

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

Commit messages:
 - Fix simply

Changes: https://git.openjdk.org/jdk/pull/10867/files
 Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=10867&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8295926
  Stats: 20 lines in 1 file changed: 15 ins; 4 del; 1 mod
  Patch: https://git.openjdk.org/jdk/pull/10867.diff
  Fetch: git fetch https://git.openjdk.org/jdk pull/10867/head:pull/10867

PR: https://git.openjdk.org/jdk/pull/10867


More information about the hotspot-compiler-dev mailing list