]> granicus.if.org Git - clang/commitdiff
When doing a derived-to-base class and the class offset is 0 we can just do a simple...
authorAnders Carlsson <andersca@mac.com>
Tue, 22 Sep 2009 21:58:22 +0000 (21:58 +0000)
committerAnders Carlsson <andersca@mac.com>
Tue, 22 Sep 2009 21:58:22 +0000 (21:58 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@82579 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGCXXClass.cpp

index b2ff2327afbe00c1230b707572818bf2753a90c8..6d53e83e7cf08c5011997beab93075c8b37da300 100644 (file)
@@ -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);