[LLVMbugs] [Bug 3100] New: llvm-g++ is unable to devirtualize a function call
bugzilla-daemon at cs.uiuc.edu
bugzilla-daemon at cs.uiuc.edu
Wed Nov 19 06:56:04 PST 2008
http://llvm.org/bugs/show_bug.cgi?id=3100
Summary: llvm-g++ is unable to devirtualize a function call
Product: tools
Version: trunk
Platform: PC
OS/Version: Linux
Status: NEW
Severity: normal
Priority: P2
Component: llvm-g++
AssignedTo: unassignedbugs at nondot.org
ReportedBy: rafael.espindola at gmail.com
CC: llvmbugs at cs.uiuc.edu
Testcase from the g++ testsuite
-----------------------------------------
struct S { S(); virtual void xyzzy(); };
inline void foo(S *s) { s->xyzzy(); }
void bar() { S s; foo(&s); }
----------------------------------------
With gcc we got
call _ZN1S5xyzzyEv
with llvm-g++ we got
call *%rax
there rax contains the pointer fetched from the vtable. The problem is that
llvm-g++ knows what the vtable looks like, but doesn't communicate that to
llvm.
A simpler testcase also fails with llvm:
----------------------------------------
struct S { S() {}; virtual void xyzzy(); };
inline void foo(S *s) { s->xyzzy(); }
void bar() { S s; foo(&s); }
----------------------------------------
Now we have the constructor body and we do a bit better:
----------------------------
call *_ZTV1S+16
---------------------------
but llvm-g++ only says
@_ZTV1S = external constant [3 x i32 (...)*]
so there is no way for llvm to const propagate the fetch.
--
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.
More information about the llvm-bugs
mailing list