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 | 8da0b7358d30b8a91648bd30046137376bf85464 (patch) | |
tree | 7133927f3186a024a51dfc9c747cea91f45e9d8f /lib/Transforms | |
parent | d89b0f200c54479bd556a5677d165865668ebcbf (diff) | |
download | llvm-8da0b7358d30b8a91648bd30046137376bf85464.tar.gz llvm-8da0b7358d30b8a91648bd30046137376bf85464.tar.bz2 llvm-8da0b7358d30b8a91648bd30046137376bf85464.tar.xz |
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.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@203489 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
-rw-r--r-- | lib/Transforms/Scalar/MemCpyOptimizer.cpp | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/lib/Transforms/Scalar/MemCpyOptimizer.cpp b/lib/Transforms/Scalar/MemCpyOptimizer.cpp index 348e12f35b..143ba38ec9 100644 --- a/lib/Transforms/Scalar/MemCpyOptimizer.cpp +++ b/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); |