From f28c057c421122d0d0355e3cef496ef2de7a1f7f Mon Sep 17 00:00:00 2001 From: Chandler Carruth Date: Wed, 26 Feb 2014 04:45:24 +0000 Subject: [PATCH] [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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@202229 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/SROA.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/Transforms/Scalar/SROA.cpp b/lib/Transforms/Scalar/SROA.cpp index 2ecc517d485..d0f2561dd33 100644 --- a/lib/Transforms/Scalar/SROA.cpp +++ b/lib/Transforms/Scalar/SROA.cpp @@ -2393,10 +2393,11 @@ private: // pointer to the new alloca. if (!isa(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;