diff options
| author | Benjamin Kramer <benny.kra@googlemail.com> | 2014-03-10 21:05:13 +0000 |
|---|---|---|
| committer | Benjamin Kramer <benny.kra@googlemail.com> | 2014-03-10 21:05:13 +0000 |
| commit | 3ef5e46b6d7ef95435328936864f509fa7f62880 (patch) | |
| tree | dcc571db63ec56e96e6c4df10cf9abec3ad226a5 | |
| parent | 0e8f4612a9cd90f047652bb8689cd7aa3c231c4a (diff) | |
| download | bcm5719-llvm-3ef5e46b6d7ef95435328936864f509fa7f62880.tar.gz bcm5719-llvm-3ef5e46b6d7ef95435328936864f509fa7f62880.zip | |
MemCpyOpt: When merging memsets also merge the trivial case of two memsets with the same destination.
The testcase is from PR19092, but I think the bug described there is actually a clang issue.
llvm-svn: 203489
| -rw-r--r-- | llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp | 7 | ||||
| -rw-r--r-- | llvm/test/Transforms/MemCpyOpt/form-memset.ll | 12 |
2 files changed, 19 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp b/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp index 348e12f35b8..143ba38ec98 100644 --- a/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp +++ b/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp @@ -75,6 +75,13 @@ static bool IsPointerOffset(Value *Ptr1, Value *Ptr2, int64_t &Offset, const DataLayout &TD) { Ptr1 = Ptr1->stripPointerCasts(); Ptr2 = Ptr2->stripPointerCasts(); + + // Handle the trivial case first. + if (Ptr1 == Ptr2) { + Offset = 0; + return true; + } + GEPOperator *GEP1 = dyn_cast<GEPOperator>(Ptr1); GEPOperator *GEP2 = dyn_cast<GEPOperator>(Ptr2); diff --git a/llvm/test/Transforms/MemCpyOpt/form-memset.ll b/llvm/test/Transforms/MemCpyOpt/form-memset.ll index 7c7b4fc0880..d980b7fdbd6 100644 --- a/llvm/test/Transforms/MemCpyOpt/form-memset.ll +++ b/llvm/test/Transforms/MemCpyOpt/form-memset.ll @@ -272,3 +272,15 @@ define void @test9() nounwind { ; CHECK-LABEL: @test9( ; CHECK: call void @llvm.memset.p0i8.i64(i8* bitcast ([16 x i64]* @test9buf to i8*), i8 -1, i64 16, i32 16, i1 false) } + +; PR19092 +define void @test10(i8* nocapture %P) nounwind { + tail call void @llvm.memset.p0i8.i64(i8* %P, i8 0, i64 42, i32 1, i1 false) + tail call void @llvm.memset.p0i8.i64(i8* %P, i8 0, i64 23, i32 1, i1 false) + ret void +; CHECK-LABEL: @test10( +; CHECK-NOT: memset +; CHECK: call void @llvm.memset.p0i8.i64(i8* %P, i8 0, i64 42, i32 1, i1 false) +; CHECK-NOT: memset +; CHECK: ret void +} |

