[cfe-commits] r86120 - in /cfe/trunk: lib/CodeGen/CGCXX.cpp test/CodeGenCXX/virt.cpp
Mike Stump
mrs at apple.com
Wed Nov 4 22:12:27 PST 2009
Author: mrs
Date: Thu Nov 5 00:12:26 2009
New Revision: 86120
URL: http://llvm.org/viewvc/llvm-project?rev=86120&view=rev
Log:
Refine covariant return value adjustments for thunks when null
pointers are returned.
Modified:
cfe/trunk/lib/CodeGen/CGCXX.cpp
cfe/trunk/test/CodeGenCXX/virt.cpp
Modified: cfe/trunk/lib/CodeGen/CGCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCXX.cpp?rev=86120&r1=86119&r2=86120&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGCXX.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGCXX.cpp Thu Nov 5 00:12:26 2009
@@ -811,7 +811,25 @@
Callee, CallArgs, MD);
if (nv_r || v_r) {
// Do the return result adjustment.
- RV = RValue::get(DynamicTypeAdjust(RV.getScalarVal(), nv_r, v_r));
+ 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 (!ResultType->isVoidType())
Modified: cfe/trunk/test/CodeGenCXX/virt.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/virt.cpp?rev=86120&r1=86119&r2=86120&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenCXX/virt.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/virt.cpp Thu Nov 5 00:12:26 2009
@@ -1076,12 +1076,16 @@
// CHECK-LPOPT64-NEXT: subq $8, %rsp
// CHECK-LPOPT64-NEXT:Llabel
// CHECK-LPOPT64-NEXT: call __ZN8test16_D4foo1Ev
-// FIXME: We need a == 0 check here
+// CHECK-LPOPT64-NEXT: testq %rax, %rax
+// CHECK-LPOPT64-NEXT: je LBB102_2
// CHECK-LPOPT64-NEXT: movq 16(%rax), %rcx
// CHECK-LPOPT64-NEXT: movq -32(%rcx), %rcx
// CHECK-LPOPT64-NEXT: leaq 16(%rcx,%rax), %rax
// CHECK-LPOPT64-NEXT: addq $8, %rsp
// CHECK-LPOPT64-NEXT: ret
+// CHECK-LPOPT64-NEXT:LBB102_2:
+// CHECK-LPOPT64-NEXT: addq $8, %rsp
+// CHECK-LPOPT64-NEXT: ret
class test17_B1 {
More information about the cfe-commits
mailing list