From: Anders Carlsson Date: Tue, 22 Sep 2009 21:58:22 +0000 (+0000) Subject: When doing a derived-to-base class and the class offset is 0 we can just do a simple... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=dfd0330267742862342976eb7f2d5ef305790df4;p=clang When doing a derived-to-base class and the class offset is 0 we can just do a simple bitcast. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@82579 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGCXXClass.cpp b/lib/CodeGen/CGCXXClass.cpp index b2ff2327af..6d53e83e7c 100644 --- a/lib/CodeGen/CGCXXClass.cpp +++ b/lib/CodeGen/CGCXXClass.cpp @@ -77,10 +77,18 @@ CodeGenFunction::GetAddressCXXOfBaseClass(llvm::Value *BaseValue, if (ClassDecl == BaseClassDecl) return BaseValue; + QualType BTy = + getContext().getCanonicalType( + getContext().getTypeDeclType(const_cast(BaseClassDecl))); + const llvm::Type *BasePtrTy = llvm::PointerType::getUnqual(ConvertType(BTy)); uint64_t Offset = ComputeBaseClassOffset(getContext(), ClassDecl, BaseClassDecl); - + if (!Offset) { + // Just cast back. + return Builder.CreateBitCast(BaseValue, BasePtrTy); + } + llvm::BasicBlock *CastNull = 0; llvm::BasicBlock *CastNotNull = 0; llvm::BasicBlock *CastEnd = 0; @@ -108,13 +116,8 @@ CodeGenFunction::GetAddressCXXOfBaseClass(llvm::Value *BaseValue, BaseValue = Builder.CreateBitCast(BaseValue, Int8PtrTy); BaseValue = Builder.CreateGEP(BaseValue, OffsetVal, "add.ptr"); - QualType BTy = - getContext().getCanonicalType( - getContext().getTypeDeclType(const_cast(BaseClassDecl))); - // Cast back. - const llvm::Type *BasePtr = llvm::PointerType::getUnqual(ConvertType(BTy)); - BaseValue = Builder.CreateBitCast(BaseValue, BasePtr); + BaseValue = Builder.CreateBitCast(BaseValue, BasePtrTy); if (NullCheckValue) { Builder.CreateBr(CastEnd);