[cfe-commits] r86121 - /cfe/trunk/lib/CodeGen/CGCXX.cpp

Mike Stump mrs at apple.com
Wed Nov 4 22:32:02 PST 2009


Author: mrs
Date: Thu Nov  5 00:32:02 2009
New Revision: 86121

URL: http://llvm.org/viewvc/llvm-project?rev=86121&view=rev
Log:
References can't be zero; omit zero check for return value adjustments
in covariant thunks that return references.

Modified:
    cfe/trunk/lib/CodeGen/CGCXX.cpp

Modified: cfe/trunk/lib/CodeGen/CGCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCXX.cpp?rev=86121&r1=86120&r2=86121&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CGCXX.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGCXX.cpp Thu Nov  5 00:32:02 2009
@@ -810,26 +810,32 @@
   RValue RV = EmitCall(CGM.getTypes().getFunctionInfo(ResultType, CallArgs),
                        Callee, CallArgs, MD);
   if (nv_r || v_r) {
+    bool CanBeZero = !(ResultType->isReferenceType()
+    // FIXME: attr nonnull can't be zero either
+                       /* || ResultType->hasAttr<NonNullAttr>() */ );
     // Do the return result adjustment.
-    llvm::BasicBlock *NonZeroBlock = createBasicBlock();
-    llvm::BasicBlock *ZeroBlock = createBasicBlock();
-    llvm::BasicBlock *ContBlock = createBasicBlock();
-
-    const llvm::Type *Ty = RV.getScalarVal()->getType();
-    llvm::Value *Zero = llvm::Constant::getNullValue(Ty);
-    Builder.CreateCondBr(Builder.CreateICmpNE(RV.getScalarVal(), Zero),
-                         NonZeroBlock, ZeroBlock);
-    EmitBlock(NonZeroBlock);
-    llvm::Value *NZ = DynamicTypeAdjust(RV.getScalarVal(), nv_r, v_r);
-    EmitBranch(ContBlock);
-    EmitBlock(ZeroBlock);
-    llvm::Value *Z = RV.getScalarVal();
-    EmitBlock(ContBlock);
-    llvm::PHINode *RVOrZero = Builder.CreatePHI(Ty);
-    RVOrZero->reserveOperandSpace(2);
-    RVOrZero->addIncoming(NZ, NonZeroBlock);
-    RVOrZero->addIncoming(Z, ZeroBlock);
-    RV = RValue::get(RVOrZero);
+    if (CanBeZero) {
+      llvm::BasicBlock *NonZeroBlock = createBasicBlock();
+      llvm::BasicBlock *ZeroBlock = createBasicBlock();
+      llvm::BasicBlock *ContBlock = createBasicBlock();
+
+      const llvm::Type *Ty = RV.getScalarVal()->getType();
+      llvm::Value *Zero = llvm::Constant::getNullValue(Ty);
+      Builder.CreateCondBr(Builder.CreateICmpNE(RV.getScalarVal(), Zero),
+                           NonZeroBlock, ZeroBlock);
+      EmitBlock(NonZeroBlock);
+      llvm::Value *NZ = DynamicTypeAdjust(RV.getScalarVal(), nv_r, v_r);
+      EmitBranch(ContBlock);
+      EmitBlock(ZeroBlock);
+      llvm::Value *Z = RV.getScalarVal();
+      EmitBlock(ContBlock);
+      llvm::PHINode *RVOrZero = Builder.CreatePHI(Ty);
+      RVOrZero->reserveOperandSpace(2);
+      RVOrZero->addIncoming(NZ, NonZeroBlock);
+      RVOrZero->addIncoming(Z, ZeroBlock);
+      RV = RValue::get(RVOrZero);
+    } else
+      RV = RValue::get(DynamicTypeAdjust(RV.getScalarVal(), nv_r, v_r));
   }
 
   if (!ResultType->isVoidType())





More information about the cfe-commits mailing list