diff options
author | Anders Carlsson <andersca@mac.com> | 2009-09-22 21:58:22 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-09-22 21:58:22 +0000 |
commit | dfd0330267742862342976eb7f2d5ef305790df4 (patch) | |
tree | 2cf9e4580fbbf55a7e6d3d0ee5d91420f547a9a6 /lib/CodeGen/CGCXXClass.cpp | |
parent | dff10dcee09ed48a0d74676299726b3533ea9b41 (diff) |
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
Diffstat (limited to 'lib/CodeGen/CGCXXClass.cpp')
-rw-r--r-- | lib/CodeGen/CGCXXClass.cpp | 17 |
1 files changed, 10 insertions, 7 deletions
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<CXXRecordDecl*>(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<CXXRecordDecl*>(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); |