[llvm-commits] [llvm] r65365 - /llvm/trunk/test/Transforms/InstCombine/stack-overalign.ll

Dan Gohman gohman at apple.com
Mon Feb 23 18:17:42 PST 2009


Author: djg
Date: Mon Feb 23 20:17:42 2009
New Revision: 65365

URL: http://llvm.org/viewvc/llvm-project?rev=65365&view=rev
Log:
Add a testcase for the problem fixed in r65289.

Added:
    llvm/trunk/test/Transforms/InstCombine/stack-overalign.ll

Added: llvm/trunk/test/Transforms/InstCombine/stack-overalign.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/stack-overalign.ll?rev=65365&view=auto

==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/stack-overalign.ll (added)
+++ llvm/trunk/test/Transforms/InstCombine/stack-overalign.ll Mon Feb 23 20:17:42 2009
@@ -0,0 +1,29 @@
+; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep {align 32} | count 1
+
+; It's tempting to have an instcombine in which the src pointer of a
+; memcpy is aligned up to the alignment of the destination, however
+; there are pitfalls. If the src is an alloca, aligning it beyond what
+; the target's stack pointer is aligned at will require dynamic
+; stack realignment, which can require functions that don't otherwise
+; need a frame pointer to need one.
+;
+; Abstaining from this transform is not the only way to approach this
+; issue. Some late phase could be smart enough to reduce alloca
+; alignments when they are greater than they need to be. Or, codegen
+; could do dynamic alignment for just the one alloca, and leave the
+; main stack pointer at its standard alignment.
+
+ at dst = global [1024 x i8] zeroinitializer, align 32
+
+define void @foo() nounwind {
+entry:
+	%src = alloca [1024 x i8], align 1
+	%src1 = getelementptr [1024 x i8]* %src, i32 0, i32 0
+	call void @llvm.memcpy.i32(i8* getelementptr ([1024 x i8]* @dst, i32 0, i32 0), i8* %src1, i32 1024, i32 1)
+	call void @frob(i8* %src1) nounwind
+	ret void
+}
+
+declare void @llvm.memcpy.i32(i8* nocapture, i8* nocapture, i32, i32) nounwind
+
+declare void @frob(i8*)





More information about the llvm-commits mailing list