[LLVMbugs] [Bug 126] NEW: llvmg++ generates casting code for member initialization

bugzilla-daemon at zion.cs.uiuc.edu bugzilla-daemon at zion.cs.uiuc.edu
Tue Nov 18 10:00:33 PST 2003


http://llvm.cs.uiuc.edu/bugs/show_bug.cgi?id=126

           Summary: llvmg++ generates casting code for member initialization
           Product: tools
           Version: 1.0
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: P2
         Component: llvm-g++
        AssignedTo: sabre at nondot.org
        ReportedBy: sabre at nondot.org


In this testcase, the 'A' object should be trivially eliminable:

struct A {
        A() : i(0) {}
        int getI() {return i;}
        int i;
};

int f(int j)
{
        A a;
        return j+a.getI();
}

But the optimizer is not doing this because we get nasty code like:

int %_Z1fi(int %j.1) {
entry:
        %a = alloca %struct.A           ; <%struct.A*> [#uses=1]
        %tmp.1.i = cast %struct.A* %a to uint           ; <uint> [#uses=1]
        %tmp.2.i = cast uint %tmp.1.i to %struct.A*             ; <%struct.A*>
[#uses=1]
        %tmp.3.i = getelementptr %struct.A* %tmp.2.i, long 0, ubyte 0          
; <int*> [#uses=1]
        store int 0, int* %tmp.3.i
        ret int %j.1
}

... note the pointless cast.  This can be solved two ways:

1. The instcombiner can be taught the size of a pointer.
2. The C++ front-end can be beaten over the head until this doesn't happen.

Doing both is obviously best!  :)

-Chris



------- You are receiving this mail because: -------
You are on the CC list for the bug, or are watching someone who is.



More information about the llvm-bugs mailing list