<div dir="ltr">FWIW, it was a regression we found in the wild, so I think it should be merged.</div><br><div class="gmail_quote"><div dir="ltr">On Tue, Jul 28, 2015 at 6:03 PM Hans Wennborg <<a href="mailto:hans@chromium.org">hans@chromium.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">We should probably merge this to 3.7.<br>
<br>
Owen, you're the owner here. OK to merge?<br>
<br>
On Tue, Jul 28, 2015 at 4:28 PM, Sanjay Patel <<a href="mailto:spatel@rotateright.com" target="_blank">spatel@rotateright.com</a>> wrote:<br>
> Author: spatel<br>
> Date: Tue Jul 28 18:28:22 2015<br>
> New Revision: 243500<br>
><br>
> URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D243500-26view-3Drev&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=DPtrgEC4-cht7pN0u31Bep25QVnUtHtbotP-vwXQnHQ&s=37AHwTzHBuR6ByE-H5NyoD0lBrVlUBDWufGvabyd50E&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=243500&view=rev</a><br>
> Log:<br>
> ignore duplicate divisor uses when transforming into reciprocal multiplies (PR24141)<br>
><br>
> PR24141: <a href="https://urldefense.proofpoint.com/v2/url?u=https-3A__llvm.org_bugs_show-5Fbug.cgi-3Fid-3D24141&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=DPtrgEC4-cht7pN0u31Bep25QVnUtHtbotP-vwXQnHQ&s=Faj41KTUOJ4JQnFRbGP7zrM-JRgcZVVzE-hIvjOvGi8&e=" rel="noreferrer" target="_blank">https://llvm.org/bugs/show_bug.cgi?id=24141</a><br>
> contains a test case where we have duplicate entries in a node's uses() list.<br>
><br>
> After r241826, we use CombineTo() to delete dead nodes when combining the uses into<br>
> reciprocal multiplies, but this fails if we encounter the just-deleted node again in<br>
> the list.<br>
><br>
> The solution in this patch is to not add duplicate entries to the list of users that<br>
> we will subsequently iterate over. For the test case, this avoids triggering the<br>
> combine divisors logic entirely because there really is only one user of the divisor.<br>
><br>
> Differential Revision: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__reviews.llvm.org_D11345&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=DPtrgEC4-cht7pN0u31Bep25QVnUtHtbotP-vwXQnHQ&s=2iLixpePcXsHDeKypPWzBcSOJtOHNijKipNvzhDN1ew&e=" rel="noreferrer" target="_blank">http://reviews.llvm.org/D11345</a><br>
><br>
><br>
> Modified:<br>
>     llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp<br>
>     llvm/trunk/test/CodeGen/X86/fdiv-combine.ll<br>
><br>
> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp<br>
> URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_CodeGen_SelectionDAG_DAGCombiner.cpp-3Frev-3D243500-26r1-3D243499-26r2-3D243500-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=DPtrgEC4-cht7pN0u31Bep25QVnUtHtbotP-vwXQnHQ&s=uw6YAuwBVAs5NU-E36Bm3N65TI9aDn28S5eKx5LLqJo&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=243500&r1=243499&r2=243500&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original)<br>
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Tue Jul 28 18:28:22 2015<br>
> @@ -8261,11 +8261,11 @@ SDValue DAGCombiner::combineRepeatedFPDi<br>
>      return SDValue();<br>
><br>
>    // Find all FDIV users of the same divisor.<br>
> -  SmallVector<SDNode *, 4> Users;<br>
> -  for (auto *U : N1->uses()) {<br>
> +  // Use a set because duplicates may be present in the user list.<br>
> +  SetVector<SDNode *> Users;<br>
> +  for (auto *U : N1->uses())<br>
>      if (U->getOpcode() == ISD::FDIV && U->getOperand(1) == N1)<br>
> -      Users.push_back(U);<br>
> -  }<br>
> +      Users.insert(U);<br>
><br>
>    // Now that we have the actual number of divisor uses, make sure it meets<br>
>    // the minimum threshold specified by the target.<br>
><br>
> Modified: llvm/trunk/test/CodeGen/X86/fdiv-combine.ll<br>
> URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_test_CodeGen_X86_fdiv-2Dcombine.ll-3Frev-3D243500-26r1-3D243499-26r2-3D243500-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=DPtrgEC4-cht7pN0u31Bep25QVnUtHtbotP-vwXQnHQ&s=PcDxPX5hdJKuDNg1Wi-9zmiiUTm0rTNaU5h3hZl_gnc&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/fdiv-combine.ll?rev=243500&r1=243499&r2=243500&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/test/CodeGen/X86/fdiv-combine.ll (original)<br>
> +++ llvm/trunk/test/CodeGen/X86/fdiv-combine.ll Tue Jul 28 18:28:22 2015<br>
> @@ -44,5 +44,24 @@ define double @div3_arcp(double %x, doub<br>
>    ret double %ret<br>
>  }<br>
><br>
> +define void @PR24141() #0 {<br>
> +; CHECK-LABEL: PR24141:<br>
> +; CHECK:       callq<br>
> +; CHECK-NEXT:  divsd<br>
> +; CHECK-NEXT:  jmp<br>
> +entry:<br>
> +  br label %while.body<br>
> +<br>
> +while.body:<br>
> +  %x.0 = phi double [ undef, %entry ], [ %div, %while.body ]<br>
> +  %call = call { double, double } @g(double %x.0)<br>
> +  %xv0 = extractvalue { double, double } %call, 0<br>
> +  %xv1 = extractvalue { double, double } %call, 1<br>
> +  %div = fdiv double %xv0, %xv1<br>
> +  br label %while.body<br>
> +}<br>
> +<br>
> +declare { double, double } @g(double)<br>
> +<br>
>  ; FIXME: If the backend understands 'arcp', then this attribute is unnecessary.<br>
>  attributes #0 = { "unsafe-fp-math"="true" }<br>
><br>
><br>
> _______________________________________________<br>
> llvm-commits mailing list<br>
> <a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">llvm-commits@cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>