diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Transforms/Utils/LowerMemIntrinsics.cpp')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/Transforms/Utils/LowerMemIntrinsics.cpp | 52 |
1 files changed, 7 insertions, 45 deletions
diff --git a/contrib/llvm-project/llvm/lib/Transforms/Utils/LowerMemIntrinsics.cpp b/contrib/llvm-project/llvm/lib/Transforms/Utils/LowerMemIntrinsics.cpp index 906eb71fc2d9..c75de8687879 100644 --- a/contrib/llvm-project/llvm/lib/Transforms/Utils/LowerMemIntrinsics.cpp +++ b/contrib/llvm-project/llvm/lib/Transforms/Utils/LowerMemIntrinsics.cpp @@ -64,17 +64,6 @@ void llvm::createMemCpyLoopKnownSize( IRBuilder<> PLBuilder(PreLoopBB->getTerminator()); - // Cast the Src and Dst pointers to pointers to the loop operand type (if - // needed). - PointerType *SrcOpType = PointerType::get(LoopOpType, SrcAS); - PointerType *DstOpType = PointerType::get(LoopOpType, DstAS); - if (SrcAddr->getType() != SrcOpType) { - SrcAddr = PLBuilder.CreateBitCast(SrcAddr, SrcOpType); - } - if (DstAddr->getType() != DstOpType) { - DstAddr = PLBuilder.CreateBitCast(DstAddr, DstOpType); - } - Align PartDstAlign(commonAlignment(DstAlign, LoopOpSize)); Align PartSrcAlign(commonAlignment(SrcAlign, LoopOpSize)); @@ -137,13 +126,9 @@ void llvm::createMemCpyLoopKnownSize( uint64_t GepIndex = BytesCopied / OperandSize; assert(GepIndex * OperandSize == BytesCopied && "Division should have no Remainder!"); - // Cast source to operand type and load - PointerType *SrcPtrType = PointerType::get(OpTy, SrcAS); - Value *CastedSrc = SrcAddr->getType() == SrcPtrType - ? SrcAddr - : RBuilder.CreateBitCast(SrcAddr, SrcPtrType); + Value *SrcGEP = RBuilder.CreateInBoundsGEP( - OpTy, CastedSrc, ConstantInt::get(TypeOfCopyLen, GepIndex)); + OpTy, SrcAddr, ConstantInt::get(TypeOfCopyLen, GepIndex)); LoadInst *Load = RBuilder.CreateAlignedLoad(OpTy, SrcGEP, PartSrcAlign, SrcIsVolatile); if (!CanOverlap) { @@ -151,13 +136,8 @@ void llvm::createMemCpyLoopKnownSize( Load->setMetadata(LLVMContext::MD_alias_scope, MDNode::get(Ctx, NewScope)); } - // Cast destination to operand type and store. - PointerType *DstPtrType = PointerType::get(OpTy, DstAS); - Value *CastedDst = DstAddr->getType() == DstPtrType - ? DstAddr - : RBuilder.CreateBitCast(DstAddr, DstPtrType); Value *DstGEP = RBuilder.CreateInBoundsGEP( - OpTy, CastedDst, ConstantInt::get(TypeOfCopyLen, GepIndex)); + OpTy, DstAddr, ConstantInt::get(TypeOfCopyLen, GepIndex)); StoreInst *Store = RBuilder.CreateAlignedStore(Load, DstGEP, PartDstAlign, DstIsVolatile); if (!CanOverlap) { @@ -206,15 +186,6 @@ void llvm::createMemCpyLoopUnknownSize( IRBuilder<> PLBuilder(PreLoopBB->getTerminator()); - PointerType *SrcOpType = PointerType::get(LoopOpType, SrcAS); - PointerType *DstOpType = PointerType::get(LoopOpType, DstAS); - if (SrcAddr->getType() != SrcOpType) { - SrcAddr = PLBuilder.CreateBitCast(SrcAddr, SrcOpType); - } - if (DstAddr->getType() != DstOpType) { - DstAddr = PLBuilder.CreateBitCast(DstAddr, DstOpType); - } - // Calculate the loop trip count, and remaining bytes to copy after the loop. Type *CopyLenType = CopyLen->getType(); IntegerType *ILengthType = dyn_cast<IntegerType>(CopyLenType); @@ -305,13 +276,9 @@ void llvm::createMemCpyLoopUnknownSize( ResBuilder.CreatePHI(CopyLenType, 2, "residual-loop-index"); ResidualIndex->addIncoming(Zero, ResHeaderBB); - Value *SrcAsResLoopOpType = ResBuilder.CreateBitCast( - SrcAddr, PointerType::get(ResLoopOpType, SrcAS)); - Value *DstAsResLoopOpType = ResBuilder.CreateBitCast( - DstAddr, PointerType::get(ResLoopOpType, DstAS)); Value *FullOffset = ResBuilder.CreateAdd(RuntimeBytesCopied, ResidualIndex); - Value *SrcGEP = ResBuilder.CreateInBoundsGEP( - ResLoopOpType, SrcAsResLoopOpType, FullOffset); + Value *SrcGEP = + ResBuilder.CreateInBoundsGEP(ResLoopOpType, SrcAddr, FullOffset); LoadInst *Load = ResBuilder.CreateAlignedLoad(ResLoopOpType, SrcGEP, PartSrcAlign, SrcIsVolatile); if (!CanOverlap) { @@ -319,8 +286,8 @@ void llvm::createMemCpyLoopUnknownSize( Load->setMetadata(LLVMContext::MD_alias_scope, MDNode::get(Ctx, NewScope)); } - Value *DstGEP = ResBuilder.CreateInBoundsGEP( - ResLoopOpType, DstAsResLoopOpType, FullOffset); + Value *DstGEP = + ResBuilder.CreateInBoundsGEP(ResLoopOpType, DstAddr, FullOffset); StoreInst *Store = ResBuilder.CreateAlignedStore(Load, DstGEP, PartDstAlign, DstIsVolatile); if (!CanOverlap) { @@ -479,11 +446,6 @@ static void createMemSetLoop(Instruction *InsertBefore, Value *DstAddr, IRBuilder<> Builder(OrigBB->getTerminator()); - // Cast pointer to the type of value getting stored - unsigned dstAS = cast<PointerType>(DstAddr->getType())->getAddressSpace(); - DstAddr = Builder.CreateBitCast(DstAddr, - PointerType::get(SetValue->getType(), dstAS)); - Builder.CreateCondBr( Builder.CreateICmpEQ(ConstantInt::get(TypeOfCopyLen, 0), CopyLen), NewBB, LoopBB); |
