------- Additional Comments From jason at gcc dot gnu dot org 2004-10-29 21:46 ------- The problem seems to be an incorrect tailcall. Before my patch, "*p = foo()" was turned into "T.1 = foo(); *p = T.1;". After my patch, the gimplifier no longer introduced a temporary. If A is returned in memory the tailcall pass then marks the line "*p = foo()" as a tailcall, losing the assignment in the process.
I think I'll fix this by using a temporary for all non-BLKmode types, but this also seems like a bug in the tailcall pass. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=17526