summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorAhmed Bougacha <ahmed.bougacha@gmail.com>2015-04-18 17:57:41 +0000
committerAhmed Bougacha <ahmed.bougacha@gmail.com>2015-04-18 17:57:41 +0000
commit7216ccc3f34a97ea07354fe0bb61b782d5f1be18 (patch)
tree14f91a7b3c43c9501d83c7a67f6c92b6770975cd /llvm/lib/Transforms
parent2a7404a9070edd7cfe877eedbc0f4b1a552e9a74 (diff)
downloadbcm5719-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.cpp6
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()),
OpenPOWER on IntegriCloud