summaryrefslogtreecommitdiffstats
path: root/llvm/test
diff options
context:
space:
mode:
authorAmaury Sechet <deadalnix@gmail.com>2016-01-05 20:17:48 +0000
committerAmaury Sechet <deadalnix@gmail.com>2016-01-05 20:17:48 +0000
commita0c242cdfde7fd25ab43639e062ad97feb830b05 (patch)
tree9b4d1707f0896a56988fa78f4f21d9c0d8c00741 /llvm/test
parent2a65a49bcf99c720fb81ff69c3b955ee5f89770d (diff)
downloadbcm5719-llvm-a0c242cdfde7fd25ab43639e062ad97feb830b05.tar.gz
bcm5719-llvm-a0c242cdfde7fd25ab43639e062ad97feb830b05.zip
Implement load to store => memcpy in MemCpyOpt for aggregates
Summary: Most of the tool chain is able to optimize scalar and memcpy like operation effisciently while it isn't that good with aggregates. In order to improve the support of aggregate, we try to change aggregate manipulation into either scalar or memcpy like ones whenever possible without loosing informations. This is one such opportunity. Reviewers: craig.topper, spatel, dexonsmith, Prazek, chandlerc Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D15894 llvm-svn: 256868
Diffstat (limited to 'llvm/test')
-rw-r--r--llvm/test/Transforms/MemCpyOpt/fca2memcpy.ll47
1 files changed, 47 insertions, 0 deletions
diff --git a/llvm/test/Transforms/MemCpyOpt/fca2memcpy.ll b/llvm/test/Transforms/MemCpyOpt/fca2memcpy.ll
new file mode 100644
index 00000000000..61ec7f1d914
--- /dev/null
+++ b/llvm/test/Transforms/MemCpyOpt/fca2memcpy.ll
@@ -0,0 +1,47 @@
+; RUN: opt -memcpyopt -S < %s | FileCheck %s
+
+target datalayout = "e-i64:64-f80:128-n8:16:32:64"
+target triple = "x86_64-unknown-linux-gnu"
+
+%S = type { i8*, i32 }
+
+define void @copy(%S* %src, %S* %dst) {
+; CHECK-LABEL: copy
+; CHECK: call void @llvm.memmove.p0i8.p0i8.i64
+; CHECK-NEXT: ret void
+ %1 = load %S, %S* %src
+ store %S %1, %S* %dst
+ ret void
+}
+
+define void @noaliassrc(%S* noalias %src, %S* %dst) {
+; CHECK-LABEL: noaliassrc
+; CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
+; CHECK-NEXT: ret void
+ %1 = load %S, %S* %src
+ store %S %1, %S* %dst
+ ret void
+}
+
+define void @noaliasdst(%S* %src, %S* noalias %dst) {
+; CHECK-LABEL: noaliasdst
+; CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
+; CHECK-NEXT: ret void
+ %1 = load %S, %S* %src
+ store %S %1, %S* %dst
+ ret void
+}
+
+define void @copyalias(%S* %src, %S* %dst) {
+; CHECK-LABEL: copyalias
+; CHECK-NEXT: [[LOAD:%[a-z0-9\.]+]] = load %S, %S* %src
+; CHECK-NOT: load
+; CHECK: call void @llvm.memmove.p0i8.p0i8.i64
+; CHECK-NEXT: store %S [[LOAD]], %S* %dst
+; CHECK-NEXT: ret void
+ %1 = load %S, %S* %src
+ %2 = load %S, %S* %src
+ store %S %1, %S* %dst
+ store %S %2, %S* %dst
+ ret void
+}
OpenPOWER on IntegriCloud