Skip to content

Commit 2bdc864

Browse files
committed
[clang][CodeGen] Drop some typed pointer bitcasts
Differential Revision: https://reviews.llvm.org/D156911
1 parent deec9e7 commit 2bdc864

File tree

7 files changed

+70
-205
lines changed

7 files changed

+70
-205
lines changed

clang/lib/CodeGen/CGBlocks.cpp

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -942,7 +942,7 @@ llvm::Value *CodeGenFunction::EmitBlockLiteral(const CGBlockInfo &blockInfo) {
942942
if (CI.isNested())
943943
byrefPointer = Builder.CreateLoad(src, "byref.capture");
944944
else
945-
byrefPointer = Builder.CreateBitCast(src.getPointer(), VoidPtrTy);
945+
byrefPointer = src.getPointer();
946946

947947
// Write that void* into the capture field.
948948
Builder.CreateStore(byrefPointer, blockField);
@@ -1667,7 +1667,6 @@ struct CallBlockRelease final : EHScopeStack::Cleanup {
16671667
llvm::Value *BlockVarAddr;
16681668
if (LoadBlockVarAddr) {
16691669
BlockVarAddr = CGF.Builder.CreateLoad(Addr);
1670-
BlockVarAddr = CGF.Builder.CreateBitCast(BlockVarAddr, CGF.VoidPtrTy);
16711670
} else {
16721671
BlockVarAddr = Addr.getPointer();
16731672
}
@@ -1975,9 +1974,7 @@ CodeGenFunction::GenerateCopyHelperFunction(const CGBlockInfo &blockInfo) {
19751974
}
19761975
case BlockCaptureEntityKind::BlockObject: {
19771976
llvm::Value *srcValue = Builder.CreateLoad(srcField, "blockcopy.src");
1978-
srcValue = Builder.CreateBitCast(srcValue, VoidPtrTy);
1979-
llvm::Value *dstAddr =
1980-
Builder.CreateBitCast(dstField.getPointer(), VoidPtrTy);
1977+
llvm::Value *dstAddr = dstField.getPointer();
19811978
llvm::Value *args[] = {
19821979
dstAddr, srcValue, llvm::ConstantInt::get(Int32Ty, flags.getBitMask())
19831980
};
@@ -2774,10 +2771,8 @@ void CodeGenFunction::emitByrefStructureInit(const AutoVarEmission &emission) {
27742771
void CodeGenFunction::BuildBlockRelease(llvm::Value *V, BlockFieldFlags flags,
27752772
bool CanThrow) {
27762773
llvm::FunctionCallee F = CGM.getBlockObjectDispose();
2777-
llvm::Value *args[] = {
2778-
Builder.CreateBitCast(V, Int8PtrTy),
2779-
llvm::ConstantInt::get(Int32Ty, flags.getBitMask())
2780-
};
2774+
llvm::Value *args[] = {V,
2775+
llvm::ConstantInt::get(Int32Ty, flags.getBitMask())};
27812776

27822777
if (CanThrow)
27832778
EmitRuntimeCallOrInvoke(F, args);

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 34 additions & 123 deletions
Large diffs are not rendered by default.

clang/lib/CodeGen/CGClass.cpp

Lines changed: 11 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -403,11 +403,8 @@ CodeGenFunction::GetAddressOfDerivedClass(Address BaseAddr,
403403
assert(PathBegin != PathEnd && "Base path should not be empty!");
404404

405405
QualType DerivedTy =
406-
getContext().getCanonicalType(getContext().getTagDeclType(Derived));
407-
unsigned AddrSpace = BaseAddr.getAddressSpace();
406+
getContext().getCanonicalType(getContext().getTagDeclType(Derived));
408407
llvm::Type *DerivedValueTy = ConvertType(DerivedTy);
409-
llvm::Type *DerivedPtrTy =
410-
llvm::PointerType::get(getLLVMContext(), AddrSpace);
411408

412409
llvm::Value *NonVirtualOffset =
413410
CGM.GetNonVirtualBaseClassOffset(Derived, PathBegin, PathEnd);
@@ -432,13 +429,10 @@ CodeGenFunction::GetAddressOfDerivedClass(Address BaseAddr,
432429
}
433430

434431
// Apply the offset.
435-
llvm::Value *Value = Builder.CreateBitCast(BaseAddr.getPointer(), Int8PtrTy);
432+
llvm::Value *Value = BaseAddr.getPointer();
436433
Value = Builder.CreateInBoundsGEP(
437434
Int8Ty, Value, Builder.CreateNeg(NonVirtualOffset), "sub.ptr");
438435

439-
// Just cast.
440-
Value = Builder.CreateBitCast(Value, DerivedPtrTy);
441-
442436
// Produce a PHI if we had a null-check.
443437
if (NullCheckValue) {
444438
Builder.CreateBr(CastEnd);
@@ -1676,8 +1670,7 @@ namespace {
16761670
CodeGenFunction::SanitizerScope SanScope(&CGF);
16771671
// Pass in void pointer and size of region as arguments to runtime
16781672
// function
1679-
SmallVector<llvm::Value *, 2> Args = {
1680-
CGF.Builder.CreateBitCast(Ptr, CGF.VoidPtrTy)};
1673+
SmallVector<llvm::Value *, 2> Args = {Ptr};
16811674
SmallVector<llvm::Type *, 2> ArgTypes = {CGF.VoidPtrTy};
16821675

16831676
if (PoisonSize.has_value()) {
@@ -1756,10 +1749,8 @@ namespace {
17561749
llvm::ConstantInt *OffsetSizePtr =
17571750
llvm::ConstantInt::get(CGF.SizeTy, PoisonStart.getQuantity());
17581751

1759-
llvm::Value *OffsetPtr = CGF.Builder.CreateGEP(
1760-
CGF.Int8Ty,
1761-
CGF.Builder.CreateBitCast(CGF.LoadCXXThis(), CGF.Int8PtrTy),
1762-
OffsetSizePtr);
1752+
llvm::Value *OffsetPtr =
1753+
CGF.Builder.CreateGEP(CGF.Int8Ty, CGF.LoadCXXThis(), OffsetSizePtr);
17631754

17641755
CharUnits PoisonEnd;
17651756
if (EndIndex >= Layout.getFieldCount()) {
@@ -2736,7 +2727,6 @@ void CodeGenFunction::EmitTypeMetadataCodeForVCall(const CXXRecordDecl *RD,
27362727
llvm::Value *TypeId =
27372728
llvm::MetadataAsValue::get(CGM.getLLVMContext(), MD);
27382729

2739-
llvm::Value *CastedVTable = Builder.CreateBitCast(VTable, Int8PtrTy);
27402730
// If we already know that the call has hidden LTO visibility, emit
27412731
// @llvm.type.test(). Otherwise emit @llvm.public.type.test(), which WPD
27422732
// will convert to @llvm.type.test() if we assert at link time that we have
@@ -2745,7 +2735,7 @@ void CodeGenFunction::EmitTypeMetadataCodeForVCall(const CXXRecordDecl *RD,
27452735
? llvm::Intrinsic::type_test
27462736
: llvm::Intrinsic::public_type_test;
27472737
llvm::Value *TypeTest =
2748-
Builder.CreateCall(CGM.getIntrinsic(IID), {CastedVTable, TypeId});
2738+
Builder.CreateCall(CGM.getIntrinsic(IID), {VTable, TypeId});
27492739
Builder.CreateCall(CGM.getIntrinsic(llvm::Intrinsic::assume), TypeTest);
27502740
}
27512741
}
@@ -2849,9 +2839,8 @@ void CodeGenFunction::EmitVTablePtrCheck(const CXXRecordDecl *RD,
28492839
CGM.CreateMetadataIdentifierForType(QualType(RD->getTypeForDecl(), 0));
28502840
llvm::Value *TypeId = llvm::MetadataAsValue::get(getLLVMContext(), MD);
28512841

2852-
llvm::Value *CastedVTable = Builder.CreateBitCast(VTable, Int8PtrTy);
28532842
llvm::Value *TypeTest = Builder.CreateCall(
2854-
CGM.getIntrinsic(llvm::Intrinsic::type_test), {CastedVTable, TypeId});
2843+
CGM.getIntrinsic(llvm::Intrinsic::type_test), {VTable, TypeId});
28552844

28562845
llvm::Constant *StaticData[] = {
28572846
llvm::ConstantInt::get(Int8Ty, TCK),
@@ -2861,7 +2850,7 @@ void CodeGenFunction::EmitVTablePtrCheck(const CXXRecordDecl *RD,
28612850

28622851
auto CrossDsoTypeId = CGM.CreateCrossDsoCfiTypeId(MD);
28632852
if (CGM.getCodeGenOpts().SanitizeCfiCrossDso && CrossDsoTypeId) {
2864-
EmitCfiSlowPathCheck(M, TypeTest, CrossDsoTypeId, CastedVTable, StaticData);
2853+
EmitCfiSlowPathCheck(M, TypeTest, CrossDsoTypeId, VTable, StaticData);
28652854
return;
28662855
}
28672856

@@ -2874,9 +2863,9 @@ void CodeGenFunction::EmitVTablePtrCheck(const CXXRecordDecl *RD,
28742863
CGM.getLLVMContext(),
28752864
llvm::MDString::get(CGM.getLLVMContext(), "all-vtables"));
28762865
llvm::Value *ValidVtable = Builder.CreateCall(
2877-
CGM.getIntrinsic(llvm::Intrinsic::type_test), {CastedVTable, AllVtables});
2866+
CGM.getIntrinsic(llvm::Intrinsic::type_test), {VTable, AllVtables});
28782867
EmitCheck(std::make_pair(TypeTest, M), SanitizerHandler::CFICheckFail,
2879-
StaticData, {CastedVTable, ValidVtable});
2868+
StaticData, {VTable, ValidVtable});
28802869
}
28812870

28822871
bool CodeGenFunction::ShouldEmitVTableTypeCheckedLoad(const CXXRecordDecl *RD) {
@@ -2907,11 +2896,9 @@ llvm::Value *CodeGenFunction::EmitVTableTypeCheckedLoad(
29072896
CGM.CreateMetadataIdentifierForType(QualType(RD->getTypeForDecl(), 0));
29082897
llvm::Value *TypeId = llvm::MetadataAsValue::get(CGM.getLLVMContext(), MD);
29092898

2910-
llvm::Value *CastedVTable = Builder.CreateBitCast(VTable, Int8PtrTy);
29112899
llvm::Value *CheckedLoad = Builder.CreateCall(
29122900
CGM.getIntrinsic(llvm::Intrinsic::type_checked_load),
2913-
{CastedVTable, llvm::ConstantInt::get(Int32Ty, VTableByteOffset),
2914-
TypeId});
2901+
{VTable, llvm::ConstantInt::get(Int32Ty, VTableByteOffset), TypeId});
29152902
llvm::Value *CheckResult = Builder.CreateExtractValue(CheckedLoad, 1);
29162903

29172904
std::string TypeName = RD->getQualifiedNameAsString();

clang/lib/CodeGen/CGExpr.cpp

Lines changed: 11 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -140,9 +140,8 @@ Address CodeGenFunction::CreateMemTemp(QualType Ty, CharUnits Align,
140140
auto *VectorTy = llvm::FixedVectorType::get(ArrayTy->getElementType(),
141141
ArrayTy->getNumElements());
142142

143-
Result = Address(
144-
Builder.CreateBitCast(Result.getPointer(), VectorTy->getPointerTo()),
145-
VectorTy, Result.getAlignment(), KnownNonNull);
143+
Result = Address(Result.getPointer(), VectorTy, Result.getAlignment(),
144+
KnownNonNull);
146145
}
147146
return Result;
148147
}
@@ -746,9 +745,8 @@ void CodeGenFunction::EmitTypeCheck(TypeCheckKind TCK, SourceLocation Loc,
746745
llvm::Value *Min = Builder.getFalse();
747746
llvm::Value *NullIsUnknown = Builder.getFalse();
748747
llvm::Value *Dynamic = Builder.getFalse();
749-
llvm::Value *CastAddr = Builder.CreateBitCast(Ptr, Int8PtrTy);
750748
llvm::Value *LargeEnough = Builder.CreateICmpUGE(
751-
Builder.CreateCall(F, {CastAddr, Min, NullIsUnknown, Dynamic}), Size);
749+
Builder.CreateCall(F, {Ptr, Min, NullIsUnknown, Dynamic}), Size);
752750
Checks.push_back(std::make_pair(LargeEnough, SanitizerKind::ObjectSize));
753751
}
754752
}
@@ -825,9 +823,7 @@ void CodeGenFunction::EmitTypeCheck(TypeCheckKind TCK, SourceLocation Loc,
825823

826824
// Load the vptr, and compute hash_16_bytes(TypeHash, vptr).
827825
llvm::Value *Low = llvm::ConstantInt::get(Int64Ty, TypeHash);
828-
llvm::Type *VPtrTy = llvm::PointerType::get(IntPtrTy, 0);
829-
Address VPtrAddr(Builder.CreateBitCast(Ptr, VPtrTy), IntPtrTy,
830-
getPointerAlign());
826+
Address VPtrAddr(Ptr, IntPtrTy, getPointerAlign());
831827
llvm::Value *VPtrVal = Builder.CreateLoad(VPtrAddr);
832828
llvm::Value *High = Builder.CreateZExt(VPtrVal, Int64Ty);
833829

@@ -2492,14 +2488,6 @@ static void setObjCGCLValueClass(const ASTContext &Ctx, const Expr *E,
24922488
}
24932489
}
24942490

2495-
static llvm::Value *
2496-
EmitBitCastOfLValueToProperType(CodeGenFunction &CGF,
2497-
llvm::Value *V, llvm::Type *IRType,
2498-
StringRef Name = StringRef()) {
2499-
unsigned AS = cast<llvm::PointerType>(V->getType())->getAddressSpace();
2500-
return CGF.Builder.CreateBitCast(V, IRType->getPointerTo(AS), Name);
2501-
}
2502-
25032491
static LValue EmitThreadPrivateVarDeclLValue(
25042492
CodeGenFunction &CGF, const VarDecl *VD, QualType T, Address Addr,
25052493
llvm::Type *RealVarTy, SourceLocation Loc) {
@@ -2600,7 +2588,6 @@ static LValue EmitGlobalVarDeclLValue(CodeGenFunction &CGF,
26002588
V = CGF.Builder.CreateThreadLocalAddress(V);
26012589

26022590
llvm::Type *RealVarTy = CGF.getTypes().ConvertTypeForMem(VD->getType());
2603-
V = EmitBitCastOfLValueToProperType(CGF, V, RealVarTy);
26042591
CharUnits Alignment = CGF.getContext().getDeclAlign(VD);
26052592
Address Addr(V, RealVarTy, Alignment);
26062593
// Emit reference to the private copy of the variable if it is an OpenMP
@@ -3421,8 +3408,7 @@ void CodeGenFunction::EmitCfiSlowPathCheck(
34213408
"__cfi_slowpath_diag",
34223409
llvm::FunctionType::get(VoidTy, {Int64Ty, Int8PtrTy, Int8PtrTy},
34233410
false));
3424-
CheckCall = Builder.CreateCall(
3425-
SlowPathFn, {TypeId, Ptr, Builder.CreateBitCast(InfoPtr, Int8PtrTy)});
3411+
CheckCall = Builder.CreateCall(SlowPathFn, {TypeId, Ptr, InfoPtr});
34263412
} else {
34273413
SlowPathFn = CGM.getModule().getOrInsertFunction(
34283414
"__cfi_slowpath",
@@ -5365,8 +5351,7 @@ RValue CodeGenFunction::EmitCall(QualType CalleeType, const CGCallee &OrigCallee
53655351
AlignedCalleePtr = CalleePtr;
53665352
}
53675353

5368-
llvm::Value *CalleePrefixStruct = Builder.CreateBitCast(
5369-
AlignedCalleePtr, llvm::PointerType::getUnqual(PrefixStructTy));
5354+
llvm::Value *CalleePrefixStruct = AlignedCalleePtr;
53705355
llvm::Value *CalleeSigPtr =
53715356
Builder.CreateConstGEP2_32(PrefixStructTy, CalleePrefixStruct, -1, 0);
53725357
llvm::Value *CalleeSig =
@@ -5413,9 +5398,8 @@ RValue CodeGenFunction::EmitCall(QualType CalleeType, const CGCallee &OrigCallee
54135398
llvm::Value *TypeId = llvm::MetadataAsValue::get(getLLVMContext(), MD);
54145399

54155400
llvm::Value *CalleePtr = Callee.getFunctionPointer();
5416-
llvm::Value *CastedCallee = Builder.CreateBitCast(CalleePtr, Int8PtrTy);
54175401
llvm::Value *TypeTest = Builder.CreateCall(
5418-
CGM.getIntrinsic(llvm::Intrinsic::type_test), {CastedCallee, TypeId});
5402+
CGM.getIntrinsic(llvm::Intrinsic::type_test), {CalleePtr, TypeId});
54195403

54205404
auto CrossDsoTypeId = CGM.CreateCrossDsoCfiTypeId(MD);
54215405
llvm::Constant *StaticData[] = {
@@ -5425,18 +5409,17 @@ RValue CodeGenFunction::EmitCall(QualType CalleeType, const CGCallee &OrigCallee
54255409
};
54265410
if (CGM.getCodeGenOpts().SanitizeCfiCrossDso && CrossDsoTypeId) {
54275411
EmitCfiSlowPathCheck(SanitizerKind::CFIICall, TypeTest, CrossDsoTypeId,
5428-
CastedCallee, StaticData);
5412+
CalleePtr, StaticData);
54295413
} else {
54305414
EmitCheck(std::make_pair(TypeTest, SanitizerKind::CFIICall),
54315415
SanitizerHandler::CFICheckFail, StaticData,
5432-
{CastedCallee, llvm::UndefValue::get(IntPtrTy)});
5416+
{CalleePtr, llvm::UndefValue::get(IntPtrTy)});
54335417
}
54345418
}
54355419

54365420
CallArgList Args;
54375421
if (Chain)
5438-
Args.add(RValue::get(Builder.CreateBitCast(Chain, CGM.VoidPtrTy)),
5439-
CGM.getContext().VoidPtrTy);
5422+
Args.add(RValue::get(Chain), CGM.getContext().VoidPtrTy);
54405423

54415424
// C++17 requires that we evaluate arguments to a call using assignment syntax
54425425
// right-to-left, and that we evaluate arguments to certain other operators
@@ -5507,10 +5490,8 @@ RValue CodeGenFunction::EmitCall(QualType CalleeType, const CGCallee &OrigCallee
55075490
isa<CUDAKernelCallExpr>(E) &&
55085491
(!TargetDecl || !isa<FunctionDecl>(TargetDecl))) {
55095492
llvm::Value *Handle = Callee.getFunctionPointer();
5510-
auto *Cast =
5511-
Builder.CreateBitCast(Handle, Handle->getType()->getPointerTo());
55125493
auto *Stub = Builder.CreateLoad(
5513-
Address(Cast, Handle->getType(), CGM.getPointerAlign()));
5494+
Address(Handle, Handle->getType(), CGM.getPointerAlign()));
55145495
Callee.setFunctionPointer(Stub);
55155496
}
55165497
llvm::CallBase *CallOrInvoke = nullptr;

clang/lib/CodeGen/CGExprScalar.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3690,8 +3690,8 @@ static Value *emitPointerArithmetic(CodeGenFunction &CGF,
36903690

36913691
index = CGF.Builder.CreateMul(index, objectSize);
36923692

3693-
Value *result = CGF.Builder.CreateBitCast(pointer, CGF.VoidPtrTy);
3694-
result = CGF.Builder.CreateGEP(CGF.Int8Ty, result, index, "add.ptr");
3693+
Value *result =
3694+
CGF.Builder.CreateGEP(CGF.Int8Ty, pointer, index, "add.ptr");
36953695
return CGF.Builder.CreateBitCast(result, pointer->getType());
36963696
}
36973697

clang/lib/CodeGen/CodeGenFunction.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2049,8 +2049,7 @@ CodeGenFunction::EmitNullInitialization(Address DestPtr, QualType Ty) {
20492049
NullConstant, Twine());
20502050
CharUnits NullAlign = DestPtr.getAlignment();
20512051
NullVariable->setAlignment(NullAlign.getAsAlign());
2052-
Address SrcPtr(Builder.CreateBitCast(NullVariable, Builder.getInt8PtrTy()),
2053-
Builder.getInt8Ty(), NullAlign);
2052+
Address SrcPtr(NullVariable, Builder.getInt8Ty(), NullAlign);
20542053

20552054
if (vla) return emitNonZeroVLAInit(*this, Ty, DestPtr, SrcPtr, SizeVal);
20562055

clang/lib/CodeGen/ItaniumCXXABI.cpp

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -647,9 +647,7 @@ CGCallee ItaniumCXXABI::EmitLoadOfMemberFunctionPointer(
647647
// Apply the adjustment and cast back to the original struct type
648648
// for consistency.
649649
llvm::Value *This = ThisAddr.getPointer();
650-
llvm::Value *Ptr = Builder.CreateBitCast(This, Builder.getInt8PtrTy());
651-
Ptr = Builder.CreateInBoundsGEP(Builder.getInt8Ty(), Ptr, Adj);
652-
This = Builder.CreateBitCast(Ptr, This->getType(), "this.adjusted");
650+
This = Builder.CreateInBoundsGEP(Builder.getInt8Ty(), This, Adj);
653651
ThisPtrForCall = This;
654652

655653
// Load the function pointer.
@@ -740,9 +738,8 @@ CGCallee ItaniumCXXABI::EmitLoadOfMemberFunctionPointer(
740738
? llvm::Intrinsic::type_test
741739
: llvm::Intrinsic::public_type_test;
742740

743-
CheckResult = Builder.CreateCall(
744-
CGM.getIntrinsic(IID),
745-
{Builder.CreateBitCast(VFPAddr, CGF.Int8PtrTy), TypeId});
741+
CheckResult =
742+
Builder.CreateCall(CGM.getIntrinsic(IID), {VFPAddr, TypeId});
746743
}
747744

748745
if (CGM.getItaniumVTableContext().isRelativeLayout()) {
@@ -812,8 +809,6 @@ CGCallee ItaniumCXXABI::EmitLoadOfMemberFunctionPointer(
812809
};
813810

814811
llvm::Value *Bit = Builder.getFalse();
815-
llvm::Value *CastedNonVirtualFn =
816-
Builder.CreateBitCast(NonVirtualFn, CGF.Int8PtrTy);
817812
for (const CXXRecordDecl *Base : CGM.getMostBaseClasses(RD)) {
818813
llvm::Metadata *MD = CGM.CreateMetadataIdentifierForType(
819814
getContext().getMemberPointerType(
@@ -824,13 +819,13 @@ CGCallee ItaniumCXXABI::EmitLoadOfMemberFunctionPointer(
824819

825820
llvm::Value *TypeTest =
826821
Builder.CreateCall(CGM.getIntrinsic(llvm::Intrinsic::type_test),
827-
{CastedNonVirtualFn, TypeId});
822+
{NonVirtualFn, TypeId});
828823
Bit = Builder.CreateOr(Bit, TypeTest);
829824
}
830825

831826
CGF.EmitCheck(std::make_pair(Bit, SanitizerKind::CFIMFCall),
832827
SanitizerHandler::CFICheckFail, StaticData,
833-
{CastedNonVirtualFn, llvm::UndefValue::get(CGF.IntPtrTy)});
828+
{NonVirtualFn, llvm::UndefValue::get(CGF.IntPtrTy)});
834829

835830
FnNonVirtual = Builder.GetInsertBlock();
836831
}
@@ -1253,8 +1248,7 @@ void ItaniumCXXABI::emitVirtualObjectDelete(CodeGenFunction &CGF,
12531248
CGF.getPointerAlign());
12541249

12551250
// Apply the offset.
1256-
llvm::Value *CompletePtr =
1257-
CGF.Builder.CreateBitCast(Ptr.getPointer(), CGF.Int8PtrTy);
1251+
llvm::Value *CompletePtr = Ptr.getPointer();
12581252
CompletePtr =
12591253
CGF.Builder.CreateInBoundsGEP(CGF.Int8Ty, CompletePtr, Offset);
12601254

@@ -1454,7 +1448,6 @@ llvm::Value *ItaniumCXXABI::EmitTypeid(CodeGenFunction &CGF,
14541448

14551449
if (CGM.getItaniumVTableContext().isRelativeLayout()) {
14561450
// Load the type info.
1457-
Value = CGF.Builder.CreateBitCast(Value, CGM.Int8PtrTy);
14581451
Value = CGF.Builder.CreateCall(
14591452
CGM.getIntrinsic(llvm::Intrinsic::load_relative, {CGM.Int32Ty}),
14601453
{Value, llvm::ConstantInt::get(CGM.Int32Ty, -4)});
@@ -2211,8 +2204,7 @@ static llvm::Value *performTypeAdjustment(CodeGenFunction &CGF,
22112204
NonVirtualAdjustment);
22122205
}
22132206

2214-
// Cast back to the original type.
2215-
return CGF.Builder.CreateBitCast(ResultPtr, InitialPtr.getType());
2207+
return ResultPtr;
22162208
}
22172209

22182210
llvm::Value *ItaniumCXXABI::performThisAdjustment(CodeGenFunction &CGF,

0 commit comments

Comments
 (0)