summaryrefslogtreecommitdiff
path: root/test/Transforms/MemCpyOpt/memcpy.ll
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2011-05-23 00:03:39 +0000
committerChris Lattner <sabre@nondot.org>2011-05-23 00:03:39 +0000
commitb3f0673d52b72f34434dec13c4e2044c82012ef6 (patch)
treee2c468a159ebf2b8586cef5e319a9fce91c05068 /test/Transforms/MemCpyOpt/memcpy.ll
parentae441cc33cee83a598f74e3d0447fe02157b0389 (diff)
downloadllvm-b3f0673d52b72f34434dec13c4e2044c82012ef6.tar.gz
llvm-b3f0673d52b72f34434dec13c4e2044c82012ef6.tar.bz2
llvm-b3f0673d52b72f34434dec13c4e2044c82012ef6.tar.xz
Teach valuetracking that byval arguments with a specified alignment are
aligned. Teach memcpyopt to not give up all hope when confonted with an underaligned memcpy feeding an overaligned byval. If the *source* of the memcpy can be determined to be adequeately aligned, or if it can be forced to be, we can eliminate the memcpy. This addresses PR9794. We now compile the example into: define i32 @f(%struct.p* nocapture byval align 8 %q) nounwind ssp { entry: %call = call i32 @g(%struct.p* byval align 8 %q) nounwind ret i32 %call } in both x86-64 and x86-32 mode. We still don't get a tailcall though, because tailcalls apparently can't handle byval. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@131884 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Transforms/MemCpyOpt/memcpy.ll')
-rw-r--r--test/Transforms/MemCpyOpt/memcpy.ll20
1 files changed, 20 insertions, 0 deletions
diff --git a/test/Transforms/MemCpyOpt/memcpy.ll b/test/Transforms/MemCpyOpt/memcpy.ll
index b387d32a7d..5c6a94ce5c 100644
--- a/test/Transforms/MemCpyOpt/memcpy.ll
+++ b/test/Transforms/MemCpyOpt/memcpy.ll
@@ -109,3 +109,23 @@ define void @test6(i8 *%P) {
; CHECK-NEXT: ret void
}
+
+; PR9794 - Should forward memcpy into byval argument even though the memcpy
+; isn't itself 8 byte aligned.
+%struct.p = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32 }
+
+define i32 @test7(%struct.p* nocapture byval align 8 %q) nounwind ssp {
+entry:
+ %agg.tmp = alloca %struct.p, align 4
+ %tmp = bitcast %struct.p* %agg.tmp to i8*
+ %tmp1 = bitcast %struct.p* %q to i8*
+ call void @llvm.memcpy.p0i8.p0i8.i64(i8* %tmp, i8* %tmp1, i64 48, i32 4, i1 false)
+ %call = call i32 @g(%struct.p* byval align 8 %agg.tmp) nounwind
+ ret i32 %call
+; CHECK: @test7
+; CHECK: call i32 @g(%struct.p* byval align 8 %q) nounwind
+}
+
+declare i32 @g(%struct.p* byval align 8)
+
+