https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98925
Bug ID: 98925 Summary: Extend modref to handle return slot optimization Product: gcc Version: 11.0 Status: UNCONFIRMED Keywords: missed-optimization Severity: normal Priority: P3 Component: tree-optimization Assignee: hubicka at gcc dot gnu.org Reporter: slyfox at gcc dot gnu.org CC: rguenth at gcc dot gnu.org Target Milestone: --- Moving out https://gcc.gnu.org/PR98499#c9 to a separate enhancement PR: Right now analyze_ssa_name_flags() does not perform detailed modref analysis of return slot optimization and falls back to conservative assumption: analyze_ssa_name_flags() /* Return slot optiomization would require bit of propagation; give up for now. */ if (gimple_call_return_slot_opt_p (call) && gimple_call_lhs (call) != NULL_TREE && TREE_ADDRESSABLE (TREE_TYPE (gimple_call_lhs (call)))) { if (dump_file) fprintf (dump_file, "%*s Unhandled return slot opt\n", depth * 4, ""); lattice[index].merge (0); } I don't know what would be a good test for it. If I don't overstimate modref and alias analysis destructor should disappear completely in the example below (from https://gcc.gnu.org/PR98499#c4): struct string { char * _M_buf; // local store char _M_local_buf[16]; __attribute__((noinline)) string() : _M_buf(_M_local_buf) {} ~string() { if (_M_buf != _M_local_buf) __builtin_trap(); } string(const string &__str); // no copies }; // main.cc __attribute__((noinline)) static string dir_name() { return string(); } class Importer { string base_path; public: __attribute__((noinline)) Importer() : base_path (dir_name()) {} }; int main() { Importer imp; }