diff options
| author | Ahmed Bougacha <ahmed.bougacha@gmail.com> | 2015-04-18 23:06:04 +0000 |
|---|---|---|
| committer | Ahmed Bougacha <ahmed.bougacha@gmail.com> | 2015-04-18 23:06:04 +0000 |
| commit | 05b72c1fd868b0d3c9596680e63a9de59860f3d1 (patch) | |
| tree | 7248b76660b1985531ab012be3b887f8c0402097 /llvm/lib/Transforms | |
| parent | 6292d50eda0f33e5477e3494c27d375151771183 (diff) | |
| download | bcm5719-llvm-05b72c1fd868b0d3c9596680e63a9de59860f3d1.tar.gz bcm5719-llvm-05b72c1fd868b0d3c9596680e63a9de59860f3d1.zip | |
[MemCpyOpt] Don't force i64 when promoting memset/memcpy sizes.
Harden r235258 to support any integer bitwidth. The quick glance at
the reference made me think only i32 and i64 were valid types, but
they're not special, so any overload is legal.
Thanks to David Majnemer for noticing!
llvm-svn: 235261
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp b/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp index 550757a09f5..563e49c0190 100644 --- a/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp +++ b/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp @@ -876,10 +876,13 @@ bool MemCpyOpt::processMemSetMemCpyDependence(MemCpyInst *MemCpy, IRBuilder<> Builder(MemCpy->getNextNode()); - // If the sizes have different types (i32 vs i64), promote both to i64. + // If the sizes have different types, zext the smaller one. if (DestSize->getType() != SrcSize->getType()) { - DestSize = Builder.CreateZExt(DestSize, Builder.getInt64Ty()); - SrcSize = Builder.CreateZExt(SrcSize, Builder.getInt64Ty()); + if (DestSize->getType()->getIntegerBitWidth() > + SrcSize->getType()->getIntegerBitWidth()) + SrcSize = Builder.CreateZExt(SrcSize, DestSize->getType()); + else + DestSize = Builder.CreateZExt(DestSize, SrcSize->getType()); } Value *MemsetLen = |

