Author: andersca
Date: Mon Oct 12 14:51:33 2009
New Revision: 83883
URL: http://llvm.org/viewvc/llvm-project?rev=83883&view=rev
Log:
More devirtualization improvements.
Modified:
cfe/trunk/lib/CodeGen/CGCXX.cpp
cfe/trunk/test/CodeGenCXX/devirtualize-virtual-function-calls.cpp
Modified: cfe/trunk/lib/CodeGen/CGCXX.cpp
URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCXX.cpp?rev=83883&r1=83882&r2=83883&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGCXX.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGCXX.cpp Mon Oct 12 14:51:33 2009
@@ -214,6 +214,10 @@
if (isa<CXXTemporaryObjectExpr>(Base))
return true;
+ // Check if this is a call expr that returns a record type.
+ if (const CallExpr *CE = dyn_cast<CallExpr>(Base))
+ return CE->getCallReturnType()->isRecordType();
+
// We can't devirtualize the call.
return false;
}
Modified: cfe/trunk/test/CodeGenCXX/devirtualize-virtual-function-calls.cpp
URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/devirtualize-virtual-function-calls.cpp?rev=83883&r1=83882&r2=83883&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenCXX/devirtualize-virtual-function-calls.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/devirtualize-virtual-function-calls.cpp Mon Oct
12 14:51:33 2009
@@ -2,8 +2,12 @@
struct A {
virtual void f();
+
+ A h();
};
+A g();
+
void f(A a, A *ap, A& ar) {
// This should not be a virtual function call.
@@ -18,4 +22,10 @@
// CHECK: call void @_ZN1A1fEv
A().f();
+
+ // CHECK: call void @_ZN1A1fEv
+ g().f();
+
+ // CHECK: call void @_ZN1A1fEv
+ a.h().f();
}
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits