<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jan 6, 2015 at 4:39 PM, Tobias Grosser <span dir="ltr"><<a href="mailto:tobias@grosser.es" target="_blank">tobias@grosser.es</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On 07.01.2015 01:33, David Blaikie wrote:<br>
</span><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">
<br>
<br>
On Tue, Jan 6, 2015 at 4:30 PM, Tobias Grosser <<a href="mailto:tobias@grosser.es" target="_blank">tobias@grosser.es</a><br></span><div><div class="h5">
<mailto:<a href="mailto:tobias@grosser.es" target="_blank">tobias@grosser.es</a>>> wrote:<br>
<br>
    Author: grosser<br>
    Date: Tue Jan  6 18:30:01 2015<br>
    New Revision: 225326<br>
<br>
    URL: <a href="http://llvm.org/viewvc/llvm-project?rev=225326&view=rev" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project?rev=225326&view=rev</a><br>
    Log:<br>
    Do not use a const Twine here<br>
<br>
    This has caused segfaults when using Polly in the context of Julia,<br>
    that are<br>
    not reproducible on my machine in 'make check-polly'.<br>
<br>
    Modified:<br>
         polly/trunk/lib/CodeGen/<u></u>IslExprBuilder.cpp<br>
<br>
    Modified: polly/trunk/lib/CodeGen/<u></u>IslExprBuilder.cpp<br>
    URL:<br>
    <a href="http://llvm.org/viewvc/llvm-project/polly/trunk/lib/CodeGen/IslExprBuilder.cpp?rev=225326&r1=225325&r2=225326&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/polly/trunk/lib/<u></u>CodeGen/IslExprBuilder.cpp?<u></u>rev=225326&r1=225325&r2=<u></u>225326&view=diff</a><br>
    ==============================<u></u>==============================<u></u>==================<br>
    --- polly/trunk/lib/CodeGen/<u></u>IslExprBuilder.cpp (original)<br>
    +++ polly/trunk/lib/CodeGen/<u></u>IslExprBuilder.cpp Tue Jan  6 18:30:01 2015<br>
    @@ -112,7 +112,7 @@ Value *IslExprBuilder::<u></u>createAccessAddre<br>
        const ScopArrayInfo *SAI = ScopArrayInfo::getFromId(<u></u>BaseId);<br>
        Base = SAI->getBasePtr();<br>
        assert(Base->getType()-><u></u>isPointerTy() && "Access base should be<br>
    a pointer");<br>
    -  const Twine &BaseName = Base->getName();<br>
    +  auto BaseName = Base->getName();<br>
<br>
<br>
So what type does getName return? StringRef?<br>
</div></div></blockquote>
<br>
Base is an llvm::Value and llvm::Value's getName() function returns a StringRef, yes.<br>
<br>
Are you saying I should not use 'auto' here?</blockquote><div><br>Wasn't what I was saying, but now I will ;) I think, if it's that subtle, it's probably worth being explicit<br> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"> Or do you have an explanation for the memory corruption I am seeing?<br></blockquote><div><br>As the other parts of this email thread discussed, the StringRef is returned by value, and is thus a temporary in the expression. The Twine only takes a pointer/reference to it, so the Twine persists (due to reference lifetime extension stuff) but it refers to a StringRef that is destroyed.<br> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Cheers,<br>
Tobias<br>
</blockquote></div><br></div></div>