diff options
author | Ahmed Bougacha <ahmed.bougacha@gmail.com> | 2015-05-21 01:43:39 +0000 |
---|---|---|
committer | Ahmed Bougacha <ahmed.bougacha@gmail.com> | 2015-05-21 01:43:39 +0000 |
commit | 97876fa894222ea2c11923c1dbe2b7647e424fe9 (patch) | |
tree | 00a2265729452f775fc0eb805a42b3c9dd0d7a46 /llvm/test/Transforms/MemCpyOpt/memset-memcpy-redundant-memset.ll | |
parent | 5435aa464a62f4d82fbe643ade6fdcc40acbd141 (diff) | |
download | bcm5719-llvm-97876fa894222ea2c11923c1dbe2b7647e424fe9.tar.gz bcm5719-llvm-97876fa894222ea2c11923c1dbe2b7647e424fe9.zip |
[MemCpyOpt] Do move the memset, but look at its dest's dependencies.
In effect a partial revert of r237858, which was a dumb shortcut.
Looking at the dependencies of the destination should be the proper
fix: if the new memset would depend on anything other than itself,
the transformation isn't correct.
llvm-svn: 237874
Diffstat (limited to 'llvm/test/Transforms/MemCpyOpt/memset-memcpy-redundant-memset.ll')
-rw-r--r-- | llvm/test/Transforms/MemCpyOpt/memset-memcpy-redundant-memset.ll | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/llvm/test/Transforms/MemCpyOpt/memset-memcpy-redundant-memset.ll b/llvm/test/Transforms/MemCpyOpt/memset-memcpy-redundant-memset.ll index 25411f26982..993c8a1bb2d 100644 --- a/llvm/test/Transforms/MemCpyOpt/memset-memcpy-redundant-memset.ll +++ b/llvm/test/Transforms/MemCpyOpt/memset-memcpy-redundant-memset.ll @@ -1,4 +1,4 @@ -; RUN: opt -memcpyopt -S %s | FileCheck %s +; RUN: opt -basicaa -memcpyopt -S %s | FileCheck %s target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" @@ -140,6 +140,26 @@ define i8 @test_intermediate_read(i8* %a, i8* %b) #0 { ret i8 %r } +%struct = type { [8 x i8], [8 x i8] } + +; CHECK-LABEL: define void @test_intermediate_write +; CHECK-NEXT: %a = alloca %struct +; CHECK-NEXT: %a0 = getelementptr %struct, %struct* %a, i32 0, i32 0, i32 0 +; CHECK-NEXT: %a1 = getelementptr %struct, %struct* %a, i32 0, i32 1, i32 0 +; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* %a0, i8 0, i64 16, i32 1, i1 false) +; CHECK-NEXT: store i8 1, i8* %a1 +; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* %a0, i8* %b, i64 8, i32 1, i1 false) +; CHECK-NEXT: ret void +define void @test_intermediate_write(i8* %b) #0 { + %a = alloca %struct + %a0 = getelementptr %struct, %struct* %a, i32 0, i32 0, i32 0 + %a1 = getelementptr %struct, %struct* %a, i32 0, i32 1, i32 0 + call void @llvm.memset.p0i8.i64(i8* %a0, i8 0, i64 16, i32 1, i1 false) + store i8 1, i8* %a1 + call void @llvm.memcpy.p0i8.p0i8.i64(i8* %a0, i8* %b, i64 8, i32 1, i1 false) + ret void +} + declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1) declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i32, i1) declare void @llvm.memset.p0i8.i32(i8* nocapture, i8, i32, i32, i1) |