Consider the following class hierarchy:

struct StorageBase {
        int i;
};
struct NonPod1 : StorageBase {
        int get() { return i; }
        NonPod1() {}
};
struct NonPod {
        NonPod() { x[0].i = 0; x[1].i = 0; }
        NonPod1& operator[](int i) { return *static_cast<NonPod1*>(&x[i]); }
        StorageBase x[2];
};

where StorageBase exists to allow the casting in NonPod::operator[] and
at the same time avoid default initialization of NonPod::x (if we were
using NonPod1 x[2]).  The following two functions should be optimized
to return 0, the first requires a tree-combiner to do so, the second
requires fold to deal with ((NonPod1 *)&a.x[0])->D.1745.i to see that
x and D.1745 have the same type so it can be folded to a.x[0].i.

int foo(void)
{
        NonPod a;
        return a[0].get();
}

int bar(void)
{
        NonPod a;
        return static_cast<NonPod1*>(&a.x[0])->i;
}


-- 
           Summary: Does not fold access to base with cast to different
                    derived type
           Product: gcc
           Version: 4.2.0
            Status: UNCONFIRMED
          Keywords: missed-optimization, TREE
          Severity: normal
          Priority: P3
         Component: middle-end
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: rguenth at gcc dot gnu dot org


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

Reply via email to