<div dir="ltr"><div><div><div>Hi Hans -<br><br></div>Yes, that looks like a sufficient fix for the bug. It won't have the optimization provided by r243498:<br><a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Fview-3Drevision-26revision-3D243498&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=w4_cCnPV5XrJCzrR7v1k_Ck8Ot0z43fRtx1-9XDKQ_w&s=1jyoWko4rqeXrnzBoyMYPzCoOK4I7cdGlrUZeFCPNKg&e=">http://llvm.org/viewvc/llvm-project?view=revision&revision=243498</a><br></div><br>...but the SetVector should be all that's needed to avoid the duplicates in the list that caused the crash.<br><br></div>Implementation/design question: does anyone know why we have duplicate users in the uses() list in the first place? Ie, why do we implement uses as a linked list rather than a set?<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jul 29, 2015 at 9:41 AM, Hans Wennborg <span dir="ltr"><<a href="mailto:hans@chromium.org" target="_blank">hans@chromium.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Thanks everyone! Merged in<br>
<a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D243524-26view-3Drev&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=w4_cCnPV5XrJCzrR7v1k_Ck8Ot0z43fRtx1-9XDKQ_w&s=o-jwp3RlS9xnxiecWhNBBO_Ff7IbW-ZE7cx1l-2F0u4&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=243524&view=rev</a><br>
<br>
Sanjay: there were merge conflicts due to r243293 not being in the<br>
branch. Can you double check that I got it right?<br>
<div class="HOEnZb"><div class="h5"><br>
On Tue, Jul 28, 2015 at 10:03 PM, Owen Anderson <<a href="mailto:resistor@mac.com">resistor@mac.com</a>> wrote:<br>
> OK to merge.<br>
><br>
> —Owen<br>
><br>
>> On Jul 28, 2015, at 6:00 PM, Hans Wennborg <<a href="mailto:hans@chromium.org">hans@chromium.org</a>> wrote:<br>
>><br>
>> 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">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=w4_cCnPV5XrJCzrR7v1k_Ck8Ot0z43fRtx1-9XDKQ_w&s=5gOxU60u9Nf24K44SCBoePxYmqb-3v8a-EByYcQzifs&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=w4_cCnPV5XrJCzrR7v1k_Ck8Ot0z43fRtx1-9XDKQ_w&s=QWgEmDvopM0TF-U7kusgF8y_3JQ7st2WVivRauPM9oE&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=w4_cCnPV5XrJCzrR7v1k_Ck8Ot0z43fRtx1-9XDKQ_w&s=T8iJaCEkQmEXAWk7EbtjwSQRSJ8zoXuOxtokyniuDZE&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=w4_cCnPV5XrJCzrR7v1k_Ck8Ot0z43fRtx1-9XDKQ_w&s=lxoXiM-esaFU1LBG_aL5m5pdMmKj8NDpCtehhDn6HWY&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=w4_cCnPV5XrJCzrR7v1k_Ck8Ot0z43fRtx1-9XDKQ_w&s=qWPNdNr5F_-VAtwK8ycIXRlK3hNjw17p8ohiwLnjnwY&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">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>
</div></div></blockquote></div><br></div>