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 /llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp | |
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
Diffstat (limited to 'llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp')
-rw-r--r-- | llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp | 7 |
1 files changed, 7 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); |