https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71558
Bug ID: 71558 Summary: missed optimization for type short, char and floating point types Product: gcc Version: 6.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: denis.campredon at gmail dot com Target Milestone: --- for the following code gcc should produce the same code for fun and fun2, but fail for shorts and char with -01 and higher. It also fails for floating types with -0fast ----------------- #define optimize(type) \ type fun(type i, type j) \ { \ return i + j; \ } \ type fun2(type i, type j) \ { \ if (j == 0) \ return i; \ else if (i == 0) \ return j; \ else \ return i + j; \ } optimize(int); optimize(char); optimize(short); -------------------- For all types the optimization is no longer performed if any type is different from the other -------------------- int fun2(unsigned i, int j) { if (i == 0) return j; else if (j == 0) return i; else return i + j; } -------------------- And if we are testing if both i and j are 0 the optimization is no longer performed ------------------ int fun2(int i, int j) { if (i == 0 && j == 0) return j; //or "return i + j;" or "return 0;" or "return i;" if (i == 0) return j; else if (j == 0) return i; else return i + j; } ------------------- It also fails if one replace the addition with a subtraction or a multiplication (with changed return values.)