VectorAPI and C2 compiler

Vladimir Ivanov vladimir.x.ivanov at oracle.com
Tue Jan 12 19:24:26 UTC 2021


False alarm.

With small adjustments [1], all vector operations are intrinsified:

     static void test(int[] src, short[] dst) {
         vectorCastIntToShort(IntVector.SPECIES_128,
                              ShortVector.SPECIES_64,
                              src, dst);

     }

$ jdk16/bin/java --add-modules jdk.incubator.vector -Xbatch 
-XX:+PrintCompilation -XX:-TieredCompilation -XX:CICompilerCount=1 
-XX:+PrintInlining -XX:CompileCommand=quiet 
-XX:CompileCommand=compileonly,*::test -XX:+PrintIntrinsics Cast
...

575   69    b        Cast::test (12 bytes)
@ 8   Cast::vectorCastIntToShort (28 bytes)   inline (hot)
...
         @ 31   jdk.internal.vm.vector.VectorSupport::load (38 bytes) 
(intrinsic)
...
           @ 128   jdk.internal.vm.vector.VectorSupport::convert (39 
bytes)   (intrinsic)
...
     @ 42   jdk.internal.vm.vector.VectorSupport::store (38 bytes) 
(intrinsic)


Best regards,
Vladimir Ivanov

[1] $ cat Cast.java
import java.io.IOException;
import java.util.Arrays;
import jdk.incubator.vector.IntVector;
import jdk.incubator.vector.ShortVector;
import jdk.incubator.vector.DoubleVector;
import jdk.incubator.vector.VectorSpecies;
import jdk.incubator.vector.LongVector;

class Cast
{
     static void vectorCastIntToShort(VectorSpecies<Integer> i,
                                      VectorSpecies<Short> s,
                                      int[] input,
                                      short[] output)
     {
         IntVector iv = IntVector.fromArray(i, input, 0);
         ShortVector sv = (ShortVector) iv.castShape(s, 0);
         sv.intoArray(output, 0);
     }

     static void test(int[] src, short[] dst) {
         vectorCastIntToShort(IntVector.SPECIES_128,
                              ShortVector.SPECIES_64,
                              src, dst);

     }

     public static void main(String[] args) throws IOException {
         int[] iin128 = {25, -398, 415, Short.MAX_VALUE + 2};
         short[] sout64 = new short[ShortVector.SPECIES_64.length()];

         for (int j = 0; j < 1_000_000; j++) {
             test(iin128, sout64);
         }
     }
}



