http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42145
Manuel López-Ibáñez <manu at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|RESOLVED |NEW Known to work| | Keywords| |diagnostic Last reconfirmed| |2013-11-19 Component|regression |tree-optimization Blocks| |24639 Resolution|DUPLICATE |--- Ever confirmed|0 |1 Known to fail| | --- Comment #4 from Manuel López-Ibáñez <manu at gcc dot gnu.org> --- PR20968 was closed, but this one is still valid in some cases. In particular this testcase with -Os produces a warning. int translate(int in); int main(int argc, char* argv[]) { int ret; if (argc) ret = translate(5); if (!argc || !ret) ret = 1; return ret; } The reason is that with -Os, the check "if (!argc || !ret)" is transformed into: # ret_1 = PHI <ret_5(D)(2), [pr19085.c : 8:9] ret_8(3)> # .MEM_3 = PHI <.MEM_6(D)(2), .MEM_7(3)> [pr19085.c : 10:7] # RANGE [0, 1] _9 = argc_4(D) == 0; [pr19085.c : 10:16] # RANGE [0, 1] _10 = ret_1 == 0; [pr19085.c : 10:13] # RANGE [0, 1] _11 = _10 | _9; [pr19085.c : 10:6] if (_11 != 0)