https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87008

--- Comment #1 from Marc Glisse <glisse at gcc dot gnu.org> ---
struct A { double a, b; };
struct B : A {};
template<class T>void cp(T&a,T const&b){a=b;}
double f(B x){
  B y; cp<A>(y,x);
  B z; cp<A>(z,x);
  return y.a - z.a;
}

This is not quite equivalent because RTL manages to optimize this case, but
gimple, with -Ofast, still gets the ugly:

  ISRA.1 = MEM[(const struct A &)&x];
  SR.9_9 = MEM[(struct A *)&ISRA.1];
  ISRA.1 = MEM[(const struct A &)&x];
  SR.8_10 = MEM[(struct A *)&ISRA.1];
  _3 = SR.9_9 - SR.8_10;
  return _3;

Writing cp<B> instead of cp<A> makes it work, and the main difference starts in
SRA. I expect (didn't check) this is another victim of r255510 .

Reply via email to