http://gcc.gnu.org/bugzilla/show_bug.cgi?id=61034
--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> --- Actually it's the conditional free that "clobbers" the value as _83 may point to the same thing as _86 (so we don't CSE (possible) use-after-frees). if (_85 == 0) goto <bb 6>; else goto <bb 7>; <bb 6>: # .MEM_287 = VDEF <.MEM_286> # USE = nonlocal # CLB = nonlocal __builtin_free (_83); <bb 7>: # .MEM_40 = PHI <.MEM_286(5), .MEM_287(6)> and we don't use VN to improve that disambiguation result (we know that _83 == _2 and that doesn't point to the malloc result in question).