https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67979
Bug ID: 67979 Summary: dead code elimination deleted the predicated branch within the function block. Product: gcc Version: 4.9.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: feqin1023 at gmail dot com Target Milestone: --- Created attachment 36518 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=36518&action=edit the source test dead code elimination. if i have this input: /*--------------------test.c----------------------------*/ void bar_i(int); void foo(int *x) { int y = *x; // dead code can be clean if (!x) return; // this branch ALSO will be clean bar_i(y); } /*------------------------------------------------------*/ we call gcc like this: gcc -O2 -S test.c the the whole branch in function foo(int *) will be clean. BUT, if foo(int *) is called like this: foo(NULL); gcc has CHANGED the original semantic even sometimes which is error. but compiler can do this? I also test Clang, Clang ALWAYS keep the branch in foo(int *).