[llvm-commits] [llvm] r81810 - in /llvm/trunk: lib/Transforms/Scalar/MemCpyOptimizer.cpp test/Transforms/MemCpyOpt/align.ll

Dan Gohman gohman at apple.com
Mon Sep 14 16:39:10 PDT 2009


Author: djg
Date: Mon Sep 14 18:39:10 2009
New Revision: 81810

URL: http://llvm.org/viewvc/llvm-project?rev=81810&view=rev
Log:
When extending a memset range past the front, set the alignment of the
memset region to the alignment of the new start address.

Added:
    llvm/trunk/test/Transforms/MemCpyOpt/align.ll
Modified:
    llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp?rev=81810&r1=81809&r2=81810&view=diff

==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp Mon Sep 14 18:39:10 2009
@@ -273,6 +273,7 @@
   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

Added: llvm/trunk/test/Transforms/MemCpyOpt/align.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/MemCpyOpt/align.ll?rev=81810&view=auto

==============================================================================
--- llvm/trunk/test/Transforms/MemCpyOpt/align.ll (added)
+++ llvm/trunk/test/Transforms/MemCpyOpt/align.ll Mon Sep 14 18:39:10 2009
@@ -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
+}





More information about the llvm-commits mailing list