1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 03:02:36 +01:00

[SROA] Use NewOffsetBegin in the unsplit case for memset merely for

consistency with memcpy rewriting, and fix a latent bug in the alignment
management for memset.

The alignment issue is that getAdjustedAllocaPtr is computing the
*relative* offset into the new alloca, but the alignment isn't being set
to the relative offset, it was using the the absolute offset which is
into the old alloca.

I don't think its possible to write a test case that actually reaches
this code where the resulting alignment would be observably different,
but the intent was clearly to use the relative offset within the new
alloca.

llvm-svn: 202229
This commit is contained in:
Chandler Carruth 2014-02-26 04:45:24 +00:00
parent 4eab6cfb07
commit c8cbd02c0c

View File

@ -2393,10 +2393,11 @@ private:
// pointer to the new alloca.
if (!isa<Constant>(II.getLength())) {
assert(!IsSplit);
assert(BeginOffset >= NewAllocaBeginOffset);
II.setDest(getAdjustedAllocaPtr(IRB, BeginOffset, OldPtr->getType()));
assert(NewBeginOffset == BeginOffset);
II.setDest(getAdjustedAllocaPtr(IRB, NewBeginOffset, OldPtr->getType()));
Type *CstTy = II.getAlignmentCst()->getType();
II.setAlignment(ConstantInt::get(CstTy, getOffsetAlign(BeginOffset)));
II.setAlignment(ConstantInt::get(
CstTy, getOffsetAlign(NewBeginOffset - NewAllocaBeginOffset)));
deleteIfTriviallyDead(OldPtr);
return false;