diff options
| author | Ahmed Bougacha <ahmed.bougacha@gmail.com> | 2015-04-18 17:57:41 +0000 |
|---|---|---|
| committer | Ahmed Bougacha <ahmed.bougacha@gmail.com> | 2015-04-18 17:57:41 +0000 |
| commit | 7216ccc3f34a97ea07354fe0bb61b782d5f1be18 (patch) | |
| tree | 14f91a7b3c43c9501d83c7a67f6c92b6770975cd /llvm/lib/Transforms | |
| parent | 2a7404a9070edd7cfe877eedbc0f4b1a552e9a74 (diff) | |
| download | bcm5719-llvm-7216ccc3f34a97ea07354fe0bb61b782d5f1be18.tar.gz bcm5719-llvm-7216ccc3f34a97ea07354fe0bb61b782d5f1be18.zip | |
[MemCpyOpt] Promote both memset/memcpy sizes if differently typed.
Followup to r235232, which caused PR23278.
We can't assume the memset and memcpy sizes have the same type, as
nothing in the language reference prevents that.
Instead, zext both to i64 if they disagree.
While there, robustify tests by using i8 %c rather than i8 0 for the
memset character.
llvm-svn: 235258
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp b/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp index 72127bb0d6e..550757a09f5 100644 --- a/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp +++ b/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp @@ -876,6 +876,12 @@ bool MemCpyOpt::processMemSetMemCpyDependence(MemCpyInst *MemCpy, IRBuilder<> Builder(MemCpy->getNextNode()); + // If the sizes have different types (i32 vs i64), promote both to i64. + if (DestSize->getType() != SrcSize->getType()) { + DestSize = Builder.CreateZExt(DestSize, Builder.getInt64Ty()); + SrcSize = Builder.CreateZExt(SrcSize, Builder.getInt64Ty()); + } + Value *MemsetLen = Builder.CreateSelect(Builder.CreateICmpULE(DestSize, SrcSize), ConstantInt::getNullValue(DestSize->getType()), |

