diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp index 3096cab4c3c..3edc86b93d2 100644 --- a/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/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(CI.getOperand(3)); - if (isa(MI)) - if (MemOpLength) { + if (MemOpLength) { unsigned Size = MemOpLength->getZExtValue(); unsigned Align = cast(CI.getOperand(4))->getZExtValue(); - const PointerType *PTy = cast(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);