[llvm-commits] [llvm] r42864 - in /llvm/trunk: lib/Transforms/Scalar/InstructionCombining.cpp test/Transforms/InstCombine/2007-10-10-EliminateMemCpy.ll
Dan Gohman
djg at cray.com
Thu Oct 11 15:08:55 PDT 2007
> + // If MemCpyInst length is 1/2/4/8 bytes then replace memcpy with load/store
Neat!
> + ConstantInt *MemOpLength = dyn_cast<ConstantInt>(CI.getOperand(3));
> + if (isa<MemCpyInst>(MI))
> + if (MemOpLength) {
Can you replace these two if statements with
if (isa<MemCpyInst>(MI) && MemOpLength) {
?
Then the indentation of what follows won't be wrong either :-)
> + 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);
> + }
It'd be great it this worked for non-scalar-integer types as well.
Maybe you could do something like (warning, untested):
if (Size == 1 && MTy->isFirstClassType())
NewPtrTy = PointerType::get(MTy)
else {
CopySize = Size * TD->getABITypeSizeInBits(MTy);
if (CopySize == 8 || CopySize == 4 || CopySize == 2 || CopySize == 1)
NewPtrTy = PointerType::get(IntegerType::get(CopySize));
}
?
> + if (NewPtrTy)
> + {
LLVM style.
> + Value *Src = InsertCastBefore(Instruction::BitCast, CI.getOperand(2), NewPtrTy, CI);
> + Value *Dest = InsertCastBefore(Instruction::BitCast, CI.getOperand(1), NewPtrTy, CI);
This is more than 80 columns.
> + Value *L = new LoadInst(Src, "tmp", false, Align, &CI);
> + Value *NS = new StoreInst(L, Dest, false, Align, &CI);
> + CI.replaceAllUsesWith(NS);
> + Changed = true;
> + return EraseInstFromFunction(CI);
> + }
> + }
More information about the llvm-commits
mailing list