summaryrefslogtreecommitdiffstats
path: root/llvm/test
diff options
context:
space:
mode:
authorAndrew Kaylor <andrew.kaylor@intel.com>2016-07-13 17:25:11 +0000
committerAndrew Kaylor <andrew.kaylor@intel.com>2016-07-13 17:25:11 +0000
commit12cccdd73142aba5b1d04c0c108a80bff59e13ed (patch)
tree910f2edd6bcd6659e7ad48c6554056bd3c2ac742 /llvm/test
parentb83cf10899a7fd1d10b5b51910e1b3b83de7b005 (diff)
downloadbcm5719-llvm-12cccdd73142aba5b1d04c0c108a80bff59e13ed.tar.gz
bcm5719-llvm-12cccdd73142aba5b1d04c0c108a80bff59e13ed.zip
Fix for Bug 26903, adds support to inline __builtin_mempcpy
Patch by Sunita Marathe Differential Revision: http://reviews.llvm.org/D21920 llvm-svn: 275284
Diffstat (limited to 'llvm/test')
-rw-r--r--llvm/test/CodeGen/Generic/mempcpy_call.ll16
-rw-r--r--llvm/test/CodeGen/X86/mempcpy_ret_val.ll28
-rw-r--r--llvm/test/Transforms/InferFunctionAttrs/annotate.ll3
-rw-r--r--llvm/test/Transforms/InferFunctionAttrs/no-proto.ll3
4 files changed, 50 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/Generic/mempcpy_call.ll b/llvm/test/CodeGen/Generic/mempcpy_call.ll
new file mode 100644
index 00000000000..b88f20160af
--- /dev/null
+++ b/llvm/test/CodeGen/Generic/mempcpy_call.ll
@@ -0,0 +1,16 @@
+; RUN: llc < %s -O2 | FileCheck %s
+
+; This test just checks that mempcpy is lowered as memcpy.
+; The test to check that the return value of mempcpy is the dst pointer adjusted
+; by the copy size is done by Codegen/X86/mempcpy_ret_val.ll
+
+; CHECK-LABEL: CALL_MEMPCPY:
+; CHECK: callq memcpy
+;
+define void @CALL_MEMPCPY(i8* %DST, i8* %SRC, i64 %N) {
+entry:
+ %call = tail call i8* @mempcpy(i8* %DST, i8* %SRC, i64 %N)
+ ret void
+}
+
+declare i8* @mempcpy(i8*, i8*, i64)
diff --git a/llvm/test/CodeGen/X86/mempcpy_ret_val.ll b/llvm/test/CodeGen/X86/mempcpy_ret_val.ll
new file mode 100644
index 00000000000..d914f15101b
--- /dev/null
+++ b/llvm/test/CodeGen/X86/mempcpy_ret_val.ll
@@ -0,0 +1,28 @@
+; RUN: llc < %s -O2 | FileCheck %s
+
+@G = common global i8* null, align 8
+
+; This test checks that:
+; (1) mempcpy is lowered as memcpy, and
+; (2) its return value is DST+N i.e. the dst pointer adjusted by the copy size.
+; To keep the testing of (2) independent of the exact instructions used to
+; adjust the dst pointer, DST+N is explicitly computed and stored to a global
+; variable G before the mempcpy call. This instance of DST+N causes the repeat
+; DST+N done in the context of the return value of mempcpy to be redundant, and
+; the first instance to be reused as the return value. This allows the check for
+; (2) to be expressed as verifying that the MOV to store DST+N to G and
+; the MOV to copy DST+N to %rax use the same source register.
+
+; CHECK-LABEL: RET_MEMPCPY:
+; CHECK: movq [[REG:%r[a-z0-9]+]], {{.*}}G
+; CHECK: callq memcpy
+; CHECK: movq [[REG]], %rax
+;
+define i8* @RET_MEMPCPY(i8* %DST, i8* %SRC, i64 %N) {
+ %add.ptr = getelementptr inbounds i8, i8* %DST, i64 %N
+ store i8* %add.ptr, i8** @G, align 8
+ %call = tail call i8* @mempcpy(i8* %DST, i8* %SRC, i64 %N)
+ ret i8* %call
+}
+
+declare i8* @mempcpy(i8*, i8*, i64)
diff --git a/llvm/test/Transforms/InferFunctionAttrs/annotate.ll b/llvm/test/Transforms/InferFunctionAttrs/annotate.ll
index 039114d0cb9..64676bf310b 100644
--- a/llvm/test/Transforms/InferFunctionAttrs/annotate.ll
+++ b/llvm/test/Transforms/InferFunctionAttrs/annotate.ll
@@ -499,6 +499,9 @@ declare i32 @memcmp(i8*, i8*, i64)
; CHECK: declare i8* @memcpy(i8*, i8* nocapture readonly, i64) [[G0]]
declare i8* @memcpy(i8*, i8*, i64)
+; CHECK: declare i8* @mempcpy(i8*, i8* nocapture readonly, i64) [[G0]]
+declare i8* @mempcpy(i8*, i8*, i64)
+
; CHECK: declare i8* @memmove(i8*, i8* nocapture readonly, i64) [[G0]]
declare i8* @memmove(i8*, i8*, i64)
diff --git a/llvm/test/Transforms/InferFunctionAttrs/no-proto.ll b/llvm/test/Transforms/InferFunctionAttrs/no-proto.ll
index 256f5c356b8..25a4805c367 100644
--- a/llvm/test/Transforms/InferFunctionAttrs/no-proto.ll
+++ b/llvm/test/Transforms/InferFunctionAttrs/no-proto.ll
@@ -480,6 +480,9 @@ declare void @memcmp(...)
; CHECK: declare void @memcpy(...)
declare void @memcpy(...)
+; CHECK: declare void @mempcpy(...)
+declare void @mempcpy(...)
+
; CHECK: declare void @memmove(...)
declare void @memmove(...)
OpenPOWER on IntegriCloud