[cfe-commits] r159351 - in /cfe/trunk: lib/CodeGen/CGExprCXX.cpp test/CodeGenCXX/devirtualize-virtual-function-calls-final.cpp
Rafael Espindola
rafael.espindola at gmail.com
Thu Jun 28 08:11:39 PDT 2012
Author: rafael
Date: Thu Jun 28 10:11:39 2012
New Revision: 159351
URL: http://llvm.org/viewvc/llvm-project?rev=159351&view=rev
Log:
Disable devirtualization when we have covariant returns. I will open a bug
for tracking this.
Modified:
cfe/trunk/lib/CodeGen/CGExprCXX.cpp
cfe/trunk/test/CodeGenCXX/devirtualize-virtual-function-calls-final.cpp
Modified: cfe/trunk/lib/CodeGen/CGExprCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprCXX.cpp?rev=159351&r1=159350&r2=159351&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGExprCXX.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGExprCXX.cpp Thu Jun 28 10:11:39 2012
@@ -202,6 +202,9 @@
// we don't have support for that yet, so do a virtual call.
DevirtualizedMethod = NULL;
}
+ if (DevirtualizedMethod && DevirtualizedMethod->getResultType() !=
+ MD->getResultType())
+ DevirtualizedMethod = NULL;
}
llvm::Value *This;
Modified: cfe/trunk/test/CodeGenCXX/devirtualize-virtual-function-calls-final.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/devirtualize-virtual-function-calls-final.cpp?rev=159351&r1=159350&r2=159351&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenCXX/devirtualize-virtual-function-calls-final.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/devirtualize-virtual-function-calls-final.cpp Thu Jun 28 10:11:39 2012
@@ -152,3 +152,37 @@
return static_cast<B*>(c)->foo();
}
}
+
+namespace Test9 {
+ struct A {
+ int a;
+ };
+ struct B {
+ int b;
+ };
+ struct C : public B, public A {
+ };
+ struct RA {
+ virtual A *f() {
+ return 0;
+ }
+ };
+ struct RC final : public RA {
+ virtual C *f() {
+ C *x = new C();
+ x->a = 1;
+ x->b = 2;
+ return x;
+ }
+ };
+ // CHECK: define {{.*}} @_ZN5Test91fEPNS_2RCE
+ A *f(RC *x) {
+ // FIXME: It should be possible to devirtualize this case, but that is
+ // not implemented yet.
+ // CHECK: getelementptr
+ // CHECK-NEXT: %[[FUNC:.*]] = load
+ // CHECK-NEXT: bitcast
+ // CHECK-NEXT: = call {{.*}} %[[FUNC]]
+ return static_cast<RA*>(x)->f();
+ }
+}
More information about the cfe-commits
mailing list