/* { dg-do compile } */ /* { dg-options "-O -fno-tree-sra -fdump-tree-fre1-details" } */ int f(); template class noop_t { const predicate &pred; public: explicit noop_t(const predicate &p) : pred(p) {} int operator()() const { return pred(); } }; template inline noop_t noop(const predicate pred) { return noop_t(pred); } int x() { return (noop(noop(noop(noop(noop(noop(noop(noop(noop(f)))))))))()); } /* We should optimize this to a direct call. */ /* { dg-final { scan-tree-dump "Replacing call target with f" "fre1" } } */ /* { dg-final { cleanup-tree-dump "fre1" } } */