Like PR 33790, dse.c could handle the case mentioned in there.  The current
issue is that it does:
  if (GET_MODE_CLASS (read_mode) != GET_MODE_CLASS (store_mode))
    return false;

And the clases are different, one is the vector float class (V4SF) and the
other is the vector integer class (V4SI) (or just integer class [TI], spu). 

Testcase where an extra store/load exists:

#define vector __attribute__((__vector_size__(16) ))

typedef vector float vec_float4;
typedef struct {
        vec_float4 data;
} VecFloat4;

typedef struct {
        vec_float4 a;
        vec_float4 b;
} VecFloat4x2;


VecFloat4 test1(VecFloat4 a, VecFloat4 b)
{
        a.data = a.data+b.data;
        return a;
}


VecFloat4x2 test2(VecFloat4x2 data)
{
        data.a = data.a+data.a;
        data.b = data.b+data.b;
        return data;
}


-- 
           Summary: replace_read in dse.c could handle cases where
                    GET_MODE_CLASS (read_mode) != GET_MODE_CLASS
                    (store_mode) (and the size is the same)
           Product: gcc
           Version: 4.3.0
            Status: UNCONFIRMED
          Keywords: missed-optimization
          Severity: enhancement
          Priority: P3
         Component: rtl-optimization
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: pinskia at gcc dot gnu dot org
GCC target triplet: spu-elf, powerpc64-linux-gnu


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

Reply via email to