[polly] r225326 - Do not use a const Twine here

Mehdi Amini mehdi.amini at apple.com
Tue Jan 6 17:00:14 PST 2015


> On Jan 6, 2015, at 4:55 PM, Mehdi Amini <mehdi.amini at apple.com> wrote:
> 
>> 
>> On Jan 6, 2015, at 4:39 PM, Tobias Grosser <tobias at grosser.es> wrote:
>> 
>> On 07.01.2015 01:33, David Blaikie wrote:
>>> 
>>> 
>>> On Tue, Jan 6, 2015 at 4:30 PM, Tobias Grosser <tobias at grosser.es
>>> <mailto:tobias at grosser.es>> wrote:
>>> 
>>>   Author: grosser
>>>   Date: Tue Jan  6 18:30:01 2015
>>>   New Revision: 225326
>>> 
>>>   URL: http://llvm.org/viewvc/llvm-project?rev=225326&view=rev
>>>   Log:
>>>   Do not use a const Twine here
>>> 
>>>   This has caused segfaults when using Polly in the context of Julia,
>>>   that are
>>>   not reproducible on my machine in 'make check-polly'.
>>> 
>>>   Modified:
>>>        polly/trunk/lib/CodeGen/IslExprBuilder.cpp
>>> 
>>>   Modified: polly/trunk/lib/CodeGen/IslExprBuilder.cpp
>>>   URL:
>>>   http://llvm.org/viewvc/llvm-project/polly/trunk/lib/CodeGen/IslExprBuilder.cpp?rev=225326&r1=225325&r2=225326&view=diff
>>>   ==============================================================================
>>>   --- polly/trunk/lib/CodeGen/IslExprBuilder.cpp (original)
>>>   +++ polly/trunk/lib/CodeGen/IslExprBuilder.cpp Tue Jan  6 18:30:01 2015
>>>   @@ -112,7 +112,7 @@ Value *IslExprBuilder::createAccessAddre
>>>       const ScopArrayInfo *SAI = ScopArrayInfo::getFromId(BaseId);
>>>       Base = SAI->getBasePtr();
>>>       assert(Base->getType()->isPointerTy() && "Access base should be
>>>   a pointer");
>>>   -  const Twine &BaseName = Base->getName();
>>>   +  auto BaseName = Base->getName();
>>> 
>>> 
>>> So what type does getName return? StringRef?
>> 
>> Base is an llvm::Value and llvm::Value's getName() function returns a StringRef, yes.
>> 
>> Are you saying I should not use 'auto' here? Or do you have an explanation for the memory corruption I am seeing?
> 
> Isn’t it possible that the issue was taking a Twine by reference?

Update: taking by reference or not does not change anything here, the same reasoning applies if you construct a Twine out of a temporary StringRef.

Mehdi


> I mean the return object is a temporary StringRef, it will be destroyed unless bound to a temporary. However there is a Twine constructor which is called for the conversion here, so the temp is bound to the argument of the Twine ctor and its lifetime ends with the ctor.
> You Twine reference a destroyed StringRef after that.
> 
> Mehdi
> 
> 
> 
>> 
>> Cheers,
>> Tobias
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits





More information about the llvm-commits mailing list