JOE1994 created this revision. JOE1994 added reviewers: barannikov88, nikic. Herald added subscribers: StephenFan, kbarton, nemanjai. Herald added a project: All. JOE1994 requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
Partial progress towards replacing `CreateElementBitCast`, as it no longer does what its name suggests. Either replace its uses with `Address::withElementType()`, or remove them if no longer needed. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D153314 Files: clang/lib/CodeGen/CGAtomic.cpp clang/lib/CodeGen/CGCXXABI.cpp clang/lib/CodeGen/CGNonTrivialStruct.cpp clang/lib/CodeGen/MicrosoftCXXABI.cpp clang/lib/CodeGen/Targets/AArch64.cpp clang/lib/CodeGen/Targets/ARM.cpp clang/lib/CodeGen/Targets/Hexagon.cpp clang/lib/CodeGen/Targets/LoongArch.cpp clang/lib/CodeGen/Targets/PPC.cpp clang/lib/CodeGen/Targets/X86.cpp
Index: clang/lib/CodeGen/Targets/X86.cpp =================================================================== --- clang/lib/CodeGen/Targets/X86.cpp +++ clang/lib/CodeGen/Targets/X86.cpp @@ -318,8 +318,7 @@ ResultTruncRegTypes.push_back(CoerceTy); // Coerce the integer by bitcasting the return slot pointer. - ReturnSlot.setAddress( - CGF.Builder.CreateElementBitCast(ReturnSlot.getAddress(CGF), CoerceTy)); + ReturnSlot.setAddress(ReturnSlot.getAddress(CGF).withElementType(CoerceTy)); ResultRegDests.push_back(ReturnSlot); rewriteInputConstraintReferences(NumOutputs, 1, AsmString); @@ -3048,7 +3047,7 @@ assert(AI.isDirect() && "Unexpected ABI info for mixed regs"); llvm::StructType *ST = cast<llvm::StructType>(AI.getCoerceToType()); Address Tmp = CGF.CreateMemTemp(Ty); - Tmp = CGF.Builder.CreateElementBitCast(Tmp, ST); + Tmp = Tmp.withElementType(ST); assert(ST->getNumElements() == 2 && "Unexpected ABI info for mixed regs"); llvm::Type *TyLo = ST->getElementType(0); llvm::Type *TyHi = ST->getElementType(1); @@ -3076,11 +3075,10 @@ CharUnits::fromQuantity(getDataLayout().getABITypeAlign(TyHi))); CGF.Builder.CreateStore(V, CGF.Builder.CreateStructGEP(Tmp, 1)); - RegAddr = CGF.Builder.CreateElementBitCast(Tmp, LTy); + RegAddr = Tmp.withElementType(LTy); } else if (neededInt) { RegAddr = Address(CGF.Builder.CreateGEP(CGF.Int8Ty, RegSaveArea, gp_offset), - CGF.Int8Ty, CharUnits::fromQuantity(8)); - RegAddr = CGF.Builder.CreateElementBitCast(RegAddr, LTy); + LTy, CharUnits::fromQuantity(8)); // Copy to a temporary if necessary to ensure the appropriate alignment. auto TInfo = getContext().getTypeInfoInChars(Ty); @@ -3097,8 +3095,7 @@ } else if (neededSSE == 1) { RegAddr = Address(CGF.Builder.CreateGEP(CGF.Int8Ty, RegSaveArea, fp_offset), - CGF.Int8Ty, CharUnits::fromQuantity(16)); - RegAddr = CGF.Builder.CreateElementBitCast(RegAddr, LTy); + LTy, CharUnits::fromQuantity(16)); } else { assert(neededSSE == 2 && "Invalid number of needed registers!"); // SSE registers are spaced 16 bytes apart in the register save @@ -3118,15 +3115,15 @@ : llvm::StructType::get(CGF.DoubleTy, CGF.DoubleTy); llvm::Value *V; Address Tmp = CGF.CreateMemTemp(Ty); - Tmp = CGF.Builder.CreateElementBitCast(Tmp, ST); - V = CGF.Builder.CreateLoad(CGF.Builder.CreateElementBitCast( - RegAddrLo, ST->getStructElementType(0))); + Tmp = Tmp.withElementType(ST); + V = CGF.Builder.CreateLoad( + RegAddrLo.withElementType(ST->getStructElementType(0))); CGF.Builder.CreateStore(V, CGF.Builder.CreateStructGEP(Tmp, 0)); - V = CGF.Builder.CreateLoad(CGF.Builder.CreateElementBitCast( - RegAddrHi, ST->getStructElementType(1))); + V = CGF.Builder.CreateLoad( + RegAddrHi.withElementType(ST->getStructElementType(1))); CGF.Builder.CreateStore(V, CGF.Builder.CreateStructGEP(Tmp, 1)); - RegAddr = CGF.Builder.CreateElementBitCast(Tmp, LTy); + RegAddr = Tmp.withElementType(LTy); } // AMD64-ABI 3.5.7p5: Step 5. Set: Index: clang/lib/CodeGen/Targets/PPC.cpp =================================================================== --- clang/lib/CodeGen/Targets/PPC.cpp +++ clang/lib/CodeGen/Targets/PPC.cpp @@ -31,8 +31,8 @@ } llvm::Type *EltTy = CGF.ConvertTypeForMem(CTy->getElementType()); - RealAddr = CGF.Builder.CreateElementBitCast(RealAddr, EltTy); - ImagAddr = CGF.Builder.CreateElementBitCast(ImagAddr, EltTy); + RealAddr = RealAddr.withElementType(EltTy); + ImagAddr = ImagAddr.withElementType(EltTy); llvm::Value *Real = CGF.Builder.CreateLoad(RealAddr, ".vareal"); llvm::Value *Imag = CGF.Builder.CreateLoad(ImagAddr, ".vaimag"); @@ -456,8 +456,7 @@ Builder.CreateMul(NumRegs, Builder.getInt8(RegSize.getQuantity())); RegAddr = Address( Builder.CreateInBoundsGEP(CGF.Int8Ty, RegAddr.getPointer(), RegOffset), - CGF.Int8Ty, RegAddr.getAlignment().alignmentOfArrayElement(RegSize)); - RegAddr = Builder.CreateElementBitCast(RegAddr, DirectTy); + DirectTy, RegAddr.getAlignment().alignmentOfArrayElement(RegSize)); // Increase the used-register count. NumRegs = @@ -498,7 +497,7 @@ OverflowArea.getElementType(), Align); } - MemAddr = Builder.CreateElementBitCast(OverflowArea, DirectTy); + MemAddr = OverflowArea.withElementType(DirectTy); // Increase the overflow area. OverflowArea = Builder.CreateConstInBoundsByteGEP(OverflowArea, Size); Index: clang/lib/CodeGen/Targets/LoongArch.cpp =================================================================== --- clang/lib/CodeGen/Targets/LoongArch.cpp +++ clang/lib/CodeGen/Targets/LoongArch.cpp @@ -410,12 +410,9 @@ CharUnits SlotSize = CharUnits::fromQuantity(GRLen / 8); // Empty records are ignored for parameter passing purposes. - if (isEmptyRecord(getContext(), Ty, true)) { - Address Addr = Address(CGF.Builder.CreateLoad(VAListAddr), - getVAListElementType(CGF), SlotSize); - Addr = CGF.Builder.CreateElementBitCast(Addr, CGF.ConvertTypeForMem(Ty)); - return Addr; - } + if (isEmptyRecord(getContext(), Ty, true)) + return Address(CGF.Builder.CreateLoad(VAListAddr), + CGF.ConvertTypeForMem(Ty), SlotSize); auto TInfo = getContext().getTypeInfoInChars(Ty); Index: clang/lib/CodeGen/Targets/Hexagon.cpp =================================================================== --- clang/lib/CodeGen/Targets/Hexagon.cpp +++ clang/lib/CodeGen/Targets/Hexagon.cpp @@ -213,10 +213,8 @@ // Get the type of the argument from memory and bitcast // overflow area pointer to the argument type. llvm::Type *PTy = CGF.ConvertTypeForMem(Ty); - Address AddrTyped = CGF.Builder.CreateElementBitCast( - Address(__overflow_area_pointer, CGF.Int8Ty, - CharUnits::fromQuantity(Align)), - PTy); + Address AddrTyped = + Address(__overflow_area_pointer, PTy, CharUnits::fromQuantity(Align)); // Round up to the minimum stack alignment for varargs which is 4 bytes. uint64_t Offset = llvm::alignTo(CGF.getContext().getTypeSize(Ty) / 8, 4); @@ -247,9 +245,8 @@ AddrAsInt = Builder.CreateAnd(AddrAsInt, Builder.getInt32(~(TyAlign - 1))); Addr = Builder.CreateIntToPtr(AddrAsInt, BP); } - Address AddrTyped = Builder.CreateElementBitCast( - Address(Addr, CGF.Int8Ty, CharUnits::fromQuantity(TyAlign)), - CGF.ConvertType(Ty)); + Address AddrTyped = + Address(Addr, CGF.ConvertType(Ty), CharUnits::fromQuantity(TyAlign)); uint64_t Offset = llvm::alignTo(CGF.getContext().getTypeSize(Ty) / 8, 4); llvm::Value *NextAddr = Builder.CreateGEP( Index: clang/lib/CodeGen/Targets/ARM.cpp =================================================================== --- clang/lib/CodeGen/Targets/ARM.cpp +++ clang/lib/CodeGen/Targets/ARM.cpp @@ -765,10 +765,9 @@ // Empty records are ignored for parameter passing purposes. if (isEmptyRecord(getContext(), Ty, true)) { - VAListAddr = CGF.Builder.CreateElementBitCast(VAListAddr, CGF.Int8PtrTy); + VAListAddr = VAListAddr.withElementType(CGF.Int8PtrTy); auto *Load = CGF.Builder.CreateLoad(VAListAddr); - Address Addr = Address(Load, CGF.Int8Ty, SlotSize); - return CGF.Builder.CreateElementBitCast(Addr, CGF.ConvertTypeForMem(Ty)); + return Address(Load, CGF.ConvertTypeForMem(Ty), SlotSize); } CharUnits TySize = getContext().getTypeSizeInChars(Ty); Index: clang/lib/CodeGen/Targets/AArch64.cpp =================================================================== --- clang/lib/CodeGen/Targets/AArch64.cpp +++ clang/lib/CodeGen/Targets/AArch64.cpp @@ -517,10 +517,10 @@ if (AI.isIgnore()) { uint64_t PointerSize = getTarget().getPointerWidth(LangAS::Default) / 8; CharUnits SlotSize = CharUnits::fromQuantity(PointerSize); - VAListAddr = CGF.Builder.CreateElementBitCast(VAListAddr, CGF.Int8PtrTy); + VAListAddr = VAListAddr.withElementType(CGF.Int8PtrTy); auto *Load = CGF.Builder.CreateLoad(VAListAddr); Address Addr = Address(Load, CGF.Int8Ty, SlotSize); - return CGF.Builder.CreateElementBitCast(Addr, CGF.ConvertTypeForMem(Ty)); + return Addr.withElementType(CGF.ConvertTypeForMem(Ty)); } bool IsIndirect = AI.isIndirect(); @@ -672,7 +672,7 @@ CharUnits BaseOffset = CharUnits::fromQuantity(16 * i + Offset); Address LoadAddr = CGF.Builder.CreateConstInBoundsByteGEP(BaseAddr, BaseOffset); - LoadAddr = CGF.Builder.CreateElementBitCast(LoadAddr, BaseTy); + LoadAddr = LoadAddr.withElementType(BaseTy); Address StoreAddr = CGF.Builder.CreateConstArrayGEP(Tmp, i); @@ -680,7 +680,7 @@ CGF.Builder.CreateStore(Elem, StoreAddr); } - RegAddr = CGF.Builder.CreateElementBitCast(Tmp, MemTy); + RegAddr = Tmp.withElementType(MemTy); } else { // Otherwise the object is contiguous in memory. @@ -693,7 +693,7 @@ BaseAddr = CGF.Builder.CreateConstInBoundsByteGEP(BaseAddr, Offset); } - RegAddr = CGF.Builder.CreateElementBitCast(BaseAddr, MemTy); + RegAddr = BaseAddr.withElementType(MemTy); } CGF.EmitBranch(ContBlock); @@ -746,7 +746,7 @@ OnStackAddr = CGF.Builder.CreateConstInBoundsByteGEP(OnStackAddr, Offset); } - OnStackAddr = CGF.Builder.CreateElementBitCast(OnStackAddr, MemTy); + OnStackAddr = OnStackAddr.withElementType(MemTy); CGF.EmitBranch(ContBlock); @@ -777,12 +777,9 @@ CharUnits SlotSize = CharUnits::fromQuantity(PointerSize); // Empty records are ignored for parameter passing purposes. - if (isEmptyRecord(getContext(), Ty, true)) { - Address Addr = Address(CGF.Builder.CreateLoad(VAListAddr, "ap.cur"), - getVAListElementType(CGF), SlotSize); - Addr = CGF.Builder.CreateElementBitCast(Addr, CGF.ConvertTypeForMem(Ty)); - return Addr; - } + if (isEmptyRecord(getContext(), Ty, true)) + return Address(CGF.Builder.CreateLoad(VAListAddr, "ap.cur"), + CGF.ConvertTypeForMem(Ty), SlotSize); // The size of the actual thing passed, which might end up just // being a pointer for indirect types. Index: clang/lib/CodeGen/MicrosoftCXXABI.cpp =================================================================== --- clang/lib/CodeGen/MicrosoftCXXABI.cpp +++ clang/lib/CodeGen/MicrosoftCXXABI.cpp @@ -936,7 +936,7 @@ std::tuple<Address, llvm::Value *, const CXXRecordDecl *> MicrosoftCXXABI::performBaseAdjustment(CodeGenFunction &CGF, Address Value, QualType SrcRecordTy) { - Value = CGF.Builder.CreateElementBitCast(Value, CGF.Int8Ty); + Value = Value.withElementType(CGF.Int8Ty); const CXXRecordDecl *SrcDecl = SrcRecordTy->getAsCXXRecordDecl(); const ASTContext &Context = getContext(); @@ -1438,7 +1438,7 @@ if (Adjustment.isZero()) return This; - This = CGF.Builder.CreateElementBitCast(This, CGF.Int8Ty); + This = This.withElementType(CGF.Int8Ty); assert(Adjustment.isPositive()); return CGF.Builder.CreateConstByteGEP(This, Adjustment); } @@ -1469,7 +1469,7 @@ Address Result = This; if (ML.VBase) { - Result = CGF.Builder.CreateElementBitCast(Result, CGF.Int8Ty); + Result = Result.withElementType(CGF.Int8Ty); const CXXRecordDecl *Derived = MD->getParent(); const CXXRecordDecl *VBase = ML.VBase; @@ -1483,7 +1483,7 @@ } if (!StaticOffset.isZero()) { assert(StaticOffset.isPositive()); - Result = CGF.Builder.CreateElementBitCast(Result, CGF.Int8Ty); + Result = Result.withElementType(CGF.Int8Ty); if (ML.VBase) { // Non-virtual adjustment might result in a pointer outside the allocated // object, e.g. if the final overrider class is laid out after the virtual @@ -2203,7 +2203,7 @@ if (TA.isEmpty()) return This.getPointer(); - This = CGF.Builder.CreateElementBitCast(This, CGF.Int8Ty); + This = This.withElementType(CGF.Int8Ty); llvm::Value *V; if (TA.Virtual.isEmpty()) { @@ -2214,7 +2214,7 @@ Address VtorDispPtr = CGF.Builder.CreateConstInBoundsByteGEP(This, CharUnits::fromQuantity(TA.Virtual.Microsoft.VtordispOffset)); - VtorDispPtr = CGF.Builder.CreateElementBitCast(VtorDispPtr, CGF.Int32Ty); + VtorDispPtr = VtorDispPtr.withElementType(CGF.Int32Ty); llvm::Value *VtorDisp = CGF.Builder.CreateLoad(VtorDispPtr, "vtordisp"); V = CGF.Builder.CreateGEP(This.getElementType(), This.getPointer(), CGF.Builder.CreateNeg(VtorDisp)); @@ -2256,7 +2256,7 @@ return Ret.getPointer(); auto OrigTy = Ret.getType(); - Ret = CGF.Builder.CreateElementBitCast(Ret, CGF.Int8Ty); + Ret = Ret.withElementType(CGF.Int8Ty); llvm::Value *V = Ret.getPointer(); if (RA.Virtual.Microsoft.VBIndex) { @@ -2300,8 +2300,7 @@ llvm::Value *MicrosoftCXXABI::readArrayCookieImpl(CodeGenFunction &CGF, Address allocPtr, CharUnits cookieSize) { - Address numElementsPtr = - CGF.Builder.CreateElementBitCast(allocPtr, CGF.SizeTy); + Address numElementsPtr = allocPtr.withElementType(CGF.SizeTy); return CGF.Builder.CreateLoad(numElementsPtr); } @@ -2319,8 +2318,7 @@ Address cookiePtr = newPtr; // Write the number of elements into the appropriate slot. - Address numElementsPtr - = CGF.Builder.CreateElementBitCast(cookiePtr, CGF.SizeTy); + Address numElementsPtr = cookiePtr.withElementType(CGF.SizeTy); CGF.Builder.CreateStore(numElements, numElementsPtr); // Finally, compute a pointer to the actual data buffer by skipping @@ -3120,7 +3118,7 @@ llvm::Value **VBPtrOut) { CGBuilderTy &Builder = CGF.Builder; // Load the vbtable pointer from the vbptr in the instance. - This = Builder.CreateElementBitCast(This, CGM.Int8Ty); + This = This.withElementType(CGM.Int8Ty); llvm::Value *VBPtr = Builder.CreateInBoundsGEP( This.getElementType(), This.getPointer(), VBPtrOffset, "vbptr"); if (VBPtrOut) *VBPtrOut = VBPtr; @@ -3157,7 +3155,7 @@ CodeGenFunction &CGF, const Expr *E, const CXXRecordDecl *RD, Address Base, llvm::Value *VBTableOffset, llvm::Value *VBPtrOffset) { CGBuilderTy &Builder = CGF.Builder; - Base = Builder.CreateElementBitCast(Base, CGM.Int8Ty); + Base = Base.withElementType(CGM.Int8Ty); llvm::BasicBlock *OriginalBB = nullptr; llvm::BasicBlock *SkipAdjustBB = nullptr; llvm::BasicBlock *VBaseAdjustBB = nullptr; Index: clang/lib/CodeGen/CGNonTrivialStruct.cpp =================================================================== --- clang/lib/CodeGen/CGNonTrivialStruct.cpp +++ clang/lib/CodeGen/CGNonTrivialStruct.cpp @@ -365,7 +365,7 @@ llvm::ConstantInt::get(NumElts->getType(), BaseEltSize); llvm::Value *SizeInBytes = CGF.Builder.CreateNUWMul(BaseEltSizeVal, NumElts); - Address BC = CGF.Builder.CreateElementBitCast(DstAddr, CGF.CGM.Int8Ty); + Address BC = DstAddr.withElementType(CGF.CGM.Int8Ty); llvm::Value *DstArrayEnd = CGF.Builder.CreateInBoundsGEP(CGF.Int8Ty, BC.getPointer(), SizeInBytes); DstArrayEnd = CGF.Builder.CreateBitCast( @@ -426,9 +426,9 @@ assert(Addr.isValid() && "invalid address"); if (Offset.getQuantity() == 0) return Addr; - Addr = CGF->Builder.CreateElementBitCast(Addr, CGF->CGM.Int8Ty); + Addr = Addr.withElementType(CGF->CGM.Int8Ty); Addr = CGF->Builder.CreateConstInBoundsGEP(Addr, Offset.getQuantity()); - return CGF->Builder.CreateElementBitCast(Addr, CGF->CGM.Int8PtrTy); + return Addr.withElementType(CGF->CGM.Int8PtrTy); } Address getAddrWithOffset(Address Addr, CharUnits StructFieldOffset, @@ -491,8 +491,7 @@ for (unsigned I = 0; I < N; ++I) { Alignments[I] = Addrs[I].getAlignment(); - Ptrs[I] = CallerCGF.Builder.CreateElementBitCast( - Addrs[I], CallerCGF.CGM.Int8PtrTy).getPointer(); + Ptrs[I] = Addrs[I].getPointer(); } if (llvm::Function *F = @@ -526,17 +525,15 @@ !llvm::has_single_bit<uint32_t>(Size.getQuantity())) { llvm::Value *SizeVal = llvm::ConstantInt::get(this->CGF->SizeTy, Size.getQuantity()); - DstAddr = - this->CGF->Builder.CreateElementBitCast(DstAddr, this->CGF->Int8Ty); - SrcAddr = - this->CGF->Builder.CreateElementBitCast(SrcAddr, this->CGF->Int8Ty); + DstAddr = DstAddr.withElementType(this->CGF->Int8Ty); + SrcAddr = SrcAddr.withElementType(this->CGF->Int8Ty); this->CGF->Builder.CreateMemCpy(DstAddr, SrcAddr, SizeVal, false); } else { llvm::Type *Ty = llvm::Type::getIntNTy( this->CGF->getLLVMContext(), Size.getQuantity() * this->CGF->getContext().getCharWidth()); - DstAddr = this->CGF->Builder.CreateElementBitCast(DstAddr, Ty); - SrcAddr = this->CGF->Builder.CreateElementBitCast(SrcAddr, Ty); + DstAddr = DstAddr.withElementType(Ty); + SrcAddr = SrcAddr.withElementType(Ty); llvm::Value *SrcVal = this->CGF->Builder.CreateLoad(SrcAddr, false); this->CGF->Builder.CreateStore(SrcVal, DstAddr, false); } @@ -556,19 +553,17 @@ QualType RT = QualType(FD->getParent()->getTypeForDecl(), 0); llvm::Type *Ty = this->CGF->ConvertType(RT); Address DstAddr = this->getAddrWithOffset(Addrs[DstIdx], Offset); - LValue DstBase = this->CGF->MakeAddrLValue( - this->CGF->Builder.CreateElementBitCast(DstAddr, Ty), FT); + LValue DstBase = + this->CGF->MakeAddrLValue(DstAddr.withElementType(Ty), FT); DstLV = this->CGF->EmitLValueForField(DstBase, FD); Address SrcAddr = this->getAddrWithOffset(Addrs[SrcIdx], Offset); - LValue SrcBase = this->CGF->MakeAddrLValue( - this->CGF->Builder.CreateElementBitCast(SrcAddr, Ty), FT); + LValue SrcBase = + this->CGF->MakeAddrLValue(SrcAddr.withElementType(Ty), FT); SrcLV = this->CGF->EmitLValueForField(SrcBase, FD); } else { llvm::Type *Ty = this->CGF->ConvertTypeForMem(FT); - Address DstAddr = - this->CGF->Builder.CreateElementBitCast(Addrs[DstIdx], Ty); - Address SrcAddr = - this->CGF->Builder.CreateElementBitCast(Addrs[SrcIdx], Ty); + Address DstAddr = Addrs[DstIdx].withElementType(Ty); + Address SrcAddr = Addrs[SrcIdx].withElementType(Ty); DstLV = this->CGF->MakeAddrLValue(DstAddr, FT); SrcLV = this->CGF->MakeAddrLValue(SrcAddr, FT); } @@ -666,7 +661,7 @@ llvm::Constant *SizeVal = CGF->Builder.getInt64(Size.getQuantity()); Address DstAddr = getAddrWithOffset(Addrs[DstIdx], CurStructOffset, FD); - Address Loc = CGF->Builder.CreateElementBitCast(DstAddr, CGF->Int8Ty); + Address Loc = DstAddr.withElementType(CGF->Int8Ty); CGF->Builder.CreateMemSet(Loc, CGF->Builder.getInt8(0), SizeVal, IsVolatile); } @@ -818,8 +813,7 @@ // such structure. void CodeGenFunction::defaultInitNonTrivialCStructVar(LValue Dst) { GenDefaultInitialize Gen(getContext()); - Address DstPtr = - Builder.CreateElementBitCast(Dst.getAddress(*this), CGM.Int8PtrTy); + Address DstPtr = Dst.getAddress(*this).withElementType(CGM.Int8PtrTy); Gen.setCGF(this); QualType QT = Dst.getType(); QT = Dst.isVolatile() ? QT.withVolatile() : QT; @@ -832,7 +826,7 @@ std::array<Address, N> Addrs) { auto SetArtificialLoc = ApplyDebugLocation::CreateArtificial(CGF); for (unsigned I = 0; I < N; ++I) - Addrs[I] = CGF.Builder.CreateElementBitCast(Addrs[I], CGF.CGM.Int8PtrTy); + Addrs[I] = Addrs[I].withElementType(CGF.CGM.Int8PtrTy); QT = IsVolatile ? QT.withVolatile() : QT; Gen.callFunc(FuncName, QT, Addrs, CGF); } Index: clang/lib/CodeGen/CGCXXABI.cpp =================================================================== --- clang/lib/CodeGen/CGCXXABI.cpp +++ clang/lib/CodeGen/CGCXXABI.cpp @@ -247,7 +247,7 @@ llvm::Value *&numElements, llvm::Value *&allocPtr, CharUnits &cookieSize) { // Derive a char* in the same address space as the pointer. - ptr = CGF.Builder.CreateElementBitCast(ptr, CGF.Int8Ty); + ptr = ptr.withElementType(CGF.Int8Ty); // If we don't need an array cookie, bail out early. if (!requiresArrayCookie(expr, eltTy)) { Index: clang/lib/CodeGen/CGAtomic.cpp =================================================================== --- clang/lib/CodeGen/CGAtomic.cpp +++ clang/lib/CodeGen/CGAtomic.cpp @@ -1338,16 +1338,14 @@ if (E->getOp() == AtomicExpr::AO__atomic_nand_fetch) ResVal = Builder.CreateNot(ResVal); - Builder.CreateStore( - ResVal, Builder.CreateElementBitCast(Dest, ResVal->getType())); + Builder.CreateStore(ResVal, Dest.withElementType(ResVal->getType())); } if (RValTy->isVoidType()) return RValue::get(nullptr); - return convertTempToRValue( - Builder.CreateElementBitCast(Dest, ConvertTypeForMem(RValTy)), - RValTy, E->getExprLoc()); + return convertTempToRValue(Dest.withElementType(ConvertTypeForMem(RValTy)), + RValTy, E->getExprLoc()); } bool IsStore = E->getOp() == AtomicExpr::AO__c11_atomic_store || @@ -1398,9 +1396,8 @@ if (RValTy->isVoidType()) return RValue::get(nullptr); - return convertTempToRValue( - Builder.CreateElementBitCast(Dest, ConvertTypeForMem(RValTy)), - RValTy, E->getExprLoc()); + return convertTempToRValue(Dest.withElementType(ConvertTypeForMem(RValTy)), + RValTy, E->getExprLoc()); } // Long case, when Order isn't obviously constant. @@ -1470,15 +1467,14 @@ return RValue::get(nullptr); assert(Atomics.getValueSizeInBits() <= Atomics.getAtomicSizeInBits()); - return convertTempToRValue( - Builder.CreateElementBitCast(Dest, ConvertTypeForMem(RValTy)), - RValTy, E->getExprLoc()); + return convertTempToRValue(Dest.withElementType(ConvertTypeForMem(RValTy)), + RValTy, E->getExprLoc()); } Address AtomicInfo::emitCastToAtomicIntPointer(Address addr) const { llvm::IntegerType *ty = llvm::IntegerType::get(CGF.getLLVMContext(), AtomicSizeInBits); - return CGF.Builder.CreateElementBitCast(addr, ty); + return addr.withElementType(ty); } Address AtomicInfo::convertToAtomicIntPointer(Address Addr) const {
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits