<div dir="ltr"><div>I agree with your guess: the loop vectorizer doesn't know how to match the 'minnum' intrinsics into a reduction yet. The SLP vectorizer is missing that functionality too. We need to update/consolidate both to recognize the FP min/max intrinsics as well as the recently added integer min/max intrinsics ( <a href="http://llvm.org/docs/LangRef.html#llvm-smax-intrinsic" target="_blank">http://llvm.org/docs/LangRef.html#llvm-smax-intrinsic</a> ).<br></div><div><br></div><div>cc'ing Craig to see if anything has happened since:</div><div><a href="https://reviews.llvm.org/rGc195ae2" target="_blank">https://reviews.llvm.org/rGc195ae2</a></div><div><br></div><div>I just changed the x86 cost model to remove what could have been another roadblock:</div><div> <a href="https://reviews.llvm.org/rG136f98e52365" rel="noreferrer" target="_blank">https://reviews.llvm.org/rG136f98e52365</a></div><div>We may need to extend that kind of cost model fix-up to other targets. <br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Nov 24, 2020 at 4:17 PM Mark Schimmel 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 lang="EN-US">
<div>
<p class="MsoNormal"><span style="font-size:12pt">LLVM vectorizes this same function for floating point addition just fine (uses experimental_vector_reduce_v2_fadd), but refuses to do the same for minf(). Does anyone have any insight why that would be? I’m
 using -ffast-math but that doesn’t seem to help. <u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt">From grep’ing the sources the best I can figure is that some logic exists for Instruction::FCmp but perhaps not for Intrinsic::</span>
<span style="font-size:12pt">minnum. Is that the case?<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt">; Function Attrs: norecurse nounwind readonly<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt">define float @f(float addrspace(4)* noalias nocapture readonly %a, float addrspace(4)* noalias nocapture readonly %b, float %m) local_unnamed_addr #0 {<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt">entry:<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt">  br label %for.body<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt">for.cond.cleanup:                                 ; preds = %for.body<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt">  ret float %3<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt">for.body:                                         ; preds = %entry, %for.body<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt">  %m.addr.024 = phi float [ %m, %entry ], [ %3, %for.body ] ; [#uses=1 type=float]<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt">  %i.023 = phi i32 [ 0, %entry ], [ %inc, %for.body ] ; [#uses=3 type=i32]<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt">  %arrayidx = getelementptr inbounds float, float addrspace(4)* %a, i32 %i.023 ; [#uses=1 type=float addrspace(4)*]<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt">  %0 = load float, float addrspace(4)* %arrayidx, align 4, !tbaa !3 ; [#uses=1 type=float]<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt">  %arrayidx1 = getelementptr inbounds float, float addrspace(4)* %b, i32 %i.023 ; [#uses=1 type=float addrspace(4)*]<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt">  %1 = load float, float addrspace(4)* %arrayidx1, align 4, !tbaa !3 ; [#uses=1 type=float]<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt">  %2 = tail call fast float @llvm.minnum.f32(float %0, float %1) ; [#uses=1 type=float]<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt">  %3 = tail call fast float @llvm.minnum.f32(float %m.addr.024, float %2) ; [#uses=2 type=float]<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt">  %inc = add nuw nsw i32 %i.023, 1                ; [#uses=2 type=i32]<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt">  %cmp = icmp ult i32 %inc, 8192                  ; [#uses=1 type=i1]<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt">  br i1 %cmp, label %for.body, label %for.cond.cleanup, !llvm.loop !7<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt">}<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt">LV: Checking a loop in "f" from /path/to/x.c<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt">LV: Loop hints: force=enabled width=0 unroll=0 optspace=0<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt">LV: Found a loop: for.body<u></u><u></u></span></p>
<p class="MsoNormal"><b><span style="font-size:12pt">LV: Not vectorizing: Found an unidentified PHI   %m.addr.024 = phi float [ %m, %entry ], [ %3, %for.body ] ; [#uses=1 type=float]<u></u><u></u></span></b></p>
<p class="MsoNormal"><span style="font-size:12pt">LV: Interleaving disabled by the pass manager<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt">LV: Can't vectorize the instructions or CFG<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt">LV: Not vectorizing: Cannot prove legality.<u></u><u></u></span></p>
</div>
</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>