summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorDevang Patel <dpatel@apple.com>2007-10-12 20:10:21 +0000
committerDevang Patel <dpatel@apple.com>2007-10-12 20:10:21 +0000
commit371e6ca690a4b6f2fc95d1721dfd29b9fc6cee2b (patch)
tree51f2908dbd43cef00e00a604aa6f783f61be0ebc /llvm/lib/Transforms
parentda53e9c9c1819e93fdc1a2292f68cade1173cc31 (diff)
downloadbcm5719-llvm-371e6ca690a4b6f2fc95d1721dfd29b9fc6cee2b.tar.gz
bcm5719-llvm-371e6ca690a4b6f2fc95d1721dfd29b9fc6cee2b.zip
Dest type is always i8 *. This allows some simplification.
Do not filter memmove. llvm-svn: 42930
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r--llvm/lib/Transforms/Scalar/InstructionCombining.cpp45
1 files changed, 12 insertions, 33 deletions
diff --git a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp
index 3096cab4c3c..3edc86b93d2 100644
--- a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp
+++ b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp
@@ -7669,43 +7669,22 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
// If MemCpyInst length is 1/2/4/8 bytes then replace memcpy with
// load/store.
ConstantInt *MemOpLength = dyn_cast<ConstantInt>(CI.getOperand(3));
- if (isa<MemCpyInst>(MI))
- if (MemOpLength) {
+ if (MemOpLength) {
unsigned Size = MemOpLength->getZExtValue();
unsigned Align = cast<ConstantInt>(CI.getOperand(4))->getZExtValue();
- const PointerType *PTy = cast<PointerType>(CI.getOperand(1)->getType());
- const Type *MTy = PTy->getElementType();
PointerType *NewPtrTy = NULL;
- if (MTy == Type::Int8Ty) {
- if (Size == 8)
- NewPtrTy = PointerType::get(Type::Int64Ty);
- else if (Size == 4)
- NewPtrTy = PointerType::get(Type::Int32Ty);
- else if (Size == 2)
- NewPtrTy = PointerType::get(Type::Int16Ty);
- else if (Size == 1)
- NewPtrTy = PointerType::get(Type::Int8Ty);
- } else if (MTy == Type::Int16Ty) {
- if (Size == 4)
- NewPtrTy = PointerType::get(Type::Int64Ty);
- else if (Size == 2)
- NewPtrTy = PointerType::get(Type::Int32Ty);
- else if (Size == 1)
- NewPtrTy = PointerType::get(Type::Int16Ty);
- } else if (MTy == Type::Int32Ty) {
- if (Size == 2)
- NewPtrTy = PointerType::get(Type::Int64Ty);
- else if (Size == 1)
- NewPtrTy = PointerType::get(Type::Int32Ty);
- } else if (MTy == Type::Int64Ty) {
- if (Size == 1)
- NewPtrTy = PointerType::get(Type::Int64Ty);
- }
+ // Destination pointer type is always i8 *
+ if (Size == 8)
+ NewPtrTy = PointerType::get(Type::Int64Ty);
+ else if (Size == 4)
+ NewPtrTy = PointerType::get(Type::Int32Ty);
+ else if (Size == 2)
+ NewPtrTy = PointerType::get(Type::Int16Ty);
+ else if (Size == 1)
+ NewPtrTy = PointerType::get(Type::Int8Ty);
if (NewPtrTy) {
- Value *Src =
- InsertCastBefore(Instruction::BitCast,CI.getOperand(2),NewPtrTy,CI);
- Value *Dest =
- InsertCastBefore(Instruction::BitCast,CI.getOperand(1),NewPtrTy,CI);
+ Value *Src = InsertCastBefore(Instruction::BitCast, CI.getOperand(2), NewPtrTy, CI);
+ Value *Dest = InsertCastBefore(Instruction::BitCast, CI.getOperand(1), NewPtrTy, CI);
Value *L = new LoadInst(Src, "tmp", false, Align, &CI);
Value *NS = new StoreInst(L, Dest, false, Align, &CI);
CI.replaceAllUsesWith(NS);
OpenPOWER on IntegriCloud