This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug tree-optimization/47413] New: Constant Propagation and Virtual Function Tables


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47413

           Summary: Constant Propagation and Virtual Function Tables
           Product: gcc
           Version: 4.5.2
            Status: UNCONFIRMED
          Severity: enhancement
          Priority: P3
         Component: tree-optimization
        AssignedTo: unassigned@gcc.gnu.org
        ReportedBy: joerg@joergleis.com


The tested GCC version does not fully use its knowledge about (constant)
function pointers. In some cases (with LTO), this occurs frequently. The
following example should illustrate it and it's relevance:


    #include <stdio.h>
    #include <stdlib.h>


    /* the types */

    struct obj;

    struct vtab {
        int (*f)(struct obj *obj);
    };

    struct obj {
        const struct vtab *vtab;
    };


    static int f1337(struct obj *obj)
    {
        return 1337;
    }

    static const struct vtab vtab1337 = {
        .f = f1337
    };


    /* the functions */

    static struct obj *create()
    {
        struct obj *obj;

        if (!(obj = malloc(sizeof(struct obj)))) {
            return NULL;
        }

        obj->vtab = &vtab1337;

        return obj;
    }

    static int call(struct obj *obj)
    {
        return obj->vtab->f(obj);
    }


    /* the program */

    int main()
    {
        struct obj *obj;

        if (!(obj = create())) {
            return 0;
        }

        printf("%d\n", call(obj));
        return 1;
    }

When compiling with -O3, I'd expect GCC to just pass 1337 to printf, as it does
without a virtual function table. Instead, it uses its knowledge about obj to
call vtab1337.f(), as in

    call *vtab1337

but doesn't simplify *vtab1337 to f1337, or the entire call to 1337.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]