diff --git a/llvm/include/llvm/IR/IRBuilder.h b/llvm/include/llvm/IR/IRBuilder.h index 8863ca8eba47e..f2922311097e9 100644 --- a/llvm/include/llvm/IR/IRBuilder.h +++ b/llvm/include/llvm/IR/IRBuilder.h @@ -1974,6 +1974,16 @@ class IRBuilderBase { return CreateConstInBoundsGEP2_32(Ty, Ptr, 0, Idx, Name); } + Value *CreatePtrAdd(Value *Ptr, Value *Offset, const Twine &Name = "", + bool IsInBounds = false) { + return CreateGEP(getInt8Ty(), Ptr, Offset, Name, IsInBounds); + } + + Value *CreateInBoundsPtrAdd(Value *Ptr, Value *Offset, + const Twine &Name = "") { + return CreateGEP(getInt8Ty(), Ptr, Offset, Name, /*IsInBounds*/ true); + } + /// Same as CreateGlobalString, but return a pointer with "i8*" type /// instead of a pointer to array of i8. /// diff --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp index b8bfb9742bfbe..ff61f1a4a0436 100644 --- a/llvm/lib/CodeGen/CodeGenPrepare.cpp +++ b/llvm/lib/CodeGen/CodeGenPrepare.cpp @@ -5553,7 +5553,6 @@ bool CodeGenPrepare::optimizeMemoryInst(Instruction *MemoryInst, Value *Addr, } else { Type *I8PtrTy = Builder.getPtrTy(Addr->getType()->getPointerAddressSpace()); - Type *I8Ty = Builder.getInt8Ty(); // Start with the base register. Do this first so that subsequent address // matching finds it last, which will prevent it from trying to match it @@ -5597,8 +5596,8 @@ bool CodeGenPrepare::optimizeMemoryInst(Instruction *MemoryInst, Value *Addr, // SDAG consecutive load/store merging. if (ResultPtr->getType() != I8PtrTy) ResultPtr = Builder.CreatePointerCast(ResultPtr, I8PtrTy); - ResultPtr = Builder.CreateGEP(I8Ty, ResultPtr, ResultIndex, - "sunkaddr", AddrMode.InBounds); + ResultPtr = Builder.CreatePtrAdd(ResultPtr, ResultIndex, "sunkaddr", + AddrMode.InBounds); } ResultIndex = V; @@ -5609,8 +5608,8 @@ bool CodeGenPrepare::optimizeMemoryInst(Instruction *MemoryInst, Value *Addr, } else { if (ResultPtr->getType() != I8PtrTy) ResultPtr = Builder.CreatePointerCast(ResultPtr, I8PtrTy); - SunkAddr = Builder.CreateGEP(I8Ty, ResultPtr, ResultIndex, "sunkaddr", - AddrMode.InBounds); + SunkAddr = Builder.CreatePtrAdd(ResultPtr, ResultIndex, "sunkaddr", + AddrMode.InBounds); } if (SunkAddr->getType() != Addr->getType()) { @@ -6169,7 +6168,6 @@ bool CodeGenPrepare::splitLargeGEPOffsets() { Type *PtrIdxTy = DL->getIndexType(GEP->getType()); Type *I8PtrTy = PointerType::get(Ctx, GEP->getType()->getPointerAddressSpace()); - Type *I8Ty = Type::getInt8Ty(Ctx); BasicBlock::iterator NewBaseInsertPt; BasicBlock *NewBaseInsertBB; @@ -6198,7 +6196,7 @@ bool CodeGenPrepare::splitLargeGEPOffsets() { if (NewBaseGEP->getType() != I8PtrTy) NewBaseGEP = NewBaseBuilder.CreatePointerCast(NewBaseGEP, I8PtrTy); NewBaseGEP = - NewBaseBuilder.CreateGEP(I8Ty, NewBaseGEP, BaseIndex, "splitgep"); + NewBaseBuilder.CreatePtrAdd(NewBaseGEP, BaseIndex, "splitgep"); NewGEPBases.insert(NewBaseGEP); return; }; @@ -6235,9 +6233,7 @@ bool CodeGenPrepare::splitLargeGEPOffsets() { } // Generate a new GEP to replace the current one. - LLVMContext &Ctx = GEP->getContext(); Type *PtrIdxTy = DL->getIndexType(GEP->getType()); - Type *I8Ty = Type::getInt8Ty(Ctx); if (!NewBaseGEP) { // Create a new base if we don't have one yet. Find the insertion @@ -6250,7 +6246,7 @@ bool CodeGenPrepare::splitLargeGEPOffsets() { if (Offset != BaseOffset) { // Calculate the new offset for the new GEP. Value *Index = ConstantInt::get(PtrIdxTy, Offset - BaseOffset); - NewGEP = Builder.CreateGEP(I8Ty, NewBaseGEP, Index); + NewGEP = Builder.CreatePtrAdd(NewBaseGEP, Index); } replaceAllUsesWith(GEP, NewGEP, FreshBBs, IsHugeFunc); LargeOffsetGEPID.erase(GEP); diff --git a/llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp b/llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp index 9318306779708..0777acf633187 100644 --- a/llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp +++ b/llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp @@ -72,7 +72,6 @@ static bool lowerLoadRelative(Function &F) { bool Changed = false; Type *Int32Ty = Type::getInt32Ty(F.getContext()); - Type *Int8Ty = Type::getInt8Ty(F.getContext()); for (Use &U : llvm::make_early_inc_range(F.uses())) { auto CI = dyn_cast(U.getUser()); @@ -81,10 +80,10 @@ static bool lowerLoadRelative(Function &F) { IRBuilder<> B(CI); Value *OffsetPtr = - B.CreateGEP(Int8Ty, CI->getArgOperand(0), CI->getArgOperand(1)); + B.CreatePtrAdd(CI->getArgOperand(0), CI->getArgOperand(1)); Value *OffsetI32 = B.CreateAlignedLoad(Int32Ty, OffsetPtr, Align(4)); - Value *ResultPtr = B.CreateGEP(Int8Ty, CI->getArgOperand(0), OffsetI32); + Value *ResultPtr = B.CreatePtrAdd(CI->getArgOperand(0), OffsetI32); CI->replaceAllUsesWith(ResultPtr); CI->eraseFromParent(); diff --git a/llvm/lib/CodeGen/SafeStack.cpp b/llvm/lib/CodeGen/SafeStack.cpp index 88db57ad46b95..0a26247a4d165 100644 --- a/llvm/lib/CodeGen/SafeStack.cpp +++ b/llvm/lib/CodeGen/SafeStack.cpp @@ -119,7 +119,6 @@ class SafeStack { Type *StackPtrTy; Type *IntPtrTy; Type *Int32Ty; - Type *Int8Ty; Value *UnsafeStackPtr = nullptr; @@ -195,8 +194,7 @@ class SafeStack { : F(F), TL(TL), DL(DL), DTU(DTU), SE(SE), StackPtrTy(PointerType::getUnqual(F.getContext())), IntPtrTy(DL.getIntPtrType(F.getContext())), - Int32Ty(Type::getInt32Ty(F.getContext())), - Int8Ty(Type::getInt8Ty(F.getContext())) {} + Int32Ty(Type::getInt32Ty(F.getContext())) {} // Run the transformation on the associated function. // Returns whether the function was changed. @@ -562,8 +560,8 @@ Value *SafeStack::moveStaticAllocasToUnsafeStack( if (StackGuardSlot) { unsigned Offset = SSL.getObjectOffset(StackGuardSlot); - Value *Off = IRB.CreateGEP(Int8Ty, BasePointer, // BasePointer is i8* - ConstantInt::get(Int32Ty, -Offset)); + Value *Off = + IRB.CreatePtrAdd(BasePointer, ConstantInt::get(Int32Ty, -Offset)); Value *NewAI = IRB.CreateBitCast(Off, StackGuardSlot->getType(), "StackGuardSlot"); @@ -581,10 +579,10 @@ Value *SafeStack::moveStaticAllocasToUnsafeStack( if (Size == 0) Size = 1; // Don't create zero-sized stack objects. - Value *Off = IRB.CreateGEP(Int8Ty, BasePointer, // BasePointer is i8* - ConstantInt::get(Int32Ty, -Offset)); + Value *Off = + IRB.CreatePtrAdd(BasePointer, ConstantInt::get(Int32Ty, -Offset)); Value *NewArg = IRB.CreateBitCast(Off, Arg->getType(), - Arg->getName() + ".unsafe-byval"); + Arg->getName() + ".unsafe-byval"); // Replace alloc with the new location. replaceDbgDeclare(Arg, BasePointer, DIB, DIExpression::ApplyOffset, @@ -616,8 +614,8 @@ Value *SafeStack::moveStaticAllocasToUnsafeStack( InsertBefore = User; IRBuilder<> IRBUser(InsertBefore); - Value *Off = IRBUser.CreateGEP(Int8Ty, BasePointer, // BasePointer is i8* - ConstantInt::get(Int32Ty, -Offset)); + Value *Off = + IRBUser.CreatePtrAdd(BasePointer, ConstantInt::get(Int32Ty, -Offset)); Value *Replacement = IRBUser.CreateBitCast(Off, AI->getType(), Name); if (auto *PHI = dyn_cast(User)) @@ -647,8 +645,8 @@ Value *SafeStack::moveStaticAllocasToUnsafeStack( IRB.SetInsertPoint(BasePointer->getNextNode()); Value *StaticTop = - IRB.CreateGEP(Int8Ty, BasePointer, ConstantInt::get(Int32Ty, -FrameSize), - "unsafe_stack_static_top"); + IRB.CreatePtrAdd(BasePointer, ConstantInt::get(Int32Ty, -FrameSize), + "unsafe_stack_static_top"); IRB.CreateStore(StaticTop, UnsafeStackPtr); return StaticTop; } diff --git a/llvm/lib/Target/Hexagon/HexagonVectorCombine.cpp b/llvm/lib/Target/Hexagon/HexagonVectorCombine.cpp index aa12e9d513d4f..7231388445d51 100644 --- a/llvm/lib/Target/Hexagon/HexagonVectorCombine.cpp +++ b/llvm/lib/Target/Hexagon/HexagonVectorCombine.cpp @@ -687,8 +687,7 @@ auto AlignVectors::createAdjustedPointer(IRBuilderBase &Builder, Value *Ptr, if (auto *I = dyn_cast(Ptr)) if (Instruction *New = CloneMap.lookup(I)) Ptr = New; - return Builder.CreateGEP(Type::getInt8Ty(HVC.F.getContext()), Ptr, - HVC.getConstInt(Adjust), "gep"); + return Builder.CreatePtrAdd(Ptr, HVC.getConstInt(Adjust), "gep"); } auto AlignVectors::createAlignedPointer(IRBuilderBase &Builder, Value *Ptr, diff --git a/llvm/lib/Transforms/AggressiveInstCombine/AggressiveInstCombine.cpp b/llvm/lib/Transforms/AggressiveInstCombine/AggressiveInstCombine.cpp index d09ac1c099c1a..49fa0f59d4882 100644 --- a/llvm/lib/Transforms/AggressiveInstCombine/AggressiveInstCombine.cpp +++ b/llvm/lib/Transforms/AggressiveInstCombine/AggressiveInstCombine.cpp @@ -808,8 +808,8 @@ static bool foldConsecutiveLoads(Instruction &I, const DataLayout &DL, APInt Offset1(DL.getIndexTypeSizeInBits(Load1Ptr->getType()), 0); Load1Ptr = Load1Ptr->stripAndAccumulateConstantOffsets( DL, Offset1, /* AllowNonInbounds */ true); - Load1Ptr = Builder.CreateGEP(Builder.getInt8Ty(), Load1Ptr, - Builder.getInt32(Offset1.getZExtValue())); + Load1Ptr = Builder.CreatePtrAdd(Load1Ptr, + Builder.getInt32(Offset1.getZExtValue())); } // Generate wider load. NewLoad = Builder.CreateAlignedLoad(WiderType, Load1Ptr, LI1->getAlign(), diff --git a/llvm/lib/Transforms/Coroutines/CoroFrame.cpp b/llvm/lib/Transforms/Coroutines/CoroFrame.cpp index 89a1ad2243c84..4d2b31fbbcedb 100644 --- a/llvm/lib/Transforms/Coroutines/CoroFrame.cpp +++ b/llvm/lib/Transforms/Coroutines/CoroFrame.cpp @@ -2022,8 +2022,8 @@ static void insertSpills(const FrameDataInfo &FrameData, coro::Shape &Shape) { auto *FramePtr = GetFramePointer(Alloca); auto &Value = *Alias.second; auto ITy = IntegerType::get(C, Value.getBitWidth()); - auto *AliasPtr = Builder.CreateGEP(Type::getInt8Ty(C), FramePtr, - ConstantInt::get(ITy, Value)); + auto *AliasPtr = + Builder.CreatePtrAdd(FramePtr, ConstantInt::get(ITy, Value)); Alias.first->replaceUsesWithIf( AliasPtr, [&](Use &U) { return DT.dominates(CB, U); }); } diff --git a/llvm/lib/Transforms/IPO/ArgumentPromotion.cpp b/llvm/lib/Transforms/IPO/ArgumentPromotion.cpp index fb3fa8d23daa0..8058282c42250 100644 --- a/llvm/lib/Transforms/IPO/ArgumentPromotion.cpp +++ b/llvm/lib/Transforms/IPO/ArgumentPromotion.cpp @@ -100,7 +100,7 @@ static Value *createByteGEP(IRBuilderBase &IRB, const DataLayout &DL, Value *Ptr, Type *ResElemTy, int64_t Offset) { if (Offset != 0) { APInt APOffset(DL.getIndexTypeSizeInBits(Ptr->getType()), Offset); - Ptr = IRB.CreateGEP(IRB.getInt8Ty(), Ptr, IRB.getInt(APOffset)); + Ptr = IRB.CreatePtrAdd(Ptr, IRB.getInt(APOffset)); } return Ptr; } diff --git a/llvm/lib/Transforms/IPO/AttributorAttributes.cpp b/llvm/lib/Transforms/IPO/AttributorAttributes.cpp index cc5a4ee8c2bdf..585364dd7aa2e 100644 --- a/llvm/lib/Transforms/IPO/AttributorAttributes.cpp +++ b/llvm/lib/Transforms/IPO/AttributorAttributes.cpp @@ -298,8 +298,8 @@ static Value *constructPointer(Value *Ptr, int64_t Offset, << "-bytes\n"); if (Offset) - Ptr = IRB.CreateGEP(IRB.getInt8Ty(), Ptr, IRB.getInt64(Offset), - Ptr->getName() + ".b" + Twine(Offset)); + Ptr = IRB.CreatePtrAdd(Ptr, IRB.getInt64(Offset), + Ptr->getName() + ".b" + Twine(Offset)); return Ptr; } diff --git a/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp b/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp index 85afc020dbf8e..01aba47cdbfff 100644 --- a/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp +++ b/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp @@ -1769,7 +1769,7 @@ void DevirtModule::applyVirtualConstProp(CallSiteInfo &CSInfo, StringRef FnName, continue; auto *RetType = cast(Call.CB.getType()); IRBuilder<> B(&Call.CB); - Value *Addr = B.CreateGEP(Int8Ty, Call.VTable, Byte); + Value *Addr = B.CreatePtrAdd(Call.VTable, Byte); if (RetType->getBitWidth() == 1) { Value *Bits = B.CreateLoad(Int8Ty, Addr); Value *BitsAndBit = B.CreateAnd(Bits, Bit); @@ -2066,14 +2066,14 @@ void DevirtModule::scanTypeCheckedLoadUsers(Function *TypeCheckedLoadFunc) { Value *LoadedValue = nullptr; if (TypeCheckedLoadFunc->getIntrinsicID() == Intrinsic::type_checked_load_relative) { - Value *GEP = LoadB.CreateGEP(Int8Ty, Ptr, Offset); + Value *GEP = LoadB.CreatePtrAdd(Ptr, Offset); LoadedValue = LoadB.CreateLoad(Int32Ty, GEP); LoadedValue = LoadB.CreateSExt(LoadedValue, IntPtrTy); GEP = LoadB.CreatePtrToInt(GEP, IntPtrTy); LoadedValue = LoadB.CreateAdd(GEP, LoadedValue); LoadedValue = LoadB.CreateIntToPtr(LoadedValue, Int8PtrTy); } else { - Value *GEP = LoadB.CreateGEP(Int8Ty, Ptr, Offset); + Value *GEP = LoadB.CreatePtrAdd(Ptr, Offset); LoadedValue = LoadB.CreateLoad(Int8PtrTy, GEP); } diff --git a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp index 5e7e08eaa9978..fb5838bb7941a 100644 --- a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -1590,8 +1590,7 @@ void AddressSanitizer::instrumentMaskedLoadOrStore( InstrumentedAddress = IRB.CreateExtractElement(Addr, Index); } else if (Stride) { Index = IRB.CreateMul(Index, Stride); - Addr = IRB.CreateBitCast(Addr, PointerType::getUnqual(*C)); - InstrumentedAddress = IRB.CreateGEP(Type::getInt8Ty(*C), Addr, {Index}); + InstrumentedAddress = IRB.CreatePtrAdd(Addr, Index); } else { InstrumentedAddress = IRB.CreateGEP(VTy, Addr, {Zero, Index}); } diff --git a/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp index f7f8fed643e93..efb621cde9065 100644 --- a/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp @@ -862,7 +862,7 @@ Value *HWAddressSanitizer::memToShadow(Value *Mem, IRBuilder<> &IRB) { if (Mapping.Offset == 0) return IRB.CreateIntToPtr(Shadow, PtrTy); // (Mem >> Scale) + Offset - return IRB.CreateGEP(Int8Ty, ShadowBase, Shadow); + return IRB.CreatePtrAdd(ShadowBase, Shadow); } int64_t HWAddressSanitizer::getAccessInfo(bool IsWrite, diff --git a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp index 94af63da38c82..5b3f26a5f54eb 100644 --- a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp @@ -5253,8 +5253,8 @@ struct VarArgAArch64Helper : public VarArgHelperBase { Align(8), /*isStore*/ true) .first; - Value *GrSrcPtr = IRB.CreateInBoundsGEP(IRB.getInt8Ty(), VAArgTLSCopy, - GrRegSaveAreaShadowPtrOff); + Value *GrSrcPtr = + IRB.CreateInBoundsPtrAdd(VAArgTLSCopy, GrRegSaveAreaShadowPtrOff); Value *GrCopySize = IRB.CreateSub(GrArgSize, GrRegSaveAreaShadowPtrOff); IRB.CreateMemCpy(GrRegSaveAreaShadowPtr, Align(8), GrSrcPtr, Align(8), @@ -5269,10 +5269,9 @@ struct VarArgAArch64Helper : public VarArgHelperBase { Align(8), /*isStore*/ true) .first; - Value *VrSrcPtr = IRB.CreateInBoundsGEP( - IRB.getInt8Ty(), - IRB.CreateInBoundsGEP(IRB.getInt8Ty(), VAArgTLSCopy, - IRB.getInt32(AArch64VrBegOffset)), + Value *VrSrcPtr = IRB.CreateInBoundsPtrAdd( + IRB.CreateInBoundsPtrAdd(VAArgTLSCopy, + IRB.getInt32(AArch64VrBegOffset)), VrRegSaveAreaShadowPtrOff); Value *VrCopySize = IRB.CreateSub(VrArgSize, VrRegSaveAreaShadowPtrOff); @@ -5285,8 +5284,8 @@ struct VarArgAArch64Helper : public VarArgHelperBase { Align(16), /*isStore*/ true) .first; - Value *StackSrcPtr = IRB.CreateInBoundsGEP( - IRB.getInt8Ty(), VAArgTLSCopy, IRB.getInt32(AArch64VAEndOffset)); + Value *StackSrcPtr = IRB.CreateInBoundsPtrAdd( + VAArgTLSCopy, IRB.getInt32(AArch64VAEndOffset)); IRB.CreateMemCpy(StackSaveAreaShadowPtr, Align(16), StackSrcPtr, Align(16), VAArgOverflowSize); diff --git a/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp b/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp index ce570bdfd8b8d..17c1c44238422 100644 --- a/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp +++ b/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp @@ -329,8 +329,8 @@ ModuleSanitizerCoverage::CreateSecStartEnd(Module &M, const char *Section, // Account for the fact that on windows-msvc __start_* symbols actually // point to a uint64_t before the start of the array. - auto GEP = IRB.CreateGEP(Int8Ty, SecStart, - ConstantInt::get(IntptrTy, sizeof(uint64_t))); + auto GEP = + IRB.CreatePtrAdd(SecStart, ConstantInt::get(IntptrTy, sizeof(uint64_t))); return std::make_pair(GEP, SecEnd); } diff --git a/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp b/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp index 9d058e0d24837..805bbe40bd7c7 100644 --- a/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp +++ b/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp @@ -1297,9 +1297,9 @@ bool MemCpyOptPass::processMemSetMemCpyDependence(MemCpyInst *MemCpy, Value *SizeDiff = Builder.CreateSub(DestSize, SrcSize); Value *MemsetLen = Builder.CreateSelect( Ule, ConstantInt::getNullValue(DestSize->getType()), SizeDiff); - Instruction *NewMemSet = Builder.CreateMemSet( - Builder.CreateGEP(Builder.getInt8Ty(), Dest, SrcSize), - MemSet->getOperand(1), MemsetLen, Alignment); + Instruction *NewMemSet = + Builder.CreateMemSet(Builder.CreatePtrAdd(Dest, SrcSize), + MemSet->getOperand(1), MemsetLen, Alignment); assert(isa(MSSAU->getMemorySSA()->getMemoryAccess(MemCpy)) && "MemCpy must be a MemoryDef"); diff --git a/llvm/lib/Transforms/Scalar/SROA.cpp b/llvm/lib/Transforms/Scalar/SROA.cpp index 75cddfa16d6db..a40ca7fd6b7de 100644 --- a/llvm/lib/Transforms/Scalar/SROA.cpp +++ b/llvm/lib/Transforms/Scalar/SROA.cpp @@ -1903,8 +1903,8 @@ static Value *getAdjustedPtr(IRBuilderTy &IRB, const DataLayout &DL, Value *Ptr, APInt Offset, Type *PointerTy, const Twine &NamePrefix) { if (Offset != 0) - Ptr = IRB.CreateInBoundsGEP(IRB.getInt8Ty(), Ptr, IRB.getInt(Offset), - NamePrefix + "sroa_idx"); + Ptr = IRB.CreateInBoundsPtrAdd(Ptr, IRB.getInt(Offset), + NamePrefix + "sroa_idx"); return IRB.CreatePointerBitCastOrAddrSpaceCast(Ptr, PointerTy, NamePrefix + "sroa_cast"); } diff --git a/llvm/lib/Transforms/Scalar/SeparateConstOffsetFromGEP.cpp b/llvm/lib/Transforms/Scalar/SeparateConstOffsetFromGEP.cpp index d2fed11445e4d..17c466f38c9c3 100644 --- a/llvm/lib/Transforms/Scalar/SeparateConstOffsetFromGEP.cpp +++ b/llvm/lib/Transforms/Scalar/SeparateConstOffsetFromGEP.cpp @@ -896,8 +896,7 @@ void SeparateConstOffsetFromGEP::lowerToSingleIndexGEPs( } } // Create an ugly GEP with a single index for each index. - ResultPtr = - Builder.CreateGEP(Builder.getInt8Ty(), ResultPtr, Idx, "uglygep"); + ResultPtr = Builder.CreatePtrAdd(ResultPtr, Idx, "uglygep"); if (FirstResult == nullptr) FirstResult = ResultPtr; } @@ -906,8 +905,7 @@ void SeparateConstOffsetFromGEP::lowerToSingleIndexGEPs( // Create a GEP with the constant offset index. if (AccumulativeByteOffset != 0) { Value *Offset = ConstantInt::get(PtrIndexTy, AccumulativeByteOffset); - ResultPtr = - Builder.CreateGEP(Builder.getInt8Ty(), ResultPtr, Offset, "uglygep"); + ResultPtr = Builder.CreatePtrAdd(ResultPtr, Offset, "uglygep"); } else isSwapCandidate = false; @@ -1107,9 +1105,8 @@ bool SeparateConstOffsetFromGEP::splitGEP(GetElementPtrInst *GEP) { Type *PtrIdxTy = DL->getIndexType(GEP->getType()); IRBuilder<> Builder(GEP); - NewGEP = cast(Builder.CreateGEP( - Builder.getInt8Ty(), NewGEP, - {ConstantInt::get(PtrIdxTy, AccumulativeByteOffset, true)}, + NewGEP = cast(Builder.CreatePtrAdd( + NewGEP, ConstantInt::get(PtrIdxTy, AccumulativeByteOffset, true), GEP->getName(), GEPWasInBounds)); NewGEP->copyMetadata(*GEP); diff --git a/llvm/lib/Transforms/Scalar/StraightLineStrengthReduce.cpp b/llvm/lib/Transforms/Scalar/StraightLineStrengthReduce.cpp index 2cce6eb22341c..75910d7b698aa 100644 --- a/llvm/lib/Transforms/Scalar/StraightLineStrengthReduce.cpp +++ b/llvm/lib/Transforms/Scalar/StraightLineStrengthReduce.cpp @@ -656,8 +656,7 @@ void StraightLineStrengthReduce::rewriteCandidateWithBasis( case Candidate::GEP: { bool InBounds = cast(C.Ins)->isInBounds(); // C = (char *)Basis + Bump - Reduced = - Builder.CreateGEP(Builder.getInt8Ty(), Basis.Ins, Bump, "", InBounds); + Reduced = Builder.CreatePtrAdd(Basis.Ins, Bump, "", InBounds); break; } default: diff --git a/llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp b/llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp index cd3ac317cd238..a1d7f0f9ba0f7 100644 --- a/llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp +++ b/llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp @@ -169,12 +169,8 @@ Value *SCEVExpander::InsertNoopCastOfTo(Value *V, Type *Ty) { // during expansion. if (Op == Instruction::IntToPtr) { auto *PtrTy = cast(Ty); - if (DL.isNonIntegralPointerType(PtrTy)) { - assert(DL.getTypeAllocSize(Builder.getInt8Ty()) == 1 && - "alloc size of i8 must by 1 byte for the GEP to be correct"); - return Builder.CreateGEP( - Builder.getInt8Ty(), Constant::getNullValue(PtrTy), V, "scevgep"); - } + if (DL.isNonIntegralPointerType(PtrTy)) + return Builder.CreatePtrAdd(Constant::getNullValue(PtrTy), V, "scevgep"); } // Short-circuit unnecessary bitcasts. if (Op == Instruction::BitCast) { @@ -321,7 +317,7 @@ Value *SCEVExpander::expandAddToGEP(const SCEV *Offset, Value *V) { // Fold a GEP with constant operands. if (Constant *CLHS = dyn_cast(V)) if (Constant *CRHS = dyn_cast(Idx)) - return Builder.CreateGEP(Builder.getInt8Ty(), CLHS, CRHS); + return Builder.CreatePtrAdd(CLHS, CRHS); // Do a quick scan to see if we have this GEP nearby. If so, reuse it. unsigned ScanLimit = 6; @@ -358,7 +354,7 @@ Value *SCEVExpander::expandAddToGEP(const SCEV *Offset, Value *V) { } // Emit a GEP. - return Builder.CreateGEP(Builder.getInt8Ty(), V, Idx, "scevgep"); + return Builder.CreatePtrAdd(V, Idx, "scevgep"); } /// PickMostRelevantLoop - Given two loops pick the one that's most relevant for @@ -2123,9 +2119,9 @@ Value *SCEVExpander::generateOverflowCheck(const SCEVAddRecExpr *AR, if (isa(ARTy)) { Value *NegMulV = Builder.CreateNeg(MulV); if (NeedPosCheck) - Add = Builder.CreateGEP(Builder.getInt8Ty(), StartValue, MulV); + Add = Builder.CreatePtrAdd(StartValue, MulV); if (NeedNegCheck) - Sub = Builder.CreateGEP(Builder.getInt8Ty(), StartValue, NegMulV); + Sub = Builder.CreatePtrAdd(StartValue, NegMulV); } else { if (NeedPosCheck) Add = Builder.CreateAdd(StartValue, MulV); diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp index 9743fa0e74020..f38d4a9ec1ea9 100644 --- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp +++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp @@ -2346,9 +2346,8 @@ emitTransformedIndex(IRBuilderBase &B, Value *Index, Value *StartValue, auto *Offset = CreateMul(Index, Step); return CreateAdd(StartValue, Offset); } - case InductionDescriptor::IK_PtrInduction: { - return B.CreateGEP(B.getInt8Ty(), StartValue, CreateMul(Index, Step)); - } + case InductionDescriptor::IK_PtrInduction: + return B.CreatePtrAdd(StartValue, CreateMul(Index, Step)); case InductionDescriptor::IK_FpInduction: { assert(!isa(Index->getType()) && "Vector indices not supported for FP inductions yet"); diff --git a/llvm/unittests/Analysis/BasicAliasAnalysisTest.cpp b/llvm/unittests/Analysis/BasicAliasAnalysisTest.cpp index 8f0feb6e4797e..4e96b66776617 100644 --- a/llvm/unittests/Analysis/BasicAliasAnalysisTest.cpp +++ b/llvm/unittests/Analysis/BasicAliasAnalysisTest.cpp @@ -118,7 +118,7 @@ TEST_F(BasicAATest, AliasInstWithFullObjectOfImpreciseSize) { Value *ArbitraryI32 = F->arg_begin(); AllocaInst *I8 = B.CreateAlloca(B.getInt8Ty(), B.getInt32(2)); auto *I8AtUncertainOffset = - cast(B.CreateGEP(B.getInt8Ty(), I8, ArbitraryI32)); + cast(B.CreatePtrAdd(I8, ArbitraryI32)); auto &AllAnalyses = setupAnalyses(); BasicAAResult &BasicAA = AllAnalyses.BAA; @@ -153,13 +153,11 @@ TEST_F(BasicAATest, PartialAliasOffsetPhi) { B.CreateCondBr(I, B1, B2); B.SetInsertPoint(B1); - auto *Ptr1 = - cast(B.CreateGEP(B.getInt8Ty(), Ptr, B.getInt32(1))); + auto *Ptr1 = cast(B.CreatePtrAdd(Ptr, B.getInt32(1))); B.CreateBr(End); B.SetInsertPoint(B2); - auto *Ptr2 = - cast(B.CreateGEP(B.getInt8Ty(), Ptr, B.getInt32(1))); + auto *Ptr2 = cast(B.CreatePtrAdd(Ptr, B.getInt32(1))); B.CreateBr(End); B.SetInsertPoint(End); @@ -188,10 +186,8 @@ TEST_F(BasicAATest, PartialAliasOffsetSelect) { BasicBlock *Entry(BasicBlock::Create(C, "", F)); B.SetInsertPoint(Entry); - auto *Ptr1 = - cast(B.CreateGEP(B.getInt8Ty(), Ptr, B.getInt32(1))); - auto *Ptr2 = - cast(B.CreateGEP(B.getInt8Ty(), Ptr, B.getInt32(1))); + auto *Ptr1 = cast(B.CreatePtrAdd(Ptr, B.getInt32(1))); + auto *Ptr2 = cast(B.CreatePtrAdd(Ptr, B.getInt32(1))); auto *Select = B.CreateSelect(I, Ptr1, Ptr2); B.CreateRetVoid(); diff --git a/llvm/unittests/Analysis/MemorySSATest.cpp b/llvm/unittests/Analysis/MemorySSATest.cpp index 4c157d5bedfc2..e730c5b04bbb1 100644 --- a/llvm/unittests/Analysis/MemorySSATest.cpp +++ b/llvm/unittests/Analysis/MemorySSATest.cpp @@ -1112,8 +1112,8 @@ TEST_F(MemorySSATest, LifetimeMarkersAreClobbers) { B.SetInsertPoint(Entry); Value *Foo = &*F->arg_begin(); - Value *Bar = B.CreateGEP(B.getInt8Ty(), Foo, B.getInt64(1), "bar"); - Value *Baz = B.CreateGEP(B.getInt8Ty(), Foo, B.getInt64(2), "baz"); + Value *Bar = B.CreatePtrAdd(Foo, B.getInt64(1), "bar"); + Value *Baz = B.CreatePtrAdd(Foo, B.getInt64(2), "baz"); B.CreateStore(B.getInt8(0), Foo); B.CreateStore(B.getInt8(0), Bar); @@ -1486,7 +1486,7 @@ TEST_F(MemorySSATest, TestCallClobber) { Value *Pointer1 = &*F->arg_begin(); BasicBlock *Entry(BasicBlock::Create(C, "", F)); B.SetInsertPoint(Entry); - Value *Pointer2 = B.CreateGEP(B.getInt8Ty(), Pointer1, B.getInt64(1)); + Value *Pointer2 = B.CreatePtrAdd(Pointer1, B.getInt64(1)); Instruction *StorePointer1 = B.CreateStore(B.getInt8(0), Pointer1); Instruction *StorePointer2 = B.CreateStore(B.getInt8(0), Pointer2); Instruction *MemSet = B.CreateMemSet(Pointer2, B.getInt8(0), 1, Align(1)); @@ -1518,7 +1518,7 @@ TEST_F(MemorySSATest, TestLoadClobber) { Value *Pointer1 = &*F->arg_begin(); BasicBlock *Entry(BasicBlock::Create(C, "", F)); B.SetInsertPoint(Entry); - Value *Pointer2 = B.CreateGEP(B.getInt8Ty(), Pointer1, B.getInt64(1)); + Value *Pointer2 = B.CreatePtrAdd(Pointer1, B.getInt64(1)); Instruction *LoadPointer1 = B.CreateLoad(B.getInt8Ty(), Pointer1, /* Volatile */ true); Instruction *LoadPointer2 =