On 12.01.2021 22:19, Vladimir Ivanov wrote:
> Thanks for the test case, Jose.
> 
> I see the following intrinsification failure when running it:
> 
>      572   69    b        Cast::vectorCastIntToShort (28 bytes)
>    ** missing constant: opr=ConI vclass_from=ConP etype_from=ConP 
> vlen_from=ConI vclass_to=ConP etype_to=ConP vlen_to=LoadI
> 
> ...
> 
> 128   jdk.internal.vm.vector.VectorSupport::convert (39 bytes)   failed 
> to inline (intrinsic)
> 
> I'll take a look why it happens.
> 
> Best regards,
> Vladimir Ivanov
> 
> [1] java --add-modules jdk.incubator.vector -Xbatch 
> -XX:+PrintCompilation -XX:-TieredCompilation -XX:CICompilerCount=1 
> -XX:+PrintInlining -XX:CompileCommand=quiet 
> -XX:CompileCommand=compileonly,*::vectorCastIntToShort 
> -XX:+PrintIntrinsics Cast
> 
> On 12.01.2021 22:11, joserz at linux.ibm.com wrote:
>> Hi Paul,
>>
>> Thank you for your response!! :-)
>>
>> This is my test case for x86 (basically got from 
>> VectorReshapeTests.java).
>> ```
>> import java.io.IOException;
>> import java.util.Arrays;
>> import jdk.incubator.vector.IntVector;
>> import jdk.incubator.vector.ShortVector;
>> import jdk.incubator.vector.DoubleVector;
>> import jdk.incubator.vector.VectorSpecies;
>> import jdk.incubator.vector.LongVector;
>>
>> class Cast
>> {
>>      static void vectorCastIntToShort(VectorSpecies<Integer> i,
>>                                       VectorSpecies<Short> s,
>>                                       int[] input,
>>                                       short[] output)
>>      {
>>          IntVector iv = IntVector.fromArray(i, input, 0);
>>          ShortVector sv = (ShortVector) iv.castShape(s, 0);
>>          sv.intoArray(output, 0);
>>      }
>>
>>      public static void main(String[] args) throws IOException
>>      {
>>          for (int j = 0; j < 1_000_000; j++) {
>>              int[] iin128 = {25, -398, 415, Short.MAX_VALUE + 2};
>>              short[] sout64 = new short[ShortVector.SPECIES_64.length()];
>>
>>              vectorCastIntToShort(IntVector.SPECIES_128,
>>                                   ShortVector.SPECIES_64,
>>                                   iin128, sout64);
>>          }
>>
>>          //System.out.println(Arrays.toString(iin128));
>>          //System.out.println(Arrays.toString(sout64));
>>      }
>> }
>> ```
>>
>> Then, after compiling and running like:
>> $ javac Cast.java
>> $ java -Xcomp -XX:-TieredCompilation -XX:CompileThreshold=1 
>> -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly 
>> -XX:+PrintOptoAssembly -XX:+UnlockExperimentalVMOptions 
>> -XX:+EnableVectorSupport -XX:+EnableVectorReboxing 
>> -XX:+EnableVectorAggressiveReboxing -XX:UseAVX=2 Cast
>>
>> I was expecting to see instructions from x86.ad, like 
>> "vector_cast_i2x" being printed but it seems that VectorCastI2X 
>> pattern isn't be generated because I see compiler C2 kicking in during 
>> the program execution.
>>
>> Thank you very much!
>>
>> Jose
>>
>>
>> On Tue, Jan 12, 2021 at 09:07:49AM -0800, Paul Sandoz wrote:
>>> Hi Jose,
>>>
>>> Shifting over to panama-dev (bcc’ing discuss at openjdk.java.net 
>>> <mailto:discuss at openjdk.java.net>).
>>>
>>> Can you share a complete example on x86 that is not producing what 
>>> you expect?
>>>
>>> I suspect in the PPC case some wiring up to the vector intrinsics are 
>>> missing.
>>>
>>> Paul.
>>>
>>>> On Jan 11, 2021, at 1:07 PM, joserz at linux.ibm.com wrote:
>>>>
>>>> Hello team,
>>>>
>>>> I'm currently working on the VectorAPI support to PowerPC64 but none 
>>>> of my instructions, defined in ppc64.ad, gets executed. I decided to 
>>>> take a look at x86, but again no Vector instructions printed.
>>>>
>>>> Basically, I have a test case like this:
>>>>         for (int j = 0; j < 1_000_000; j++) {
>>>>             int[] iin128 = {25, -398, 415, Short.MAX_VALUE + 2};
>>>>             short[] sout64 = new 
>>>> short[ShortVector.SPECIES_64.length()];
>>>>
>>>>             vectorCastIntToShort(IntVector.SPECIES_128,
>>>>                                  ShortVector.SPECIES_64,
>>>>                                  iin128, sout64);
>>>>         }
>>>>
>>>> That I execute like:
>>>>         java -Xcomp -XX:-TieredCompilation -XX:CompileThreshold=1 \
>>>>              -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly \
>>>>              -XX:+PrintOptoAssembly -XX:+UnlockExperimentalVMOptions \
>>>>              -XX:+EnableVectorSupport -XX:+EnableVectorReboxing \
>>>>              -XX:+EnableVectorAggressiveReboxing -XX:UseAVX=2 Cast
>>>>
>>>> And expected to see any of `format %{ "vector_* ... %}` 
>>>> instructions, defined in x86.ad, being printed.
>>>>
>>>> Am I missing anything?
>>>>
>>>> Thank you,
>>>>
>>>> Jose R Ziviani
>>>


More information about the panama-dev mailing list