https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77485
--- Comment #8 from rguenther at suse dot de <rguenther at suse dot de> --- On Wed, 14 Dec 2016, law at redhat dot com wrote: > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77485 > > --- Comment #7 from Jeffrey A. Law <law at redhat dot com> --- > There was a bit of cruft and a missed ADDR_EXPR in that last fragment of > gimple > code. > > ;; basic block 2, loop depth 0, count 0, freq 0, maybe hot > ;; prev block 0, next block 1, flags: (NEW, REACHABLE, VISITED) > ;; pred: ENTRY (FALLTHRU,EXECUTABLE) > __builtin_memset (&MEM[(struct FixBuf *)&<retval> + 31B], 0, 169); > <retval>.buf[0] = 48; > <retval>.buf[1] = 32; > [ ... ] > return <retval>; It also shows another (awkward) detail of the transform -- a previously non-TREE_ADDRESSABLE <retval> becomes TREE_ADDRESSABLE. This generally invalidates points-to (though in this particular case should be harmless). It also possibly pessimizes alias analysis because pointers pointing to unknown stuff now also alias <retval> while previously not (non-TREE_ADDRESSABLE decls are not aliased). This is why we generally prefer decl = {}; over a memset. If you just chop off elements from the head/tail you can keep the {} if you do MEM <char[of-correct-size]> [&decl, off with original alias type] = {}; (CONSTRUCTOR of same char[] type)