diff options
| author | Chandler Carruth <chandlerc@gmail.com> | 2014-02-26 04:45:24 +0000 |
|---|---|---|
| committer | Chandler Carruth <chandlerc@gmail.com> | 2014-02-26 04:45:24 +0000 |
| commit | 735d5bee48099750293410192757da3a494a4da5 (patch) | |
| tree | 1ba18d14f7135523123fee411c5b1ed6d7bb8ccf /llvm/lib/Transforms | |
| parent | ea27cf08d823dd8d01c8093d3c59f0686cbf31d0 (diff) | |
| download | bcm5719-llvm-735d5bee48099750293410192757da3a494a4da5.tar.gz bcm5719-llvm-735d5bee48099750293410192757da3a494a4da5.zip | |
[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
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/SROA.cpp | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/Scalar/SROA.cpp b/llvm/lib/Transforms/Scalar/SROA.cpp index 2ecc517d485..d0f2561dd33 100644 --- a/llvm/lib/Transforms/Scalar/SROA.cpp +++ b/llvm/lib/Transforms/Scalar/SROA.cpp @@ -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; |

