<div dir="ltr"><div>Proposal to specify semantics for the FP min/max reductions:</div><div><a href="https://reviews.llvm.org/D87391">https://reviews.llvm.org/D87391</a></div><div>I'm not sure how we got to the current state of codegen for those, but it doesn't seem consistent or correct as-is, so I've proposed updates there too.<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Jun 17, 2020 at 2:15 PM Amara Emerson via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div style="overflow-wrap: break-word;">Proposed clarification here: <a href="https://reviews.llvm.org/D82034" target="_blank">https://reviews.llvm.org/D82034</a><br><div><br><blockquote type="cite"><div>On Jun 17, 2020, at 5:52 AM, Simon Pilgrim via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:</div><br><div>
  
    
  
  <div><p>A minor point, but I think we need to more explicitly describe
      the order of floating point operations in the LangRef as well:<br>
    </p><p>"If the intrinsic call has the ‘reassoc’ or ‘fast’ flags set,
      then the reduction will not preserve the associativity of an
      equivalent scalarized counterpart. Otherwise the reduction will be
      ordered, thus implying that the operation respects the
      associativity of a scalarized reduction."</p><p>Please could we add some pseudocode to show exactly how the
      intrinsic will be re-expanded for ordered cases?<br>
    </p>
    <div>On 16/06/2020 19:38, Sanjay Patel via
      llvm-dev wrote:<br>
    </div>
    <blockquote type="cite">
      
      <div dir="ltr">
        <div>We switched over to producing the intrinsics for x86 with:<br>
        </div>
        <div><a href="https://reviews.llvm.org/rGe50059f6b6b3" rel="noreferrer" target="_blank">https://reviews.llvm.org/rGe50059f6b6b3</a></div>
        <div>...I'm not aware of any regressions yet.</div>
        <div><br>
        </div>
        <div><a href="https://bugs.llvm.org/show_bug.cgi?id=45378" rel="noreferrer" target="_blank">https://bugs.llvm.org/show_bug.cgi?id=45378</a>
          is also fixed as of today.</div>
        <div><br>
        </div>
        <div>So that leaves the problem with fmin/fmax when no
          fast-math-flags are specified. We need to update the LangRef
          with whatever the expected behavior is for NaN and -0.0. <br>
        </div>
        <div>x86 will probably be poor regardless of whether we choose
          "llvm.maxnum" or "llvm.maximum" semantics.<br>
        </div>
      </div>
      <br>
      <div class="gmail_quote">
        <div dir="ltr" class="gmail_attr">On Thu, Apr 9, 2020 at 1:28 PM
          Craig Topper via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>>
          wrote:<br>
        </div>
        <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
          <div dir="ltr">No we still use the shuffle expansion which is
            why the issue isn't unique to the intrinsic.
            <div><br clear="all">
              <div>
                <div dir="ltr">~Craig</div>
              </div>
              <br>
            </div>
          </div>
          <br>
          <div class="gmail_quote">
            <div dir="ltr" class="gmail_attr">On Thu, Apr 9, 2020 at
              10:21 AM Amara Emerson <<a href="mailto:aemerson@apple.com" target="_blank">aemerson@apple.com</a>> wrote:<br>
            </div>
            <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
              <div>Has x86 switched to the intrinsics now?
                <div>
                  <div><br>
                    <blockquote type="cite">
                      <div>On Apr 9, 2020, at 10:17 AM, Craig Topper
                        <<a href="mailto:craig.topper@gmail.com" target="_blank">craig.topper@gmail.com</a>>
                        wrote:</div>
                      <br>
                      <div>
                        <div dir="ltr">
                          <div>That recent X86 bug isn't unique to the
                            intrinsic. We generate the same code from
                            this which uses the shuffle sequence the
                            vectorizers generated before the reduction
                            intrinsics existed.<br>
                            <br>
                          </div>
                          <div>declare i64
                            @llvm.experimental.vector.reduce.or.v2i64(<2
                            x i64>)·<br>
                            declare void @TrapFunc(i64)<br>
                            <br>
                            define void @parseHeaders(i64 * %ptr) {<br>
                              %vptr = bitcast i64 * %ptr to <2 x
                            i64> *<br>
                              %vload = load <2 x i64>, <2 x
                            i64> * %vptr, align 8<br>
                            <br>
                              %b = shufflevector <2 x i64> %vload,
                            <2 x i64> undef, <2 x i32>
                            <i32 1, i32 undef><br>
                              %c = or <2 x i64> %vload, %b<br>
                              %vreduce = extractelement <2 x i64>
                            %c, i32 0<br>
                            <br>
                              %vcheck = icmp eq i64 %vreduce, 0<br>
                              br i1 %vcheck, label %ret, label %trap<br>
                            trap:<br>
                              %v2 = extractelement <2 x i64>
                            %vload, i32 1<br>
                              call void @TrapFunc(i64 %v2)<br>
                              ret void<br>
                            ret:<br>
                              ret void<br>
                            }<br>
                          </div>
                          <br clear="all">
                          <div>
                            <div dir="ltr">~Craig</div>
                          </div>
                          <br>
                        </div>
                        <br>
                        <div class="gmail_quote">
                          <div dir="ltr" class="gmail_attr">On Thu, Apr
                            9, 2020 at 10:04 AM Philip Reames via
                            llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>>
                            wrote:<br>
                          </div>
                          <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">My
                            experience with them so far is that the code
                            generation for these <br>
                            intrinsics is still missing a lot of cases. 
                            Some of them are X86 <br>
                            specific (the target I look at mostly), but
                            many of them have generic forms.<br>
                            <br>
                            As one recent example, consider <br>
                            <a href="https://bugs.llvm.org/show_bug.cgi?id=45378" rel="noreferrer" target="_blank">https://bugs.llvm.org/show_bug.cgi?id=45378</a>. 
                            (There's nothing special <br>
                            about this one other than it was recent.)<br>
                            <br>
                            I'm not necessarily arguing they can't be
                            promoted from experimental, <br>
                            but it would be a much easier case if the
                            code gen was routinely as good <br>
                            or better than the scalar forms.  Or to say
                            that a bit differently, if <br>
                            we could canonicalize to them in the IR
                            without major regression.  <br>
                            Having two ways to represent something in
                            the IR without any agreed upon <br>
                            canonical form is always sub-optimal.<br>
                            <br>
                            Philip<br>
                            <br>
                            On 4/7/20 9:59 PM, Amara Emerson via
                            llvm-dev wrote:<br>
                            > Hi,<br>
                            ><br>
                            > It’s been a few years now since I added
                            some intrinsics for doing vector reductions.
                            We’ve been using them exclusively on
                            AArch64, and I’ve seen some traffic a while
                            ago on list for other targets too. Sander
                            did some work last year to refine the
                            semantics after some discussion.<br>
                            ><br>
                            > Are we at the point where we can drop
                            the “experimental” from the name? IMO all
                            target should begin to transition to using
                            these as the preferred representation for
                            reductions. But for now, I’m only proposing
                            the naming change.<br>
                            ><br>
                            > Cheers,<br>
                            > Amara<br>
                            >
                            _______________________________________________<br>
                            > LLVM Developers mailing list<br>
                            > <a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
                            > <a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
_______________________________________________<br>
                            LLVM Developers mailing list<br>
                            <a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
                            <a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
                          </blockquote>
                        </div>
                      </div>
                    </blockquote>
                  </div>
                  <br>
                </div>
              </div>
            </blockquote>
          </div>
          _______________________________________________<br>
          LLVM Developers mailing list<br>
          <a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
          <a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
        </blockquote>
      </div>
      <br>
      <fieldset></fieldset>
      <pre>_______________________________________________
LLVM Developers mailing list
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a>
</pre>
    </blockquote>
  </div>

_______________________________________________<br>LLVM Developers mailing list<br><a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br><a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br></div></blockquote></div><br></div>_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
</blockquote></div>