forked from OSchip/llvm-project
[MS ABI] Some code cleanups
Don't create unnecessary truncations if the result will not be used. Also prefer preforming math before the truncation, it makes it a little easier to reason about. llvm-svn: 274984
This commit is contained in:
parent
97d0517078
commit
177553511d
|
@ -942,7 +942,6 @@ MicrosoftCXXABI::performBaseAdjustment(CodeGenFunction &CGF, Address Value,
|
|||
llvm::Value *Offset =
|
||||
GetVirtualBaseClassOffset(CGF, Value, SrcDecl, PolymorphicBase);
|
||||
llvm::Value *Ptr = CGF.Builder.CreateInBoundsGEP(Value.getPointer(), Offset);
|
||||
Offset = CGF.Builder.CreateTrunc(Offset, CGF.Int32Ty);
|
||||
CharUnits VBaseAlign =
|
||||
CGF.CGM.getVBaseAlignment(Value.getAlignment(), SrcDecl, PolymorphicBase);
|
||||
return std::make_pair(Address(Ptr, VBaseAlign), Offset);
|
||||
|
@ -976,8 +975,8 @@ llvm::Value *MicrosoftCXXABI::EmitTypeid(CodeGenFunction &CGF,
|
|||
QualType SrcRecordTy,
|
||||
Address ThisPtr,
|
||||
llvm::Type *StdTypeInfoPtrTy) {
|
||||
llvm::Value *Offset;
|
||||
std::tie(ThisPtr, Offset) = performBaseAdjustment(CGF, ThisPtr, SrcRecordTy);
|
||||
std::tie(ThisPtr, std::ignore) =
|
||||
performBaseAdjustment(CGF, ThisPtr, SrcRecordTy);
|
||||
auto Typeid = emitRTtypeidCall(CGF, ThisPtr.getPointer()).getInstruction();
|
||||
return CGF.Builder.CreateBitCast(Typeid, StdTypeInfoPtrTy);
|
||||
}
|
||||
|
@ -1002,6 +1001,7 @@ llvm::Value *MicrosoftCXXABI::EmitDynamicCastCall(
|
|||
llvm::Value *Offset;
|
||||
std::tie(This, Offset) = performBaseAdjustment(CGF, This, SrcRecordTy);
|
||||
llvm::Value *ThisPtr = This.getPointer();
|
||||
Offset = CGF.Builder.CreateTrunc(Offset, CGF.Int32Ty);
|
||||
|
||||
// PVOID __RTDynamicCast(
|
||||
// PVOID inptr,
|
||||
|
@ -1025,8 +1025,7 @@ llvm::Value *
|
|||
MicrosoftCXXABI::EmitDynamicCastToVoid(CodeGenFunction &CGF, Address Value,
|
||||
QualType SrcRecordTy,
|
||||
QualType DestTy) {
|
||||
llvm::Value *Offset;
|
||||
std::tie(Value, Offset) = performBaseAdjustment(CGF, Value, SrcRecordTy);
|
||||
std::tie(Value, std::ignore) = performBaseAdjustment(CGF, Value, SrcRecordTy);
|
||||
|
||||
// PVOID __RTCastToVoid(
|
||||
// PVOID inptr)
|
||||
|
@ -1152,16 +1151,14 @@ void MicrosoftCXXABI::initializeHiddenVirtualInheritanceMembers(
|
|||
|
||||
llvm::Value *VBaseOffset =
|
||||
GetVirtualBaseClassOffset(CGF, getThisAddress(CGF), RD, I->first);
|
||||
// FIXME: it doesn't look right that we SExt in GetVirtualBaseClassOffset()
|
||||
// just to Trunc back immediately.
|
||||
VBaseOffset = Builder.CreateTruncOrBitCast(VBaseOffset, CGF.Int32Ty);
|
||||
uint64_t ConstantVBaseOffset =
|
||||
Layout.getVBaseClassOffset(I->first).getQuantity();
|
||||
|
||||
// vtorDisp_for_vbase = vbptr[vbase_idx] - offsetof(RD, vbase).
|
||||
llvm::Value *VtorDispValue = Builder.CreateSub(
|
||||
VBaseOffset, llvm::ConstantInt::get(CGM.Int32Ty, ConstantVBaseOffset),
|
||||
VBaseOffset, llvm::ConstantInt::get(CGM.PtrDiffTy, ConstantVBaseOffset),
|
||||
"vtordisp.value");
|
||||
VtorDispValue = Builder.CreateTruncOrBitCast(VtorDispValue, CGF.Int32Ty);
|
||||
|
||||
if (!Int8This)
|
||||
Int8This = Builder.CreateBitCast(getThisValue(CGF),
|
||||
|
|
Loading…
Reference in New Issue