https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71762
Bug ID: 71762 Summary: [4.9 Regression] ifcombine wrong codegen with uninitialized data Product: gcc Version: 4.9.4 Status: UNCONFIRMED Severity: normal Priority: P3 Component: middle-end Assignee: unassigned at gcc dot gnu.org Reporter: ibuclaw at gdcproject dot org Target Milestone: --- In the following minimal test built with: g++ -O2 --- #include <stdio.h> struct S { void* get() { return NULL; } ~S() { printf("dtor\n"); } }; void foo(void* x) { printf("foo\n"); } void testFunc(int len) { bool __cond59; bool __cond60; foo ((__cond60 = len > 1, __cond60) ? NULL : (__cond59 = len == 1, __cond59) ? S().get() : NULL); if (!__cond60) { if (__cond59) { printf("fail\n"); } } } void check(void (*dg)(int)) { dg(2); } int main() { check(&testFunc); } --- The optimizer simplifies the two if statements as: `if (__cond59 > __cond60)`, where __cond59 is never initialized in `testFunc`. This regression is only present in 4.9. gcc-4.8 and gcc-5 are unaffected. The commit that caused the regression was r204194, and it went away after r217496.