diff options
| author | Andrew Kaylor <andrew.kaylor@intel.com> | 2016-07-13 17:25:11 +0000 |
|---|---|---|
| committer | Andrew Kaylor <andrew.kaylor@intel.com> | 2016-07-13 17:25:11 +0000 |
| commit | 12cccdd73142aba5b1d04c0c108a80bff59e13ed (patch) | |
| tree | 910f2edd6bcd6659e7ad48c6554056bd3c2ac742 /llvm/test | |
| parent | b83cf10899a7fd1d10b5b51910e1b3b83de7b005 (diff) | |
| download | bcm5719-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.ll | 16 | ||||
| -rw-r--r-- | llvm/test/CodeGen/X86/mempcpy_ret_val.ll | 28 | ||||
| -rw-r--r-- | llvm/test/Transforms/InferFunctionAttrs/annotate.ll | 3 | ||||
| -rw-r--r-- | llvm/test/Transforms/InferFunctionAttrs/no-proto.ll | 3 |
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(...) |

