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