http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19831
--- Comment #17 from Marc Glisse <glisse at gcc dot gnu.org> --- void f (double * __restrict a) { int * __restrict p = (int*) __builtin_malloc (sizeof (int)); *p = 42; __builtin_free (p); ++*a; // Breaks the optimization! } Normally, gcc now manages to remove unused malloc+write+free sequences. However, it seems that completely unrelated operations, even after free, can prevent this optimization (it is the detection that *p=42 is dead that fails). That limits the effect in real-world code... (funny that if I remove the line with free(p), gcc does manage to optimize)