https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67618
--- Comment #9 from Daniel Gutson <daniel.gutson at tallertechnologies dot com> --- (In reply to Marc Glisse from comment #8) > (bugzilla bug that reset the component...) > > (In reply to Daniel Gutson from comment #6) > > That's why the 'if (ptr != NULL)' should not be ignored, which currently is. > > The 'if' prevents the UB. > > Uh, if you consider it UB, I don't understand the problem. At runtime, > either malloc succeeded and the transformation is fine, or x<=12 and the > transformation is fine, or the call to memset is undefined behavior so > anything is fine (including the transformation). Unless you explicitly want > to catch the trap, I don't understand what you are saying. Could you detail > step by step where a well-defined behavior in the original program is turned > into a different behavior in the optimization? See this example: ('function' is same as above) void caller(void) { void* ptr = function(1); *(char*)ptr = 1; } In this case, calloc was called instead of (only) malloc because the 'if' was ignored, resulting in a suboptimized code (since calloc is usually slower than malloc alone). The resulting steps are: calloc(1) *ptr = 1; whereas I just wanted malloc(1) *ptr = 1; IMHO, the optimization should take the 'if' into account and only apply if it is the usual 'if (ptr != NULL)' pattern. (Additionally, it should check that the context caller function is not 'calloc' itself).