diff --git a/clang/lib/CodeGen/CGBuilder.h b/clang/lib/CodeGen/CGBuilder.h --- a/clang/lib/CodeGen/CGBuilder.h +++ b/clang/lib/CodeGen/CGBuilder.h @@ -156,6 +156,7 @@ } /// This method is to be deprecated. Use `Address::withElementType` instead. + [[deprecated("Use `Address::withElementType` instead.")]] Address CreateElementBitCast(Address Addr, llvm::Type *Ty) { return Address(Addr.getPointer(), Ty, Addr.getAlignment(), Addr.isKnownNonNull()); diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -3951,7 +3951,6 @@ // Call LLVM's EH setjmp, which is lightweight. Function *F = CGM.getIntrinsic(Intrinsic::eh_sjlj_setjmp); - Buf = Builder.CreateElementBitCast(Buf, Int8Ty); return RValue::get(Builder.CreateCall(F, Buf.getPointer())); } case Builtin::BI__builtin_longjmp: { @@ -4259,7 +4258,7 @@ PtrTy->castAs()->getPointeeType().isVolatileQualified(); Address Ptr = EmitPointerWithAlignment(E->getArg(0)); - Ptr = Builder.CreateElementBitCast(Ptr, Int8Ty); + Ptr = Ptr.withElementType(Int8Ty); Value *NewVal = Builder.getInt8(0); Value *Order = EmitScalarExpr(E->getArg(1)); if (isa(Order)) { @@ -7287,7 +7286,7 @@ case NEON::BI__builtin_neon_vld1_dup_v: case NEON::BI__builtin_neon_vld1q_dup_v: { Value *V = PoisonValue::get(Ty); - PtrOp0 = Builder.CreateElementBitCast(PtrOp0, VTy->getElementType()); + PtrOp0 = PtrOp0.withElementType(VTy->getElementType()); LoadInst *Ld = Builder.CreateLoad(PtrOp0); llvm::Constant *CI = ConstantInt::get(SizeTy, 0); Ops[0] = Builder.CreateInsertElement(V, Ld, CI); @@ -8099,7 +8098,7 @@ Value *Val = EmitScalarExpr(E->getArg(0)); Builder.CreateStore(Val, Tmp); - Address LdPtr = Builder.CreateElementBitCast(Tmp, STy); + Address LdPtr = Tmp.withElementType(STy); Val = Builder.CreateLoad(LdPtr); Value *Arg0 = Builder.CreateExtractValue(Val, 0); @@ -8473,7 +8472,7 @@ [[fallthrough]]; case NEON::BI__builtin_neon_vld1_lane_v: { Ops[1] = Builder.CreateBitCast(Ops[1], Ty); - PtrOp0 = Builder.CreateElementBitCast(PtrOp0, VTy->getElementType()); + PtrOp0 = PtrOp0.withElementType(VTy->getElementType()); Value *Ld = Builder.CreateLoad(PtrOp0); return Builder.CreateInsertElement(Ops[1], Ld, Ops[2], "vld1_lane"); } @@ -8537,9 +8536,8 @@ case NEON::BI__builtin_neon_vst1_lane_v: { Ops[1] = Builder.CreateBitCast(Ops[1], Ty); Ops[1] = Builder.CreateExtractElement(Ops[1], Ops[2]); - auto St = Builder.CreateStore( - Ops[1], Builder.CreateElementBitCast(PtrOp0, Ops[1]->getType())); - return St; + return Builder.CreateStore(Ops[1], + PtrOp0.withElementType(Ops[1]->getType())); } case NEON::BI__builtin_neon_vtbl1_v: return EmitNeonCall(CGM.getIntrinsic(Intrinsic::arm_neon_vtbl1), @@ -10203,7 +10201,7 @@ Address Tmp = CreateMemTemp(E->getArg(0)->getType()); EmitAnyExprToMem(E->getArg(0), Tmp, Qualifiers(), /*init*/ true); - Tmp = Builder.CreateElementBitCast(Tmp, STy); + Tmp = Tmp.withElementType(STy); llvm::Value *Val = Builder.CreateLoad(Tmp); Value *Arg0 = Builder.CreateExtractValue(Val, 0); @@ -20001,8 +19999,8 @@ case Hexagon::BI__builtin_HEXAGON_V6_vsubcarry_128B: { // Get the type from the 0-th argument. llvm::Type *VecType = ConvertType(E->getArg(0)->getType()); - Address PredAddr = Builder.CreateElementBitCast( - EmitPointerWithAlignment(E->getArg(2)), VecType); + Address PredAddr = + EmitPointerWithAlignment(E->getArg(2)).withElementType(VecType); llvm::Value *PredIn = V2Q(Builder.CreateLoad(PredAddr)); llvm::Value *Result = Builder.CreateCall(CGM.getIntrinsic(ID), {EmitScalarExpr(E->getArg(0)), EmitScalarExpr(E->getArg(1)), PredIn}); @@ -20021,8 +20019,8 @@ case Hexagon::BI__builtin_HEXAGON_V6_vsubcarryo_128B: { // Get the type from the 0-th argument. llvm::Type *VecType = ConvertType(E->getArg(0)->getType()); - Address PredAddr = Builder.CreateElementBitCast( - EmitPointerWithAlignment(E->getArg(2)), VecType); + Address PredAddr = + EmitPointerWithAlignment(E->getArg(2)).withElementType(VecType); llvm::Value *Result = Builder.CreateCall(CGM.getIntrinsic(ID), {EmitScalarExpr(E->getArg(0)), EmitScalarExpr(E->getArg(1))}); diff --git a/clang/lib/CodeGen/CGCall.cpp b/clang/lib/CodeGen/CGCall.cpp --- a/clang/lib/CodeGen/CGCall.cpp +++ b/clang/lib/CodeGen/CGCall.cpp @@ -1286,7 +1286,7 @@ // // FIXME: Assert that we aren't truncating non-padding bits when have access // to that information. - Src = CGF.Builder.CreateElementBitCast(Src, Ty); + Src = Src.withElementType(Ty); return CGF.Builder.CreateLoad(Src); } @@ -1396,7 +1396,7 @@ if (isa(SrcTy) || isa(DstTy) || SrcSize.getFixedValue() <= DstSize.getFixedValue()) { - Dst = CGF.Builder.CreateElementBitCast(Dst, SrcTy); + Dst = Dst.withElementType(SrcTy); CGF.EmitAggregateStore(Src, Dst, DstIsVolatile); } else { // Otherwise do coercion through memory. This is stupid, but @@ -1420,10 +1420,10 @@ static Address emitAddressAtOffset(CodeGenFunction &CGF, Address addr, const ABIArgInfo &info) { if (unsigned offset = info.getDirectOffset()) { - addr = CGF.Builder.CreateElementBitCast(addr, CGF.Int8Ty); + addr = addr.withElementType(CGF.Int8Ty); addr = CGF.Builder.CreateConstInBoundsByteGEP(addr, CharUnits::fromQuantity(offset)); - addr = CGF.Builder.CreateElementBitCast(addr, info.getCoerceToType()); + addr = addr.withElementType(info.getCoerceToType()); } return addr; } @@ -3190,7 +3190,7 @@ Address AddrToStoreInto = Address::invalid(); if (SrcSize <= DstSize) { - AddrToStoreInto = Builder.CreateElementBitCast(Ptr, STy); + AddrToStoreInto = Ptr.withElementType(STy); } else { AddrToStoreInto = CreateTempAlloca(STy, Alloca.getAlignment(), "coerce"); @@ -3235,7 +3235,7 @@ ArgVals.push_back(ParamValue::forIndirect(alloca)); auto coercionType = ArgI.getCoerceAndExpandType(); - alloca = Builder.CreateElementBitCast(alloca, coercionType); + alloca = alloca.withElementType(coercionType); unsigned argIndex = FirstIRArg; for (unsigned i = 0, e = coercionType->getNumElements(); i != e; ++i) { @@ -3837,7 +3837,7 @@ // Load all of the coerced elements out into results. llvm::SmallVector results; - Address addr = Builder.CreateElementBitCast(ReturnValue, coercionType); + Address addr = ReturnValue.withElementType(coercionType); for (unsigned i = 0, e = coercionType->getNumElements(); i != e; ++i) { auto coercedEltType = coercionType->getElementType(i); if (ABIArgInfo::isPaddingForCoerceAndExpand(coercedEltType)) @@ -5063,10 +5063,7 @@ // Store the RValue into the argument struct. Address Addr = Builder.CreateStructGEP(ArgMemory, ArgInfo.getInAllocaFieldIndex()); - // There are some cases where a trivial bitcast is not avoidable. The - // definition of a type later in a translation unit may change it's type - // from {}* to (%struct.foo*)*. - Addr = Builder.CreateElementBitCast(Addr, ConvertTypeForMem(I->Ty)); + Addr = Addr.withElementType(ConvertTypeForMem(I->Ty)); I->copyInto(*this, Addr); } break; @@ -5261,7 +5258,7 @@ Builder.CreateMemCpy(TempAlloca, Src, SrcSize); Src = TempAlloca; } else { - Src = Builder.CreateElementBitCast(Src, STy); + Src = Src.withElementType(STy); } assert(NumIRArgs == STy->getNumElements()); @@ -5325,7 +5322,7 @@ Builder.CreateStore(RV.getScalarVal(), addr); } - addr = Builder.CreateElementBitCast(addr, coercionType); + addr = addr.withElementType(coercionType); unsigned IRArgPos = FirstIRArg; for (unsigned i = 0, e = coercionType->getNumElements(); i != e; ++i) { @@ -5680,8 +5677,7 @@ case ABIArgInfo::CoerceAndExpand: { auto coercionType = RetAI.getCoerceAndExpandType(); - Address addr = SRetPtr; - addr = Builder.CreateElementBitCast(addr, coercionType); + Address addr = SRetPtr.withElementType(coercionType); assert(CI->getType() == RetAI.getUnpaddedCoerceAndExpandType()); bool requiresExtract = isa(CI->getType()); diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -1089,7 +1089,7 @@ llvm::Type *ElemTy = CGF.ConvertTypeForMem(E->getType()->getPointeeType()); - Addr = CGF.Builder.CreateElementBitCast(Addr, ElemTy); + Addr = Addr.withElementType(ElemTy); if (CE->getCastKind() == CK_AddressSpaceConversion) Addr = CGF.Builder.CreateAddrSpaceCast(Addr, CGF.ConvertType(E->getType())); @@ -1829,7 +1829,7 @@ auto *VectorTy = llvm::FixedVectorType::get(ArrayTy->getElementType(), ArrayTy->getNumElements()); - return Address(CGF.Builder.CreateElementBitCast(Addr, VectorTy)); + return Addr.withElementType(VectorTy); } auto *VectorTy = dyn_cast(Addr.getElementType()); if (VectorTy && !IsVector) { @@ -1837,7 +1837,7 @@ VectorTy->getElementType(), cast(VectorTy)->getNumElements()); - return Address(CGF.Builder.CreateElementBitCast(Addr, ArrayTy)); + return Addr.withElementType(ArrayTy); } return Addr; @@ -2510,7 +2510,7 @@ Addr = CGF.CGM.getOpenMPRuntime().getAddrOfThreadPrivate(CGF, VD, Addr, Loc); - Addr = CGF.Builder.CreateElementBitCast(Addr, RealVarTy); + Addr = Addr.withElementType(RealVarTy); return CGF.MakeAddrLValue(Addr, T, AlignmentSource::Decl); } @@ -3628,7 +3628,7 @@ // If the array type was an incomplete type, we need to make sure // the decay ends up being the right type. llvm::Type *NewTy = ConvertType(E->getType()); - Addr = Builder.CreateElementBitCast(Addr, NewTy); + Addr = Addr.withElementType(NewTy); // Note that VLA pointers are always decayed, so we don't need to do // anything here. @@ -3647,7 +3647,7 @@ if (BaseInfo) *BaseInfo = LV.getBaseInfo(); if (TBAAInfo) *TBAAInfo = CGM.getTBAAAccessInfo(EltType); - return Builder.CreateElementBitCast(Addr, ConvertTypeForMem(EltType)); + return Addr.withElementType(ConvertTypeForMem(EltType)); } /// isSimpleArrayDecayOperand - If the specified expr is a simple decay from an @@ -3893,18 +3893,14 @@ // correctly, so we need to cast to i8*. FIXME: is this actually // true? A lot of other things in the fragile ABI would break... llvm::Type *OrigBaseElemTy = Addr.getElementType(); - Addr = Builder.CreateElementBitCast(Addr, Int8Ty); // Do the GEP. CharUnits EltAlign = getArrayElementAlign(Addr.getAlignment(), Idx, InterfaceSize); llvm::Value *EltPtr = - emitArraySubscriptGEP(*this, Addr.getElementType(), Addr.getPointer(), - ScaledIdx, false, SignedIndices, E->getExprLoc()); - Addr = Address(EltPtr, Addr.getElementType(), EltAlign); - - // Cast back. - Addr = Builder.CreateElementBitCast(Addr, OrigBaseElemTy); + emitArraySubscriptGEP(*this, Int8Ty, Addr.getPointer(), ScaledIdx, + false, SignedIndices, E->getExprLoc()); + Addr = Address(EltPtr, OrigBaseElemTy, EltAlign); } else if (const Expr *Array = isSimpleArrayDecayOperand(E->getBase())) { // If this is A[i] where A is an array, the frontend will have decayed the // base to be a ArrayToPointerDecay implicit cast. While correct, it is @@ -3982,7 +3978,7 @@ // If the array type was an incomplete type, we need to make sure // the decay ends up being the right type. llvm::Type *NewTy = CGF.ConvertType(BaseTy); - Addr = CGF.Builder.CreateElementBitCast(Addr, NewTy); + Addr = Addr.withElementType(NewTy); // Note that VLA pointers are always decayed, so we don't need to do // anything here. @@ -3992,8 +3988,7 @@ Addr = CGF.Builder.CreateConstArrayGEP(Addr, 0, "arraydecay"); } - return CGF.Builder.CreateElementBitCast(Addr, - CGF.ConvertTypeForMem(ElTy)); + return Addr.withElementType(CGF.ConvertTypeForMem(ElTy)); } LValueBaseInfo TypeBaseInfo; TBAAAccessInfo TypeTBAAInfo; @@ -4310,7 +4305,7 @@ CGF.getContext().getFieldOffset(Field)); if (Offset.isZero()) return Base; - Base = CGF.Builder.CreateElementBitCast(Base, CGF.Int8Ty); + Base = Base.withElementType(CGF.Int8Ty); return CGF.Builder.CreateConstInBoundsByteGEP(Base, Offset); } @@ -4398,8 +4393,7 @@ UseVolatile ? Info.VolatileStorageSize : Info.StorageSize; // Get the access type. llvm::Type *FieldIntTy = llvm::Type::getIntNTy(getLLVMContext(), SS); - if (Addr.getElementType() != FieldIntTy) - Addr = Builder.CreateElementBitCast(Addr, FieldIntTy); + Addr = Addr.withElementType(FieldIntTy); if (UseVolatile) { const unsigned VolatileOffset = Info.VolatileStorageOffset.getQuantity(); if (VolatileOffset) @@ -4830,7 +4824,7 @@ if (V.isValid()) { llvm::Type *T = ConvertTypeForMem(E->getType()); if (V.getElementType() != T) - LV.setAddress(Builder.CreateElementBitCast(V, T)); + LV.setAddress(V.withElementType(T)); } } return LV; @@ -4889,8 +4883,7 @@ CGM.EmitExplicitCastExprType(CE, this); LValue LV = EmitLValue(E->getSubExpr()); - Address V = Builder.CreateElementBitCast( - LV.getAddress(*this), + Address V = LV.getAddress(*this).withElementType( ConvertTypeForMem(CE->getTypeAsWritten()->getPointeeType())); if (SanOpts.has(SanitizerKind::CFIUnrelatedCast)) @@ -4914,8 +4907,7 @@ } case CK_ObjCObjectLValueCast: { LValue LV = EmitLValue(E->getSubExpr()); - Address V = Builder.CreateElementBitCast(LV.getAddress(*this), - ConvertType(E->getType())); + Address V = LV.getAddress(*this).withElementType(ConvertType(E->getType())); return MakeAddrLValue(V, E->getType(), LV.getBaseInfo(), CGM.getTBAAInfoForSubobject(LV, E->getType())); } @@ -5225,8 +5217,8 @@ } Address CodeGenFunction::EmitCXXUuidofExpr(const CXXUuidofExpr *E) { - return Builder.CreateElementBitCast(CGM.GetAddrOfMSGuidDecl(E->getGuidDecl()), - ConvertType(E->getType())); + return CGM.GetAddrOfMSGuidDecl(E->getGuidDecl()) + .withElementType(ConvertType(E->getType())); } LValue CodeGenFunction::EmitCXXUuidofLValue(const CXXUuidofExpr *E) { diff --git a/clang/lib/CodeGen/CGExprCXX.cpp b/clang/lib/CodeGen/CGExprCXX.cpp --- a/clang/lib/CodeGen/CGExprCXX.cpp +++ b/clang/lib/CodeGen/CGExprCXX.cpp @@ -502,7 +502,7 @@ if (Base->isEmpty()) return; - DestPtr = CGF.Builder.CreateElementBitCast(DestPtr, CGF.Int8Ty); + DestPtr = DestPtr.withElementType(CGF.Int8Ty); const ASTRecordLayout &Layout = CGF.getContext().getASTRecordLayout(Base); CharUnits NVSize = Layout.getNonVirtualSize(); @@ -1076,7 +1076,7 @@ if (const ConstantArrayType *CAT = dyn_cast_or_null( AllocType->getAsArrayTypeUnsafe())) { ElementTy = ConvertTypeForMem(AllocType); - CurPtr = Builder.CreateElementBitCast(CurPtr, ElementTy); + CurPtr = CurPtr.withElementType(ElementTy); InitListElements *= getContext().getConstantArrayElementCount(CAT); } @@ -1133,7 +1133,7 @@ } // Switch back to initializing one base element at a time. - CurPtr = Builder.CreateElementBitCast(CurPtr, BeginPtr.getElementType()); + CurPtr = CurPtr.withElementType(BeginPtr.getElementType()); } // If all elements have already been initialized, skip any further @@ -1715,7 +1715,7 @@ } llvm::Type *elementTy = ConvertTypeForMem(allocType); - Address result = Builder.CreateElementBitCast(allocation, elementTy); + Address result = allocation.withElementType(elementTy); // Passing pointer through launder.invariant.group to avoid propagation of // vptrs information which may be included in previous type. diff --git a/clang/lib/CodeGen/CGObjCRuntime.cpp b/clang/lib/CodeGen/CGObjCRuntime.cpp --- a/clang/lib/CodeGen/CGObjCRuntime.cpp +++ b/clang/lib/CodeGen/CGObjCRuntime.cpp @@ -107,10 +107,10 @@ CGF.CGM.getContext().toBits(StorageSize), CharUnits::fromQuantity(0))); - Address Addr = Address(V, CGF.Int8Ty, Alignment); - Addr = CGF.Builder.CreateElementBitCast(Addr, - llvm::Type::getIntNTy(CGF.getLLVMContext(), - Info->StorageSize)); + Address Addr = + Address(V, llvm::Type::getIntNTy(CGF.getLLVMContext(), Info->StorageSize), + Alignment); + return LValue::MakeBitfield(Addr, *Info, IvarTy, LValueBaseInfo(AlignmentSource::Decl), TBAAAccessInfo()); diff --git a/clang/lib/CodeGen/ItaniumCXXABI.cpp b/clang/lib/CodeGen/ItaniumCXXABI.cpp --- a/clang/lib/CodeGen/ItaniumCXXABI.cpp +++ b/clang/lib/CodeGen/ItaniumCXXABI.cpp @@ -809,12 +809,9 @@ CGBuilderTy &Builder = CGF.Builder; - // Cast to char*. - Base = Builder.CreateElementBitCast(Base, CGF.Int8Ty); - // Apply the offset, which we assume is non-null. - return Builder.CreateInBoundsGEP(Base.getElementType(), Base.getPointer(), - MemPtr, "memptr.offset"); + return Builder.CreateInBoundsGEP(CGF.Int8Ty, Base.getPointer(), MemPtr, + "memptr.offset"); } /// Perform a bitcast, derived-to-base, or base-to-derived member pointer @@ -2043,7 +2040,7 @@ if (!NonVirtualAdjustment && !VirtualAdjustment) return InitialPtr.getPointer(); - Address V = CGF.Builder.CreateElementBitCast(InitialPtr, CGF.Int8Ty); + Address V = InitialPtr.withElementType(CGF.Int8Ty); // In a base-to-derived cast, the non-virtual adjustment is applied first. if (NonVirtualAdjustment && !IsReturnAdjustment) { @@ -2054,7 +2051,7 @@ // Perform the virtual adjustment if we have one. llvm::Value *ResultPtr; if (VirtualAdjustment) { - Address VTablePtrPtr = CGF.Builder.CreateElementBitCast(V, CGF.Int8PtrTy); + Address VTablePtrPtr = V.withElementType(CGF.Int8PtrTy); llvm::Value *VTablePtr = CGF.Builder.CreateLoad(VTablePtrPtr); llvm::Value *Offset; @@ -2151,8 +2148,7 @@ CookiePtr = CGF.Builder.CreateConstInBoundsByteGEP(CookiePtr, CookieOffset); // Write the number of elements into the appropriate slot. - Address NumElementsPtr = - CGF.Builder.CreateElementBitCast(CookiePtr, CGF.SizeTy); + Address NumElementsPtr = CookiePtr.withElementType(CGF.SizeTy); llvm::Instruction *SI = CGF.Builder.CreateStore(NumElements, NumElementsPtr); // Handle the array cookie specially in ASan. @@ -2184,7 +2180,7 @@ CGF.Builder.CreateConstInBoundsByteGEP(numElementsPtr, numElementsOffset); unsigned AS = allocPtr.getAddressSpace(); - numElementsPtr = CGF.Builder.CreateElementBitCast(numElementsPtr, CGF.SizeTy); + numElementsPtr = numElementsPtr.withElementType(CGF.SizeTy); if (!CGM.getLangOpts().Sanitize.has(SanitizerKind::Address) || AS != 0) return CGF.Builder.CreateLoad(numElementsPtr); // In asan mode emit a function call instead of a regular load and let the @@ -2223,7 +2219,7 @@ Address cookie = newPtr; // The first element is the element size. - cookie = CGF.Builder.CreateElementBitCast(cookie, CGF.SizeTy); + cookie = cookie.withElementType(CGF.SizeTy); llvm::Value *elementSize = llvm::ConstantInt::get(CGF.SizeTy, getContext().getTypeSizeInChars(elementType).getQuantity()); CGF.Builder.CreateStore(elementSize, cookie); @@ -2246,7 +2242,7 @@ Address numElementsPtr = CGF.Builder.CreateConstInBoundsByteGEP(allocPtr, CGF.getSizeSize()); - numElementsPtr = CGF.Builder.CreateElementBitCast(numElementsPtr, CGF.SizeTy); + numElementsPtr = numElementsPtr.withElementType(CGF.SizeTy); return CGF.Builder.CreateLoad(numElementsPtr); } @@ -2415,7 +2411,7 @@ if (!threadsafe || MaxInlineWidthInBits) { // Load the first byte of the guard variable. llvm::LoadInst *LI = - Builder.CreateLoad(Builder.CreateElementBitCast(guardAddr, CGM.Int8Ty)); + Builder.CreateLoad(guardAddr.withElementType(CGM.Int8Ty)); // Itanium ABI: // An implementation supporting thread-safety on multiprocessor @@ -2496,7 +2492,7 @@ // variable before the object initialization begins so that references // to the variable during initialization don't restart initialization. Builder.CreateStore(llvm::ConstantInt::get(CGM.Int8Ty, 1), - Builder.CreateElementBitCast(guardAddr, CGM.Int8Ty)); + guardAddr.withElementType(CGM.Int8Ty)); } // Emit the initializer and add a global destructor if appropriate. @@ -2514,7 +2510,7 @@ // after the object initialization completes so that initialization is // retried if initialization is interrupted by an exception. Builder.CreateStore(llvm::ConstantInt::get(CGM.Int8Ty, 1), - Builder.CreateElementBitCast(guardAddr, CGM.Int8Ty)); + guardAddr.withElementType(CGM.Int8Ty)); } CGF.EmitBlock(EndBlock); diff --git a/clang/lib/CodeGen/Targets/CSKY.cpp b/clang/lib/CodeGen/Targets/CSKY.cpp --- a/clang/lib/CodeGen/Targets/CSKY.cpp +++ b/clang/lib/CodeGen/Targets/CSKY.cpp @@ -63,10 +63,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; + return Address(CGF.Builder.CreateLoad(VAListAddr), + CGF.ConvertTypeForMem(Ty), SlotSize); } auto TInfo = getContext().getTypeInfoInChars(Ty); diff --git a/clang/lib/CodeGen/Targets/RISCV.cpp b/clang/lib/CodeGen/Targets/RISCV.cpp --- a/clang/lib/CodeGen/Targets/RISCV.cpp +++ b/clang/lib/CodeGen/Targets/RISCV.cpp @@ -462,10 +462,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; + return Address(CGF.Builder.CreateLoad(VAListAddr), + CGF.ConvertTypeForMem(Ty), SlotSize); } auto TInfo = getContext().getTypeInfoInChars(Ty);