<div dir="ltr">Excellent. Thanks again Dave. And thanks for the testing Arnaud.<div><br></div><div>For the curious: I went back to look for the leak and it's obvious with hindsight. PoolRef's destructor was deleting the PoolEntry when the ref-count hit zero, but the assignment operator was not. This was an oversight left over from when I moved responsibility for deleting PoolEntries from PoolEntry itself out to PoolRef. It's all moot now though: Dave's solution fixes this, and is much cleaner to boot.</div><div><br></div><div>- Lang.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Sep 11, 2014 at 3:42 AM, Arnaud A. de Grandmaison <span dir="ltr"><<a href="mailto:arnaud.degrandmaison@arm.com" target="_blank">arnaud.degrandmaison@arm.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div lang="EN-GB" link="blue" vlink="purple"><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">I confirm the shared_ptr change fixes the issue. I will recommit the aarch64/pbqp test then.<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Thanks David !<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">--<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Arnaud<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal" style="margin-left:36.0pt"><b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> David Blaikie [mailto:<a href="mailto:dblaikie@gmail.com" target="_blank">dblaikie@gmail.com</a>] <br><b>Sent:</b> 11 September 2014 01:06<br><b>To:</b> Lang Hames<br><b>Cc:</b> Arnaud De Grandmaison; LLVM Developers Mailing List<br><b>Subject:</b> Re: [LLVMdev] Leaks in PBQPBuilderWithCoalescing::build ?<u></u><u></u></span></p><div><div class="h5"><p class="MsoNormal" style="margin-left:36.0pt"><u></u> <u></u></p><div><p class="MsoNormal" style="margin-left:36.0pt"><u></u> <u></u></p><div><p class="MsoNormal" style="margin-left:36.0pt"><u></u> <u></u></p><div><p class="MsoNormal" style="margin-left:36.0pt">On Wed, Sep 10, 2014 at 4:21 PM, Lang Hames <<a href="mailto:lhames@gmail.com" target="_blank">lhames@gmail.com</a>> wrote:<u></u><u></u></p><div><p class="MsoNormal" style="margin-left:36.0pt">Oooh. Neat. Thanks Dave. Please go ahead and commit that.<u></u><u></u></p></div><div><p class="MsoNormal" style="margin-left:36.0pt"><u></u> <u></u></p></div><div><p class="MsoNormal" style="margin-left:36.0pt">Committed in <span style="color:black">217563.<br><br>Running the PBQP test without my change under valgrind didn't show any memory leak, but hopefully with Arnaud's change and valgrind he can see the leak and then verify that my change addresses it... *fingers crossed*</span><u></u><u></u></p></div><div><p class="MsoNormal" style="margin-left:36.0pt"> <u></u><u></u></p></div><blockquote style="border:none;border-left:solid #cccccc 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-right:0cm"><div><div><p class="MsoNormal" style="margin-left:36.0pt"><u></u> <u></u></p></div><div><p class="MsoNormal" style="margin-left:36.0pt">Arnaud - I have no idea whether Dave's patch will help with this bug, but it's certainly worth testing.<u></u><u></u></p></div><div><p class="MsoNormal" style="margin-left:36.0pt"><span style="color:#888888"><u></u> <u></u></span></p></div><div><p class="MsoNormal" style="margin-left:36.0pt"><span style="color:#888888">- Lang.<u></u><u></u></span></p></div></div><div><div><div><p class="MsoNormal" style="margin-left:36.0pt"><u></u> <u></u></p><div><p class="MsoNormal" style="margin-left:36.0pt">On Wed, Sep 10, 2014 at 4:10 PM, David Blaikie <<a href="mailto:dblaikie@gmail.com" target="_blank">dblaikie@gmail.com</a>> wrote:<u></u><u></u></p><div><p class="MsoNormal" style="margin-left:36.0pt">While I'm not sure where the leak is, using some pre-canned memory management might help... <br><br>Attached is a patch that changes this allocation to use shared_ptr, perhaps it'll address the bug?<br><br>(ideally we shouldn't need the intrusive ref counting (std::enable_shared_from_this) but instead have a weak_set that has std::weak_ptr in it & implicitly removes elements as they become null (probably on a harvesting schedule, rather than with a direct callback as is currently implemented))​<u></u><u></u></p><div style="border:solid #dddddd 1.0pt;padding:4.0pt 4.0pt 4.0pt 4.0pt;min-height:18px;max-height:18px"><p class="MsoNormal" style="margin-left:36.0pt;background:whitesmoke"><b><span style="font-size:10.0pt;font-family:"Arial","sans-serif";color:#222222"><a href="https://docs.google.com/file/d/0B0jpkch3iC_7TXFVU2hCcUpfZXM/edit?usp=drive_web" target="_blank"><span style="border:none windowtext 1.0pt;padding:0cm;text-decoration:none"><img border="0" src="https://ssl.gstatic.com/docs/doclist/images/icon_10_generic_list.png"> </span><span style="color:#1155cc;border:none windowtext 1.0pt;padding:0cm;text-decoration:none">pbqp_leak.diff</span></a><u></u><u></u></span></b></p></div><p class="MsoNormal" style="margin-left:36.0pt">​<u></u><u></u></p></div><div><p class="MsoNormal" style="margin-left:36.0pt"><u></u> <u></u></p><div><p class="MsoNormal" style="margin-left:36.0pt">On Wed, Sep 10, 2014 at 3:19 PM, Arnaud A. de Grandmaison <<a href="mailto:arnaud.degrandmaison@arm.com" target="_blank">arnaud.degrandmaison@arm.com</a>> wrote:<u></u><u></u></p><div><div><p class="MsoNormal" style="margin-left:36.0pt"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Hi Lang,</span><u></u><u></u></p><p class="MsoNormal" style="margin-left:36.0pt"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal" style="margin-left:36.0pt"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">In PBQPBuilderWithCoalescing::build, around line 360, we have code looking like:</span><u></u><u></u></p><p class="MsoNormal" style="margin-left:36.0pt"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal" style="margin-left:36.0pt"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">…</span><u></u><u></u></p><p class="MsoNormal" style="margin-left:36.0pt"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">PBQP::Vector newCosts(g.getNodeCosts(node));</span><u></u><u></u></p><p class="MsoNormal" style="margin-left:36.0pt"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">addPhysRegCoalesce(newCosts, pregOpt, cBenefit);</span><u></u><u></u></p><p class="MsoNormal" style="margin-left:36.0pt"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">g.setNodeCosts(node, newCosts);</span><u></u><u></u></p><p class="MsoNormal" style="margin-left:36.0pt"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">…</span><u></u><u></u></p><p class="MsoNormal" style="margin-left:36.0pt"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal" style="margin-left:36.0pt"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">I suspect the leak occurs around the setNodeCosts method, and I have trouble understanding how it handles the case where the node already has costs.</span><u></u><u></u></p><p class="MsoNormal" style="margin-left:36.0pt"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal" style="margin-left:36.0pt"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">It seems to me that:</span><u></u><u></u></p><p class="MsoNormal" style="margin-left:36.0pt"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">- we make of copy of the node’s costs (probably because someone else can refer to it ?)</span><u></u><u></u></p><p class="MsoNormal" style="margin-left:36.0pt"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">- we modify the copy</span><u></u><u></u></p><p class="MsoNormal" style="margin-left:36.0pt"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">- we set the node’s new costs. But what is supposed to happen there, especially in the CostAllocator part ?</span><u></u><u></u></p><p class="MsoNormal" style="margin-left:36.0pt"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal" style="margin-left:36.0pt"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Could you shed some light there ?</span><u></u><u></u></p><p class="MsoNormal" style="margin-left:36.0pt"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal" style="margin-left:36.0pt"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Thanks,</span><u></u><u></u></p><p class="MsoNormal" style="margin-left:36.0pt"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Arnaud</span><u></u><u></u></p><p class="MsoNormal" style="margin-left:36.0pt"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal" style="margin-left:36.0pt"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal" style="margin-left:36.0pt"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal" style="margin-left:72.0pt"><b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> Lang Hames [mailto:<a href="mailto:lhames@gmail.com" target="_blank">lhames@gmail.com</a>] <br><b>Sent:</b> 10 September 2014 19:26<br><b>To:</b> Arnaud De Grandmaison<br><b>Subject:</b> Re: Leaks in PBQPBuilderWithCoalescing::build ?</span><u></u><u></u></p><p class="MsoNormal" style="margin-left:72.0pt"> <u></u><u></u></p><div><p class="MsoNormal" style="margin-left:72.0pt">Thanks Arnaud!<u></u><u></u></p><div><p class="MsoNormal" style="margin-left:72.0pt"> <u></u><u></u></p></div><div><p class="MsoNormal" style="margin-left:72.0pt">- Lang.<u></u><u></u></p></div></div><div><p class="MsoNormal" style="margin-left:72.0pt"> <u></u><u></u></p><div><p class="MsoNormal" style="margin-left:72.0pt">On Wed, Sep 10, 2014 at 11:23 AM, Arnaud A. de Grandmaison <<a href="mailto:arnaud.degrandmaison@arm.com" target="_blank">arnaud.degrandmaison@arm.com</a>> wrote:<u></u><u></u></p><div><div><p class="MsoNormal" style="margin-left:72.0pt">Hi Lang,<u></u><u></u></p><p class="MsoNormal" style="margin-left:72.0pt"> <u></u><u></u></p><p class="MsoNormal" style="margin-left:72.0pt">For your information, the leak sanitizer found something when I committed my patch:<u></u><u></u></p><p class="MsoNormal" style="margin-left:72.0pt"> <u></u><u></u></p><p class="MsoNormal" style="margin-left:72.0pt"><a href="http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-bootstrap/builds/4506/steps/check-llvm%20asan/logs/stdio" target="_blank">http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-bootstrap/builds/4506/steps/check-llvm%20asan/logs/stdio</a><u></u><u></u></p><p class="MsoNormal" style="margin-left:72.0pt"> <u></u><u></u></p><p class="MsoNormal" style="margin-left:72.0pt">I will try to have a look at it.<u></u><u></u></p><p class="MsoNormal" style="margin-left:72.0pt"> <u></u><u></u></p><p class="MsoNormal" style="margin-left:72.0pt">Cheers,<u></u><u></u></p><p class="MsoNormal" style="margin-left:72.0pt">--<u></u><u></u></p><p class="MsoNormal" style="margin-left:72.0pt">Arnaud A. de Grandmaison<u></u><u></u></p><p class="MsoNormal" style="margin-left:72.0pt"> <u></u><u></u></p></div></div></div><p class="MsoNormal" style="margin-left:72.0pt"> <u></u><u></u></p></div></div></div><p class="MsoNormal" style="margin-right:0cm;margin-bottom:12.0pt;margin-left:36.0pt"><br>_______________________________________________<br>LLVM Developers mailing list<br><a href="mailto:LLVMdev@cs.uiuc.edu" target="_blank">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br><a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><u></u><u></u></p></div><p class="MsoNormal" style="margin-left:36.0pt"><u></u> <u></u></p></div></div><p class="MsoNormal" style="margin-left:36.0pt"><u></u> <u></u></p></div></div></div></blockquote></div><p class="MsoNormal" style="margin-left:36.0pt"><u></u> <u></u></p></div></div></div></div></div></div></blockquote></div><br></div>