From: Evan Cheng Date: Wed, 4 Jun 2008 23:37:54 +0000 (+0000) Subject: Fix a memcpy lowering bug. Even though the memcpy alignment is smaller than the desir... X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=fb4db316d835fa9774d608ac58336a24c7867192;p=oota-llvm.git Fix a memcpy lowering bug. Even though the memcpy alignment is smaller than the desired alignment, the frame destination alignment may still be larger than the desired alignment. Don't change its alignment to something smaller. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@51970 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index a9b7381a096..8d0d344d62b 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -2633,8 +2633,9 @@ bool MeetsMaxMemopRequirement(std::vector &MemOps, if (AllowUnalign) VT = MVT::iAny; } else { - // Give the stack frame object a larger alignment. - MFI->setObjectAlignment(FI, NewAlign); + // Give the stack frame object a larger alignment if needed. + if (MFI->getObjectAlignment(FI) < NewAlign) + MFI->setObjectAlignment(FI, NewAlign); Align = NewAlign; } } diff --git a/test/CodeGen/X86/2008-06-04-MemCpyLoweringBug.ll b/test/CodeGen/X86/2008-06-04-MemCpyLoweringBug.ll new file mode 100644 index 00000000000..d2827614168 --- /dev/null +++ b/test/CodeGen/X86/2008-06-04-MemCpyLoweringBug.ll @@ -0,0 +1,19 @@ +; RUN: llvm-as < %s | llc -mtriple=i386-apple-darwin -mattr=+sse2 -disable-fp-elim | grep subl | grep 24 + + %struct.argument_t = type { i8*, %struct.argument_t*, i32, %struct.ipc_type_t*, i32, void (...)*, void (...)*, void (...)*, void (...)*, void (...)*, i8*, i8*, i8*, i8*, i8*, i32, i32, i32, %struct.routine*, %struct.argument_t*, %struct.argument_t*, %struct.argument_t*, %struct.argument_t*, %struct.argument_t*, %struct.argument_t*, %struct.argument_t*, i32, i32, i32, i32, i32, i32 } + %struct.ipc_type_t = type { i8*, %struct.ipc_type_t*, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i8*, i8*, i32, i32, i32, i32, i32, i32, %struct.ipc_type_t*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8* } + %struct.routine = type opaque +@"\01LC" = external constant [11 x i8] ; <[11 x i8]*> [#uses=1] + +define i8* @InArgMsgField(%struct.argument_t* %arg, i8* %str) nounwind { +entry: + %who = alloca [20 x i8] ; <[20 x i8]*> [#uses=1] + %who1 = getelementptr [20 x i8]* %who, i32 0, i32 0 ; [#uses=2] + call void @llvm.memset.i32( i8* %who1, i8 0, i32 20, i32 1 ) + call void @llvm.memcpy.i32( i8* %who1, i8* getelementptr ([11 x i8]* @"\01LC", i32 0, i32 0), i32 11, i32 1 ) + unreachable +} + +declare void @llvm.memset.i32(i8*, i8, i32, i32) nounwind + +declare void @llvm.memcpy.i32(i8*, i8*, i32, i32) nounwind