Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8217371

Incorrect LP64 guard in x86.ad after JDK-8210764 (Update avx512 implementation)

XMLWordPrintable

    • b07
    • x86_64

        x86.ad has checks like "ifndef LP64". Those do not work reliably. On x86_64, it is not defined for ADLC compilation, making the code always take the "not defined" branch. Note that the same file uses "ifdef _LP64" (note the underscore) at the same file.

        If you fix that with proper "ifndef _LP64":

        diff -r 2360f73c5514 src/hotspot/cpu/x86/x86.ad
        --- a/src/hotspot/cpu/x86/x86.ad Fri Jan 18 09:32:02 2019 +0100
        +++ b/src/hotspot/cpu/x86/x86.ad Fri Jan 18 10:02:35 2019 +0100
        @@ -1685,5 +1685,5 @@
             case Op_VecD:
             case Op_VecX:
        -#ifndef LP64
        +#ifndef _LP64
               __ movdqu(as_XMMRegister(Matcher::_regEncode[dst_lo]), as_XMMRegister(Matcher::_regEncode[src_lo]));
         #else
        @@ -1697,5 +1697,5 @@
               break;
             case Op_VecY:
        -#ifndef LP64
        +#ifndef _LP64
               __ vmovdqu(as_XMMRegister(Matcher::_regEncode[dst_lo]), as_XMMRegister(Matcher::_regEncode[src_lo]));
         #else
        @@ -1758,5 +1758,5 @@
                 break;
               case Op_VecX:
        -#ifndef LP64
        +#ifndef _LP64
                 __ movdqu(as_XMMRegister(Matcher::_regEncode[reg]), Address(rsp, stack_offset));
         #else
        @@ -1770,5 +1770,5 @@
                 break;
               case Op_VecY:
        -#ifndef LP64
        +#ifndef _LP64
                 __ vmovdqu(as_XMMRegister(Matcher::_regEncode[reg]), Address(rsp, stack_offset));
         #else
        @@ -1796,5 +1796,5 @@
                 break;
               case Op_VecX:
        -#ifndef LP64
        +#ifndef _LP64
                 __ movdqu(Address(rsp, stack_offset), as_XMMRegister(Matcher::_regEncode[reg]));
         #else
        @@ -1808,5 +1808,5 @@
                 break;
               case Op_VecY:
        -#ifndef LP64
        +#ifndef _LP64
                 __ vmovdqu(Address(rsp, stack_offset), as_XMMRegister(Matcher::_regEncode[reg]));
         #else

        ...then the build starts to fail on Linux x86_64 with:

        /home/shade/trunks/jdk-jdk/src/hotspot/cpu/x86/assembler_x86.hpp:2135:8: note: candidate expects 3 arguments, 4 provided
        /home/shade/trunks/jdk-jdk/src/hotspot/cpu/x86/assembler_x86.hpp:2136:8: note: candidate: void Assembler::vextracti32x4(Address, XMMRegister, uint8_t)
           void vextracti32x4(Address dst, XMMRegister src, uint8_t imm8);
                ^~~~~~~~~~~~~
        /home/shade/trunks/jdk-jdk/src/hotspot/cpu/x86/assembler_x86.hpp:2136:8: note: candidate expects 3 arguments, 4 provided
        /home/shade/trunks/jdk-jdk/src/hotspot/cpu/x86/x86.ad:1817:143: error: no matching function for call to 'MacroAssembler::vextracti64x4(Address, XMMRegister, XMMRegister, int)'
                   __ vextracti64x4(Address(rsp, stack_offset), as_XMMRegister(Matcher::_regEncode[reg]), as_XMMRegister(Matcher::_regEncode[reg]), 0x0);
                                                                                                                                                       ^

        There is no 4-argument vextracti64x4 to be seen, indeed.

        So, not only the LP64 is not taken, it does not even compile.

              sviswanathan Sandhya Viswanathan
              shade Aleksey Shipilev
              Votes:
              0 Vote for this issue
              Watchers:
              5 Start watching this issue

                Created:
                Updated:
                Resolved: