summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTanya Lattner <tonic@nondot.org>2009-09-16 01:10:57 +0000
committerTanya Lattner <tonic@nondot.org>2009-09-16 01:10:57 +0000
commitc47a943d7b1fac192844d6f837d3b7d441dc0f9e (patch)
treeab78d5885aca86045e1a9d15b9970fc4ad1f080c
parent318048b28887b27e3da60346cfa94bf4ef5c4558 (diff)
downloadllvm-c47a943d7b1fac192844d6f837d3b7d441dc0f9e.tar.gz
Merge 81810 from mainline.
When extending a memset range past the front, set the alignment of the memset region to the alignment of the new start address. llvm-svn: 81976
-rw-r--r--llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp1
-rw-r--r--llvm/test/Transforms/MemCpyOpt/align.ll18
2 files changed, 19 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp b/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp
index f6da52931e91..5182b4b4bcd8 100644
--- a/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp
+++ b/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp
@@ -271,6 +271,7 @@ void MemsetRanges::addStore(int64_t Start, StoreInst *SI) {
if (Start < I->Start) {
I->Start = Start;
I->StartPtr = SI->getPointerOperand();
+ I->Alignment = SI->getAlignment();
}
// Now we know that Start <= I->End and Start >= I->Start (so the startpoint
diff --git a/llvm/test/Transforms/MemCpyOpt/align.ll b/llvm/test/Transforms/MemCpyOpt/align.ll
new file mode 100644
index 000000000000..a9d03378521f
--- /dev/null
+++ b/llvm/test/Transforms/MemCpyOpt/align.ll
@@ -0,0 +1,18 @@
+; RUN: opt < %s -S -memcpyopt | FileCheck %s
+
+; The resulting memset is only 4-byte aligned, despite containing
+; a 16-byte alignmed store in the middle.
+
+; CHECK: call void @llvm.memset.i64(i8* %a01, i8 0, i64 16, i32 4)
+
+define void @foo(i32* %p) {
+ %a0 = getelementptr i32* %p, i64 0
+ store i32 0, i32* %a0, align 4
+ %a1 = getelementptr i32* %p, i64 1
+ store i32 0, i32* %a1, align 16
+ %a2 = getelementptr i32* %p, i64 2
+ store i32 0, i32* %a2, align 4
+ %a3 = getelementptr i32* %p, i64 3
+ store i32 0, i32* %a3, align 4
+ ret void
+}