<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <p>How about initializing TypeVect::VECTY and friends
      unconditionally?  I am nervous about exchanging one guarding
      condition for another.</p>
    <p>dl</p>
    <p><br>
    </p>
    <div class="moz-cite-prefix">On 10/18/17 1:03 AM, Nils Eliasson
      wrote:<br>
    </div>
    <blockquote type="cite"
      cite="mid:d388a699-1c03-ea9d-41ed-0d6e46c880d3@oracle.com">
      <meta http-equiv="content-type" content="text/html; charset=utf-8">
      <p>HI,</p>
      <p>I ran into a problem with the interaction between MaxVectorSize
        and the UseAVX. For some AMD CPUs we limit the vector size to 16
        because it gives the best performance.</p>
      <blockquote type="cite" style="color: #000000;">+    if
        (cpu_family() < 0x17 && MaxVectorSize > 16) { <br>
        +      // Limit vectors size to 16 bytes on AMD cpus < 17h. <br>
               FLAG_SET_DEFAULT(MaxVectorSize, 16); <br>
             } <br>
      </blockquote>
      <br>
      Whenf MaxVecorSize is set to 16 it has the sideeffect that the
      TypeVect::VECTY and mreg2type[Op_VecY] won't be initalized even
      though the platform has the capability. <br>
      <br>
      Type.cpp:~660 <br>
      <br>
      [...] <br>
      >   if (Matcher::vector_size_supported(T_FLOAT,8)) { <br>
      >     TypeVect::VECTY = TypeVect::make(T_FLOAT,8); <br>
      >   } <br>
      [...] <br>
      >   mreg2type[Op_VecY] = TypeVect::VECTY; <br>
      <br>
      <br>
      In the ad-files feature flags (UseAVX etc.) are used to control
      what rules should be matched if it has effects on specific vector
      registers. Here we have a mismatch. <br>
      <br>
      On a platform that supports AVX2 but have MaxVectorSize limited to
      16, the VM will fail when the TypeVect::VECTY/mreg2type[Op_VecY]
      is uninitialized. We will also hit asserts in a few places like:
      assert(Matcher::vector_size_supported(T_FLOAT,RegMask::SlotsPerVecY),
      "sanity"); <br>
      <br>
      Shouldn't the type initialization in type.cpp be dependent on
      feature flag (UseAVX etc.) instead of MaxVectorSize? (The type for
      the vector registers are initialized if the platform supports
      them, but they might not be used if MaxVectorSize is limited.) <br>
      <br>
      This is a patch that solves the problem, but I have not convinced
      myself that it is the right way:<br>
      <a class="moz-txt-link-freetext"
        href="http://cr.openjdk.java.net/%7Eneliasso/maxvectorsize/webrev/"
        moz-do-not-send="true">http://cr.openjdk.java.net/~neliasso/maxvectorsize/webrev/</a>
      <br>
      <br>
      Feedback appreciated,<br>
      <br>
      Regards, <br>
      Nils Eliasson
      <p><br>
      </p>
      <p><br>
      </p>
      <p><br>
      </p>
      <p><br>
      </p>
      <p><a class="moz-txt-link-freetext"
          href="http://cr.openjdk.java.net/%7Eneliasso/maxvectorsize/webrev/"
          moz-do-not-send="true">http://cr.openjdk.java.net/~neliasso/maxvectorsize/webrev/</a><br>
      </p>
    </blockquote>
    <br>
  </body>
</html>