diff options
| author | Amaury Sechet <deadalnix@gmail.com> | 2016-01-06 09:30:39 +0000 |
|---|---|---|
| committer | Amaury Sechet <deadalnix@gmail.com> | 2016-01-06 09:30:39 +0000 |
| commit | d3b2c0fd947e8c5098d9d371bd81322feb797ddc (patch) | |
| tree | 49f750fb7e0fe0829729e71dff2c34b231133290 /llvm/test/Transforms | |
| parent | 267163e713c8c7c92a76319e836d8cb5bdcc4fad (diff) | |
| download | bcm5719-llvm-d3b2c0fd947e8c5098d9d371bd81322feb797ddc.tar.gz bcm5719-llvm-d3b2c0fd947e8c5098d9d371bd81322feb797ddc.zip | |
Improve load/store to memcpy for aggregate
Summary: It turns out that if we don't try to do it at the store location, we can do it before any operation that alias the load, as long as no operation alias the store.
Reviewers: craig.topper, spatel, dexonsmith, Prazek, chandlerc, joker.eph
Subscribers: llvm-commits
Differential Revision: http://reviews.llvm.org/D15903
llvm-svn: 256923
Diffstat (limited to 'llvm/test/Transforms')
| -rw-r--r-- | llvm/test/Transforms/MemCpyOpt/fca2memcpy.ll | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/llvm/test/Transforms/MemCpyOpt/fca2memcpy.ll b/llvm/test/Transforms/MemCpyOpt/fca2memcpy.ll index 61ec7f1d914..75a1a8f96e2 100644 --- a/llvm/test/Transforms/MemCpyOpt/fca2memcpy.ll +++ b/llvm/test/Transforms/MemCpyOpt/fca2memcpy.ll @@ -7,6 +7,7 @@ target triple = "x86_64-unknown-linux-gnu" define void @copy(%S* %src, %S* %dst) { ; CHECK-LABEL: copy +; CHECK-NOT: load ; CHECK: call void @llvm.memmove.p0i8.p0i8.i64 ; CHECK-NEXT: ret void %1 = load %S, %S* %src @@ -16,6 +17,7 @@ define void @copy(%S* %src, %S* %dst) { define void @noaliassrc(%S* noalias %src, %S* %dst) { ; CHECK-LABEL: noaliassrc +; CHECK-NOT: load ; CHECK: call void @llvm.memcpy.p0i8.p0i8.i64 ; CHECK-NEXT: ret void %1 = load %S, %S* %src @@ -25,9 +27,32 @@ define void @noaliassrc(%S* noalias %src, %S* %dst) { define void @noaliasdst(%S* %src, %S* noalias %dst) { ; CHECK-LABEL: noaliasdst +; CHECK-NOT: load +; 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 @destroysrc(%S* %src, %S* %dst) { +; CHECK-LABEL: destroysrc +; CHECK-NOT: call +; CHECK: ret void + %1 = load %S, %S* %src + store %S zeroinitializer, %S* %src + store %S %1, %S* %dst + ret void +} + +define void @destroynoaliassrc(%S* noalias %src, %S* %dst) { +; CHECK-LABEL: destroynoaliassrc +; CHECK-NOT: load ; CHECK: call void @llvm.memcpy.p0i8.p0i8.i64 +; CHECK-NEXT: store %S zeroinitializer, %S* %src ; CHECK-NEXT: ret void %1 = load %S, %S* %src + store %S zeroinitializer, %S* %src store %S %1, %S* %dst ret void } |

