Analogous fix to memset and memcpy rewriting. Don't have a test case
authorChandler Carruth <chandlerc@gmail.com>
Wed, 26 Sep 2012 10:59:22 +0000 (10:59 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Wed, 26 Sep 2012 10:59:22 +0000 (10:59 +0000)
contrived for these yet, as I spotted them by inspection and the test
cases are a bit more tricky to phrase.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@164691 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/SROA.cpp

index 67246a5a1cc7ddb06d1e6c1c6337c85159db9e15..cf12cfca18e8afd390686ca14cc4fd838147e15c 100644 (file)
@@ -2064,6 +2064,15 @@ private:
     // pointer to the new alloca.
     if (!isa<Constant>(II.getLength())) {
       II.setDest(getAdjustedAllocaPtr(IRB, II.getRawDest()->getType()));
+
+      Type *CstTy = II.getAlignmentCst()->getType();
+      if (!NewAI.getAlignment())
+        II.setAlignment(ConstantInt::get(CstTy, 0));
+      else
+        II.setAlignment(
+          ConstantInt::get(CstTy, MinAlign(NewAI.getAlignment(),
+                                           BeginOffset - NewAllocaBeginOffset)));
+
       deleteIfTriviallyDead(OldPtr);
       return false;
     }
@@ -2187,6 +2196,13 @@ private:
       else
         II.setSource(getAdjustedAllocaPtr(IRB, II.getRawSource()->getType()));
 
+      Type *CstTy = II.getAlignmentCst()->getType();
+      if (II.getAlignment() > 1)
+        II.setAlignment(ConstantInt::get(
+            CstTy, MinAlign(II.getAlignment(),
+                            MinAlign(NewAI.getAlignment(),
+                                     BeginOffset - NewAllocaBeginOffset))));
+
       DEBUG(dbgs() << "          to: " << II << "\n");
       deleteIfTriviallyDead(OldOp);
       return false;