https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71026
Bug ID: 71026 Summary: Missing division optimizations Product: gcc Version: 7.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: wdijkstr at arm dot com Target Milestone: --- With -Ofast GCC doesn't reassociate constant multiplies or negates away from divisors to allow for more reciprocal division optimizations. It is also possible to avoid divisions (or multiplies) involving immediates in comparisons that check for a positive/negative result. float f1(float x, float y) { return x / (y * y); } // -> x * (1/y) * (1/y) float f2(float x, float y) { return x / (y * 3.0f); } // -> (x/3) / y float f3(float x, float y) { return x / -y; } // -> (-x) / y int f4(float x) { return (1.0f / x) < 0.0f; } // -> x < 0.0f int f5(float x) { return (x / 2.0f) <= 0.0f; } // -> x <= 0.0f A quick experiment shows the first transformation could remove almost 100 divisions from SPEC2006, the 2nd 50. The first transformation is only useful if there is at least one other division by y, so likely best done in the division reciprocal optimization phase.