https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120409
--- Comment #10 from Iain Sandoe <iains at gcc dot gnu.org> --- (In reply to H.J. Lu from comment #9) > The .006t.original dump differences between -m32 and -mx32 > > Where does this difference come from? this function: OptionalPromiseReturn OptionalPromise::get_return_object() { return *this; } === produces the following gimple on most targets (which seems correct): struct OptionalPromiseReturn folly::OptionalPromise::get_return_object (struct OptionalPromise * const this) { folly::OptionalPromiseReturn::OptionalPromiseReturn (&<retval>, this); return <retval>; } ====== but it produces the following gimple on sparcv9-solaris and mx32-linux: (which seems to be incorrect - since there is a copy that I think should be elided) This is regular C++ - it is not modified by the coroutine transforms. ======= struct OptionalPromiseReturn folly::OptionalPromise::get_return_object (struct OptionalPromise * const this) { struct OptionalPromiseReturn D.9045; struct OptionalPromiseReturn D.8785; try { folly::OptionalPromiseReturn::OptionalPromiseReturn (&D.8785, this); D.9045 = D.8785; return D.9045; } finally { D.8785 = {CLOBBER(eos)}; } }