https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112819
Bug ID: 112819 Summary: rearrange branches to improve code generation Product: gcc Version: 14.0 Status: UNCONFIRMED Keywords: missed-optimization Severity: enhancement Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: pinskia at gcc dot gnu.org Target Milestone: --- Take: ``` bool src(char *a, int l) { if(l < 1) { return false; } if(*a != 'a') { return false; } if(l < 2) { return false; } return true; } bool tgt(char *a, int l) { if(l < 1) { return false; } if(l < 2) { return false; } if(*a != 'a') { return false; } return true; } ``` You would expect these 2 to produce both the same code but only tgt produces decent code. That is because we can merge `l < 1` with `l < 2` into just `l < 2` (or `l <= 1`). This might be an reassociation problem or something else.