[cfe-commits] r83816 - in /cfe/trunk: lib/CodeGen/CGCXX.cpp test/CodeGenCXX/virtual-function-calls.cpp
Douglas Gregor
dgregor at apple.com
Mon Oct 12 10:11:54 PDT 2009
On Oct 11, 2009, at 4:55 PM, Anders Carlsson wrote:
> Author: andersca
> Date: Sun Oct 11 18:55:52 2009
> New Revision: 83816
>
> URL: http://llvm.org/viewvc/llvm-project?rev=83816&view=rev
> Log:
> If the base type of a member call is a record type we don't need to
> emit a virtual call.
This doesn't look right... details below.
> Modified:
> cfe/trunk/lib/CodeGen/CGCXX.cpp
> cfe/trunk/test/CodeGenCXX/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=83816&r1=83815&r2=83816&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/lib/CodeGen/CGCXX.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGCXX.cpp Sun Oct 11 18:55:52 2009
> @@ -230,10 +230,13 @@
> // C++ [class.virtual]p12:
> // Explicit qualification with the scope operator (5.1)
> suppresses the
> // virtual call mechanism.
> + //
> + // We also don't emit a virtual call if the base expression has a
> record type
> + // because then we know what the type is.
> llvm::Value *Callee;
> - if (MD->isVirtual() && !ME->hasQualifier())
> - // FIXME: push getCanonicalDecl as a conversion using the
> static type system (CanCXXMethodDecl).
> - Callee = BuildVirtualCall(MD->getCanonicalDecl(), This, Ty);
> + if (MD->isVirtual() && !ME->hasQualifier() &&
> + !ME->getBase()->getType()->isRecordType())
> + Callee = BuildVirtualCall(MD, This, Ty);
The type of the expression could be a record type even if the dynamic
type of the object isn't known at compile time. If I tweak your
example like this:
void f(A &a) {
a.f('c');
}
I now get a direct call, when I should get a virtual call. To do this
devirtualization, I suggest abstracting the "find the dynamic type of
this expression" logic into a separate function. Then, we can teach it
about common cases, such as referring to a VarDecl of (non-reference)
type, constructing a temporary of a specific type, etc. I expect that
this logic will get smarter over time, as we think of more analyses
that can help make this distinction.
- Doug
More information about the cfe-commits
mailing list