Loading llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp +7 −19 Original line number Diff line number Diff line Loading @@ -1068,29 +1068,19 @@ bool MemCpyOptPass::performCallSlotOptzn(Instruction *cpyLoad, // We can't create address space casts here because we don't know if they're // safe for the target. if (cpySrc->getType()->getPointerAddressSpace() != cpyDest->getType()->getPointerAddressSpace()) if (cpySrc->getType() != cpyDest->getType()) return false; for (unsigned ArgI = 0; ArgI < C->arg_size(); ++ArgI) if (C->getArgOperand(ArgI)->stripPointerCasts() == cpySrc && cpySrc->getType()->getPointerAddressSpace() != C->getArgOperand(ArgI)->getType()->getPointerAddressSpace()) cpySrc->getType() != C->getArgOperand(ArgI)->getType()) return false; // All the checks have passed, so do the transformation. bool changedArgument = false; for (unsigned ArgI = 0; ArgI < C->arg_size(); ++ArgI) if (C->getArgOperand(ArgI)->stripPointerCasts() == cpySrc) { Value *Dest = cpySrc->getType() == cpyDest->getType() ? cpyDest : CastInst::CreatePointerCast(cpyDest, cpySrc->getType(), cpyDest->getName(), C); changedArgument = true; if (C->getArgOperand(ArgI)->getType() == Dest->getType()) C->setArgOperand(ArgI, Dest); else C->setArgOperand(ArgI, CastInst::CreatePointerCast( Dest, C->getArgOperand(ArgI)->getType(), Dest->getName(), C)); C->setArgOperand(ArgI, cpyDest); } if (!changedArgument) Loading Loading @@ -1855,9 +1845,8 @@ bool MemCpyOptPass::processByValArgument(CallBase &CB, unsigned ArgNo) { DT) < *ByValAlign) return false; // The address space of the memcpy source must match the byval argument if (MDep->getSource()->getType()->getPointerAddressSpace() != ByValArg->getType()->getPointerAddressSpace()) // The type of the memcpy source must match the byval argument if (MDep->getSource()->getType() != ByValArg->getType()) return false; // Verify that the copied-from memory doesn't change in between the memcpy and Loading Loading @@ -1931,9 +1920,8 @@ bool MemCpyOptPass::processImmutArgument(CallBase &CB, unsigned ArgNo) { if (!MDep || MDep->isVolatile() || AI != MDep->getDest()) return false; // The address space of the memcpy source must match the immut argument if (MDep->getSource()->getType()->getPointerAddressSpace() != ImmutArg->getType()->getPointerAddressSpace()) // The type of the memcpy source must match the immut argument if (MDep->getSource()->getType() != ImmutArg->getType()) return false; // 2-1. The length of the memcpy must be equal to the size of the alloca. Loading Loading
llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp +7 −19 Original line number Diff line number Diff line Loading @@ -1068,29 +1068,19 @@ bool MemCpyOptPass::performCallSlotOptzn(Instruction *cpyLoad, // We can't create address space casts here because we don't know if they're // safe for the target. if (cpySrc->getType()->getPointerAddressSpace() != cpyDest->getType()->getPointerAddressSpace()) if (cpySrc->getType() != cpyDest->getType()) return false; for (unsigned ArgI = 0; ArgI < C->arg_size(); ++ArgI) if (C->getArgOperand(ArgI)->stripPointerCasts() == cpySrc && cpySrc->getType()->getPointerAddressSpace() != C->getArgOperand(ArgI)->getType()->getPointerAddressSpace()) cpySrc->getType() != C->getArgOperand(ArgI)->getType()) return false; // All the checks have passed, so do the transformation. bool changedArgument = false; for (unsigned ArgI = 0; ArgI < C->arg_size(); ++ArgI) if (C->getArgOperand(ArgI)->stripPointerCasts() == cpySrc) { Value *Dest = cpySrc->getType() == cpyDest->getType() ? cpyDest : CastInst::CreatePointerCast(cpyDest, cpySrc->getType(), cpyDest->getName(), C); changedArgument = true; if (C->getArgOperand(ArgI)->getType() == Dest->getType()) C->setArgOperand(ArgI, Dest); else C->setArgOperand(ArgI, CastInst::CreatePointerCast( Dest, C->getArgOperand(ArgI)->getType(), Dest->getName(), C)); C->setArgOperand(ArgI, cpyDest); } if (!changedArgument) Loading Loading @@ -1855,9 +1845,8 @@ bool MemCpyOptPass::processByValArgument(CallBase &CB, unsigned ArgNo) { DT) < *ByValAlign) return false; // The address space of the memcpy source must match the byval argument if (MDep->getSource()->getType()->getPointerAddressSpace() != ByValArg->getType()->getPointerAddressSpace()) // The type of the memcpy source must match the byval argument if (MDep->getSource()->getType() != ByValArg->getType()) return false; // Verify that the copied-from memory doesn't change in between the memcpy and Loading Loading @@ -1931,9 +1920,8 @@ bool MemCpyOptPass::processImmutArgument(CallBase &CB, unsigned ArgNo) { if (!MDep || MDep->isVolatile() || AI != MDep->getDest()) return false; // The address space of the memcpy source must match the immut argument if (MDep->getSource()->getType()->getPointerAddressSpace() != ImmutArg->getType()->getPointerAddressSpace()) // The type of the memcpy source must match the immut argument if (MDep->getSource()->getType() != ImmutArg->getType()) return false; // 2-1. The length of the memcpy must be equal to the size of the alloca. Loading