// PR debug/39086 // { dg-options "-g -O -fno-tree-sra" } struct A { int v; }; A ax; struct B { static A f1 () { return ax; } static bool f2 (); static A f3 (); }; struct C { A f4 () { A x; if (__builtin_expect (this->f6 () < this->f12 (), true)) x = B::f1 (); else x = this->f7 (); return x; } A f5 () { A y; if (this->f6 () < this->f12 ()) y = B::f1 (); else y = this->f7 (); return y; } void *f6 () const; void *f12 () const; virtual A f7 (); }; C *dx; struct D { C *f8 () const; }; class E : virtual public D { void f11 (); void f9 (); void f10 (); }; struct G { explicit G (); operator bool () const; }; void E::f11 (void) { A d = B::f3 (); d = this->f8 ()->f4 (); } void E::f9 () { G c; if (c) { const A e = B::f3 (); C * f = this->f8 (); A d = f->f5 (); if (B::f2 ()) ; else if (B::f2 ()) f->f4 (); } } void E::f10 () { G c; if (c) { const A e = B::f3 (); C * f = this->f8 (); A d = f->f5 (); if (B::f2 ()) ; else if (B::f2 ()) f->f4 (); } }