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

            Bug ID: 125325
           Summary: Missed aggregate copy handling in VN
           Product: gcc
           Version: 17.0
            Status: UNCONFIRMED
          Keywords: missed-optimization
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: rguenth at gcc dot gnu.org
  Target Milestone: ---

struct T { void m() {} };
struct W1 { void (T::*p_)(); W1(void (T::*p)()) : p_(p) {} void operator()(T*
u) { (u->*p_)(); } };
struct A { A(); char operator[](int); };
struct W2 { void operator()(W1& w, A) { T x; w(&x); } };
struct B { W1 w1; W2 w2; B(W1 a) : w1(a) {} void operator()() { A a; w2(w1, a);
} };
B mk(void (T::*p)()) { return B(W1(p)); }
template <class O> void run(B b) { O o; (void)o[0]; b(); }
void go() { run<A>(mk(&T::m)); }

shows this at -O2 in FRE3:

  MEM <void T::<T425> (struct T *) *> [(struct  *)&D.3226] = m;
  MEM <long int> [(struct  *)&D.3226 + 8B] = 0;
  D.3227.w1 = VIEW_CONVERT_EXPR<struct W1>(D.3226);
  b = D.3227;
  A::A (&o);
  A::operator[] (&o, 0);
  A::A (&a);
  _7 = MEM <void T::<T425> (struct T *) *> [(struct  *)&b];

split out from PR125285

Reply via email to