Skip to content

Commit f208644

Browse files
committed
[CGBuilder] Remove CreateBitCast() method
Use CreateElementBitCast() instead, or don't work on Address where not necessary.
1 parent 76032b0 commit f208644

File tree

14 files changed

+106
-125
lines changed

14 files changed

+106
-125
lines changed

clang/lib/CodeGen/CGBlocks.cpp

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1265,8 +1265,7 @@ Address CodeGenFunction::GetAddrOfBlockDecl(const VarDecl *variable) {
12651265
auto &byrefInfo = getBlockByrefInfo(variable);
12661266
addr = Address(Builder.CreateLoad(addr), byrefInfo.ByrefAlignment);
12671267

1268-
auto byrefPointerType = llvm::PointerType::get(byrefInfo.Type, 0);
1269-
addr = Builder.CreateBitCast(addr, byrefPointerType, "byref.addr");
1268+
addr = Builder.CreateElementBitCast(addr, byrefInfo.Type, "byref.addr");
12701269

12711270
addr = emitBlockByrefAddress(addr, byrefInfo, /*follow*/ true,
12721271
variable->getName());
@@ -1940,15 +1939,15 @@ CodeGenFunction::GenerateCopyHelperFunction(const CGBlockInfo &blockInfo) {
19401939
StartFunction(GlobalDecl(), ReturnTy, Fn, FI, args);
19411940
auto AL = ApplyDebugLocation::CreateArtificial(*this);
19421941

1943-
llvm::Type *structPtrTy = blockInfo.StructureType->getPointerTo();
1944-
19451942
Address src = GetAddrOfLocalVar(&SrcDecl);
19461943
src = Address(Builder.CreateLoad(src), blockInfo.BlockAlign);
1947-
src = Builder.CreateBitCast(src, structPtrTy, "block.source");
1944+
src = Builder.CreateElementBitCast(src, blockInfo.StructureType,
1945+
"block.source");
19481946

19491947
Address dst = GetAddrOfLocalVar(&DstDecl);
19501948
dst = Address(Builder.CreateLoad(dst), blockInfo.BlockAlign);
1951-
dst = Builder.CreateBitCast(dst, structPtrTy, "block.dest");
1949+
dst =
1950+
Builder.CreateElementBitCast(dst, blockInfo.StructureType, "block.dest");
19521951

19531952
for (auto &capture : blockInfo.SortedCaptures) {
19541953
if (capture.isConstantOrTrivial())
@@ -2130,11 +2129,9 @@ CodeGenFunction::GenerateDestroyHelperFunction(const CGBlockInfo &blockInfo) {
21302129

21312130
auto AL = ApplyDebugLocation::CreateArtificial(*this);
21322131

2133-
llvm::Type *structPtrTy = blockInfo.StructureType->getPointerTo();
2134-
21352132
Address src = GetAddrOfLocalVar(&SrcDecl);
21362133
src = Address(Builder.CreateLoad(src), blockInfo.BlockAlign);
2137-
src = Builder.CreateBitCast(src, structPtrTy, "block");
2134+
src = Builder.CreateElementBitCast(src, blockInfo.StructureType, "block");
21382135

21392136
CodeGenFunction::RunCleanupsScope cleanups(*this);
21402137

@@ -2171,9 +2168,9 @@ class ObjectByrefHelpers final : public BlockByrefHelpers {
21712168

21722169
void emitCopy(CodeGenFunction &CGF, Address destField,
21732170
Address srcField) override {
2174-
destField = CGF.Builder.CreateBitCast(destField, CGF.VoidPtrTy);
2171+
destField = CGF.Builder.CreateElementBitCast(destField, CGF.Int8Ty);
21752172

2176-
srcField = CGF.Builder.CreateBitCast(srcField, CGF.VoidPtrPtrTy);
2173+
srcField = CGF.Builder.CreateElementBitCast(srcField, CGF.Int8PtrTy);
21772174
llvm::Value *srcValue = CGF.Builder.CreateLoad(srcField);
21782175

21792176
unsigned flags = (Flags | BLOCK_BYREF_CALLER).getBitMask();
@@ -2186,7 +2183,7 @@ class ObjectByrefHelpers final : public BlockByrefHelpers {
21862183
}
21872184

21882185
void emitDispose(CodeGenFunction &CGF, Address field) override {
2189-
field = CGF.Builder.CreateBitCast(field, CGF.Int8PtrTy->getPointerTo(0));
2186+
field = CGF.Builder.CreateElementBitCast(field, CGF.Int8PtrTy);
21902187
llvm::Value *value = CGF.Builder.CreateLoad(field);
21912188

21922189
CGF.BuildBlockRelease(value, Flags | BLOCK_BYREF_CALLER, false);
@@ -2376,21 +2373,19 @@ generateByrefCopyHelper(CodeGenFunction &CGF, const BlockByrefInfo &byrefInfo,
23762373
auto AL = ApplyDebugLocation::CreateArtificial(CGF);
23772374

23782375
if (generator.needsCopy()) {
2379-
llvm::Type *byrefPtrType = byrefInfo.Type->getPointerTo(0);
2380-
23812376
// dst->x
23822377
Address destField = CGF.GetAddrOfLocalVar(&Dst);
23832378
destField = Address(CGF.Builder.CreateLoad(destField),
23842379
byrefInfo.ByrefAlignment);
2385-
destField = CGF.Builder.CreateBitCast(destField, byrefPtrType);
2380+
destField = CGF.Builder.CreateElementBitCast(destField, byrefInfo.Type);
23862381
destField = CGF.emitBlockByrefAddress(destField, byrefInfo, false,
23872382
"dest-object");
23882383

23892384
// src->x
23902385
Address srcField = CGF.GetAddrOfLocalVar(&Src);
23912386
srcField = Address(CGF.Builder.CreateLoad(srcField),
23922387
byrefInfo.ByrefAlignment);
2393-
srcField = CGF.Builder.CreateBitCast(srcField, byrefPtrType);
2388+
srcField = CGF.Builder.CreateElementBitCast(srcField, byrefInfo.Type);
23942389
srcField = CGF.emitBlockByrefAddress(srcField, byrefInfo, false,
23952390
"src-object");
23962391

@@ -2447,8 +2442,7 @@ generateByrefDisposeHelper(CodeGenFunction &CGF,
24472442
if (generator.needsDispose()) {
24482443
Address addr = CGF.GetAddrOfLocalVar(&Src);
24492444
addr = Address(CGF.Builder.CreateLoad(addr), byrefInfo.ByrefAlignment);
2450-
auto byrefPtrType = byrefInfo.Type->getPointerTo(0);
2451-
addr = CGF.Builder.CreateBitCast(addr, byrefPtrType);
2445+
addr = CGF.Builder.CreateElementBitCast(addr, byrefInfo.Type);
24522446
addr = CGF.emitBlockByrefAddress(addr, byrefInfo, false, "object");
24532447

24542448
generator.emitDispose(CGF, addr);

clang/lib/CodeGen/CGBuilder.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -151,13 +151,6 @@ class CGBuilderTy : public CGBuilderBaseTy {
151151
Ordering, SSID);
152152
}
153153

154-
using CGBuilderBaseTy::CreateBitCast;
155-
Address CreateBitCast(Address Addr, llvm::Type *Ty,
156-
const llvm::Twine &Name = "") {
157-
return Address(CreateBitCast(Addr.getPointer(), Ty, Name),
158-
Addr.getAlignment());
159-
}
160-
161154
using CGBuilderBaseTy::CreateAddrSpaceCast;
162155
Address CreateAddrSpaceCast(Address Addr, llvm::Type *Ty,
163156
const llvm::Twine &Name = "") {

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1800,8 +1800,8 @@ llvm::Function *CodeGenFunction::generateBuiltinOSLogHelperFunction(
18001800

18011801
Address Arg = GetAddrOfLocalVar(Args[I]);
18021802
Address Addr = Builder.CreateConstByteGEP(BufAddr, Offset, "argData");
1803-
Addr = Builder.CreateBitCast(Addr, Arg.getPointer()->getType(),
1804-
"argDataCast");
1803+
Addr =
1804+
Builder.CreateElementBitCast(Addr, Arg.getElementType(), "argDataCast");
18051805
Builder.CreateStore(Builder.CreateLoad(Arg), Addr);
18061806
Offset += Size;
18071807
++I;
@@ -3838,7 +3838,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
38383838

38393839
// Call LLVM's EH setjmp, which is lightweight.
38403840
Function *F = CGM.getIntrinsic(Intrinsic::eh_sjlj_setjmp);
3841-
Buf = Builder.CreateBitCast(Buf, Int8PtrTy);
3841+
Buf = Builder.CreateElementBitCast(Buf, Int8Ty);
38423842
return RValue::get(Builder.CreateCall(F, Buf.getPointer()));
38433843
}
38443844
case Builtin::BI__builtin_longjmp: {
@@ -4149,8 +4149,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
41494149
PtrTy->castAs<PointerType>()->getPointeeType().isVolatileQualified();
41504150

41514151
Address Ptr = EmitPointerWithAlignment(E->getArg(0));
4152-
unsigned AddrSpace = Ptr.getPointer()->getType()->getPointerAddressSpace();
4153-
Ptr = Builder.CreateBitCast(Ptr, Int8Ty->getPointerTo(AddrSpace));
4152+
Ptr = Builder.CreateElementBitCast(Ptr, Int8Ty);
41544153
Value *NewVal = Builder.getInt8(0);
41554154
Value *Order = EmitScalarExpr(E->getArg(1));
41564155
if (isa<llvm::ConstantInt>(Order)) {
@@ -6919,8 +6918,7 @@ Value *CodeGenFunction::EmitCommonNeonBuiltinExpr(
69196918
case NEON::BI__builtin_neon_vld1_dup_v:
69206919
case NEON::BI__builtin_neon_vld1q_dup_v: {
69216920
Value *V = UndefValue::get(Ty);
6922-
Ty = llvm::PointerType::getUnqual(VTy->getElementType());
6923-
PtrOp0 = Builder.CreateBitCast(PtrOp0, Ty);
6921+
PtrOp0 = Builder.CreateElementBitCast(PtrOp0, VTy->getElementType());
69246922
LoadInst *Ld = Builder.CreateLoad(PtrOp0);
69256923
llvm::Constant *CI = ConstantInt::get(SizeTy, 0);
69266924
Ops[0] = Builder.CreateInsertElement(V, Ld, CI);
@@ -7728,7 +7726,7 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
77287726
Value *Val = EmitScalarExpr(E->getArg(0));
77297727
Builder.CreateStore(Val, Tmp);
77307728

7731-
Address LdPtr = Builder.CreateBitCast(Tmp,llvm::PointerType::getUnqual(STy));
7729+
Address LdPtr = Builder.CreateElementBitCast(Tmp, STy);
77327730
Val = Builder.CreateLoad(LdPtr);
77337731

77347732
Value *Arg0 = Builder.CreateExtractValue(Val, 0);
@@ -8149,8 +8147,8 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
81498147
case NEON::BI__builtin_neon_vst1_lane_v: {
81508148
Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
81518149
Ops[1] = Builder.CreateExtractElement(Ops[1], Ops[2]);
8152-
Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
8153-
auto St = Builder.CreateStore(Ops[1], Builder.CreateBitCast(PtrOp0, Ty));
8150+
auto St = Builder.CreateStore(
8151+
Ops[1], Builder.CreateElementBitCast(PtrOp0, Ops[1]->getType()));
81548152
return St;
81558153
}
81568154
case NEON::BI__builtin_neon_vtbl1_v:
@@ -9711,7 +9709,7 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID,
97119709
Address Tmp = CreateMemTemp(E->getArg(0)->getType());
97129710
EmitAnyExprToMem(E->getArg(0), Tmp, Qualifiers(), /*init*/ true);
97139711

9714-
Tmp = Builder.CreateBitCast(Tmp, llvm::PointerType::getUnqual(STy));
9712+
Tmp = Builder.CreateElementBitCast(Tmp, STy);
97159713
llvm::Value *Val = Builder.CreateLoad(Tmp);
97169714

97179715
Value *Arg0 = Builder.CreateExtractValue(Val, 0);

clang/lib/CodeGen/CGCall.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4839,13 +4839,10 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
48394839
// Store the RValue into the argument struct.
48404840
Address Addr =
48414841
Builder.CreateStructGEP(ArgMemory, ArgInfo.getInAllocaFieldIndex());
4842-
unsigned AS = Addr.getType()->getPointerAddressSpace();
4843-
llvm::Type *MemType = ConvertTypeForMem(I->Ty)->getPointerTo(AS);
48444842
// There are some cases where a trivial bitcast is not avoidable. The
48454843
// definition of a type later in a translation unit may change it's type
48464844
// from {}* to (%struct.foo*)*.
4847-
if (Addr.getType() != MemType)
4848-
Addr = Builder.CreateBitCast(Addr, MemType);
4845+
Addr = Builder.CreateElementBitCast(Addr, ConvertTypeForMem(I->Ty));
48494846
I->copyInto(*this, Addr);
48504847
}
48514848
break;

clang/lib/CodeGen/CGClass.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2332,8 +2332,8 @@ CodeGenFunction::EmitSynthesizedCXXCopyCtorCall(const CXXConstructorDecl *D,
23322332
// Push the src ptr.
23332333
QualType QT = *(FPT->param_type_begin());
23342334
llvm::Type *t = CGM.getTypes().ConvertType(QT);
2335-
Src = Builder.CreateBitCast(Src, t);
2336-
Args.add(RValue::get(Src.getPointer()), QT);
2335+
llvm::Value *SrcVal = Builder.CreateBitCast(Src.getPointer(), t);
2336+
Args.add(RValue::get(SrcVal), QT);
23372337

23382338
// Skip over first argument (Src).
23392339
EmitCallArgs(Args, FPT, drop_begin(E->arguments(), 1), E->getConstructor(),

clang/lib/CodeGen/CGDecl.cpp

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1155,11 +1155,7 @@ static Address createUnnamedGlobalForMemcpyFrom(CodeGenModule &CGM,
11551155
llvm::Constant *Constant,
11561156
CharUnits Align) {
11571157
Address SrcPtr = CGM.createUnnamedGlobalFrom(D, Constant, Align);
1158-
llvm::Type *BP = llvm::PointerType::getInt8PtrTy(CGM.getLLVMContext(),
1159-
SrcPtr.getAddressSpace());
1160-
if (SrcPtr.getType() != BP)
1161-
SrcPtr = Builder.CreateBitCast(SrcPtr, BP);
1162-
return SrcPtr;
1158+
return Builder.CreateElementBitCast(SrcPtr, CGM.Int8Ty);
11631159
}
11641160

11651161
static void emitStoresForConstant(CodeGenModule &CGM, const VarDecl &D,
@@ -1908,10 +1904,9 @@ void CodeGenFunction::EmitAutoVarInit(const AutoVarEmission &emission) {
19081904
return EmitStoreThroughLValue(RValue::get(constant), lv, true);
19091905
}
19101906

1911-
llvm::Type *BP = CGM.Int8Ty->getPointerTo(Loc.getAddressSpace());
1912-
emitStoresForConstant(
1913-
CGM, D, (Loc.getType() == BP) ? Loc : Builder.CreateBitCast(Loc, BP),
1914-
type.isVolatileQualified(), Builder, constant, /*IsAutoInit=*/false);
1907+
emitStoresForConstant(CGM, D, Builder.CreateElementBitCast(Loc, CGM.Int8Ty),
1908+
type.isVolatileQualified(), Builder, constant,
1909+
/*IsAutoInit=*/false);
19151910
}
19161911

19171912
/// Emit an expression as an initializer for an object (variable, field, etc.)
@@ -2462,12 +2457,10 @@ void CodeGenFunction::EmitParmDecl(const VarDecl &D, ParamValue Arg,
24622457
bool IsScalar = hasScalarEvaluationKind(Ty);
24632458
// If we already have a pointer to the argument, reuse the input pointer.
24642459
if (Arg.isIndirect()) {
2465-
DeclPtr = Arg.getIndirectAddress();
24662460
// If we have a prettier pointer type at this point, bitcast to that.
2467-
unsigned AS = DeclPtr.getType()->getAddressSpace();
2468-
llvm::Type *IRTy = ConvertTypeForMem(Ty)->getPointerTo(AS);
2469-
if (DeclPtr.getType() != IRTy)
2470-
DeclPtr = Builder.CreateBitCast(DeclPtr, IRTy, D.getName());
2461+
DeclPtr = Arg.getIndirectAddress();
2462+
DeclPtr = Builder.CreateElementBitCast(DeclPtr, ConvertTypeForMem(Ty),
2463+
D.getName());
24712464
// Indirect argument is in alloca address space, which may be different
24722465
// from the default address space.
24732466
auto AllocaAS = CGM.getASTAllocaAddressSpace();

clang/lib/CodeGen/CGExpr.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3814,7 +3814,7 @@ LValue CodeGenFunction::EmitArraySubscriptExpr(const ArraySubscriptExpr *E,
38143814
// interfaces, so we can't rely on GEP to do this scaling
38153815
// correctly, so we need to cast to i8*. FIXME: is this actually
38163816
// true? A lot of other things in the fragile ABI would break...
3817-
llvm::Type *OrigBaseTy = Addr.getType();
3817+
llvm::Type *OrigBaseElemTy = Addr.getElementType();
38183818
Addr = Builder.CreateElementBitCast(Addr, Int8Ty);
38193819

38203820
// Do the GEP.
@@ -3826,7 +3826,7 @@ LValue CodeGenFunction::EmitArraySubscriptExpr(const ArraySubscriptExpr *E,
38263826
Addr = Address(EltPtr, Addr.getElementType(), EltAlign);
38273827

38283828
// Cast back.
3829-
Addr = Builder.CreateBitCast(Addr, OrigBaseTy);
3829+
Addr = Builder.CreateElementBitCast(Addr, OrigBaseElemTy);
38303830
} else if (const Expr *Array = isSimpleArrayDecayOperand(E->getBase())) {
38313831
// If this is A[i] where A is an array, the frontend will have decayed the
38323832
// base to be a ArrayToPointerDecay implicit cast. While correct, it is

clang/lib/CodeGen/CGExprCXX.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1736,13 +1736,14 @@ llvm::Value *CodeGenFunction::EmitCXXNewExpr(const CXXNewExpr *E) {
17361736

17371737
EmitNewInitializer(*this, E, allocType, elementTy, result, numElements,
17381738
allocSizeWithoutCookie);
1739+
llvm::Value *resultPtr = result.getPointer();
17391740
if (E->isArray()) {
17401741
// NewPtr is a pointer to the base element type. If we're
17411742
// allocating an array of arrays, we'll need to cast back to the
17421743
// array pointer type.
17431744
llvm::Type *resultType = ConvertTypeForMem(E->getType());
1744-
if (result.getType() != resultType)
1745-
result = Builder.CreateBitCast(result, resultType);
1745+
if (resultPtr->getType() != resultType)
1746+
resultPtr = Builder.CreateBitCast(resultPtr, resultType);
17461747
}
17471748

17481749
// Deactivate the 'operator delete' cleanup if we finished
@@ -1752,7 +1753,6 @@ llvm::Value *CodeGenFunction::EmitCXXNewExpr(const CXXNewExpr *E) {
17521753
cleanupDominator->eraseFromParent();
17531754
}
17541755

1755-
llvm::Value *resultPtr = result.getPointer();
17561756
if (nullCheck) {
17571757
conditional.end(*this);
17581758

clang/lib/CodeGen/CGObjC.cpp

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,9 @@ CodeGenFunction::EmitObjCBoxedExpr(const ObjCBoxedExpr *E) {
9292
// and cast value to correct type
9393
Address Temporary = CreateMemTemp(SubExpr->getType());
9494
EmitAnyExprToMem(SubExpr, Temporary, Qualifiers(), /*isInit*/ true);
95-
Address BitCast = Builder.CreateBitCast(Temporary, ConvertType(ArgQT));
96-
Args.add(RValue::get(BitCast.getPointer()), ArgQT);
95+
llvm::Value *BitCast =
96+
Builder.CreateBitCast(Temporary.getPointer(), ConvertType(ArgQT));
97+
Args.add(RValue::get(BitCast), ArgQT);
9798

9899
// Create char array to store type encoding
99100
std::string Str;
@@ -816,19 +817,20 @@ static void emitStructGetterCall(CodeGenFunction &CGF, ObjCIvarDecl *ivar,
816817
bool isAtomic, bool hasStrong) {
817818
ASTContext &Context = CGF.getContext();
818819

819-
Address src =
820+
llvm::Value *src =
820821
CGF.EmitLValueForIvar(CGF.TypeOfSelfObject(), CGF.LoadObjCSelf(), ivar, 0)
821-
.getAddress(CGF);
822+
.getPointer(CGF);
822823

823824
// objc_copyStruct (ReturnValue, &structIvar,
824825
// sizeof (Type of Ivar), isAtomic, false);
825826
CallArgList args;
826827

827-
Address dest = CGF.Builder.CreateBitCast(CGF.ReturnValue, CGF.VoidPtrTy);
828-
args.add(RValue::get(dest.getPointer()), Context.VoidPtrTy);
828+
llvm::Value *dest =
829+
CGF.Builder.CreateBitCast(CGF.ReturnValue.getPointer(), CGF.VoidPtrTy);
830+
args.add(RValue::get(dest), Context.VoidPtrTy);
829831

830832
src = CGF.Builder.CreateBitCast(src, CGF.VoidPtrTy);
831-
args.add(RValue::get(src.getPointer()), Context.VoidPtrTy);
833+
args.add(RValue::get(src), Context.VoidPtrTy);
832834

833835
CharUnits size = CGF.getContext().getTypeSizeInChars(ivar->getType());
834836
args.add(RValue::get(CGF.CGM.getSize(size)), Context.getSizeType());
@@ -1149,11 +1151,10 @@ CodeGenFunction::generateObjCGetterBody(const ObjCImplementationDecl *classImpl,
11491151
// types, so there's no point in trying to pick a prettier type.
11501152
uint64_t ivarSize = getContext().toBits(strategy.getIvarSize());
11511153
llvm::Type *bitcastType = llvm::Type::getIntNTy(getLLVMContext(), ivarSize);
1152-
bitcastType = bitcastType->getPointerTo(); // addrspace 0 okay
11531154

11541155
// Perform an atomic load. This does not impose ordering constraints.
11551156
Address ivarAddr = LV.getAddress(*this);
1156-
ivarAddr = Builder.CreateBitCast(ivarAddr, bitcastType);
1157+
ivarAddr = Builder.CreateElementBitCast(ivarAddr, bitcastType);
11571158
llvm::LoadInst *load = Builder.CreateLoad(ivarAddr, "load");
11581159
load->setAtomic(llvm::AtomicOrdering::Unordered);
11591160

@@ -1164,12 +1165,11 @@ CodeGenFunction::generateObjCGetterBody(const ObjCImplementationDecl *classImpl,
11641165
uint64_t retTySize = CGM.getDataLayout().getTypeSizeInBits(retTy);
11651166
llvm::Value *ivarVal = load;
11661167
if (ivarSize > retTySize) {
1167-
llvm::Type *newTy = llvm::Type::getIntNTy(getLLVMContext(), retTySize);
1168-
ivarVal = Builder.CreateTrunc(load, newTy);
1169-
bitcastType = newTy->getPointerTo();
1168+
bitcastType = llvm::Type::getIntNTy(getLLVMContext(), retTySize);
1169+
ivarVal = Builder.CreateTrunc(load, bitcastType);
11701170
}
11711171
Builder.CreateStore(ivarVal,
1172-
Builder.CreateBitCast(ReturnValue, bitcastType));
1172+
Builder.CreateElementBitCast(ReturnValue, bitcastType));
11731173

11741174
// Make sure we don't do an autorelease.
11751175
AutoreleaseResult = false;
@@ -2156,7 +2156,7 @@ static llvm::Value *emitARCLoadOperation(CodeGenFunction &CGF, Address addr,
21562156

21572157
// Cast the argument to 'id*'.
21582158
llvm::Type *origType = addr.getElementType();
2159-
addr = CGF.Builder.CreateBitCast(addr, CGF.Int8PtrPtrTy);
2159+
addr = CGF.Builder.CreateElementBitCast(addr, CGF.Int8PtrTy);
21602160

21612161
// Call the function.
21622162
llvm::Value *result = CGF.EmitNounwindRuntimeCall(fn, addr.getPointer());
@@ -2610,7 +2610,7 @@ void CodeGenFunction::EmitARCDestroyWeak(Address addr) {
26102610
fn = getARCIntrinsic(llvm::Intrinsic::objc_destroyWeak, CGM);
26112611

26122612
// Cast the argument to 'id*'.
2613-
addr = Builder.CreateBitCast(addr, Int8PtrPtrTy);
2613+
addr = Builder.CreateElementBitCast(addr, Int8PtrTy);
26142614

26152615
EmitNounwindRuntimeCall(fn, addr.getPointer());
26162616
}

clang/lib/CodeGen/CGObjCGNU.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -318,8 +318,9 @@ class CGObjCGNU : public CGObjCRuntime {
318318
return B.CreateBitCast(V, Ty);
319319
}
320320
Address EnforceType(CGBuilderTy &B, Address V, llvm::Type *Ty) {
321-
if (V.getType() == Ty) return V;
322-
return B.CreateBitCast(V, Ty);
321+
if (V.getType() == Ty)
322+
return V;
323+
return B.CreateElementBitCast(V, Ty->getPointerElementType());
323324
}
324325

325326
// Some zeros used for GEPs in lots of places.

0 commit comments

Comments
 (0)