https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99930
Bug ID: 99930 Summary: Failure to optimize floating point -abs(x) in nontrivial code at -O2/3 Product: gcc Version: 11.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: core13 at gmx dot net Target Milestone: --- Expected compiler output for -abs(x) is an orps setting the sign bit. It works as expected with trivial code at -O1/2/3 optimization levels: float q(float p) { return -std::abs(p); } orps xmm0, XMMWORD PTR .LC1[rip] ret With more complex code the compiler uses orps at -O1 but andps + xorps at -O2/3: bool t(float n[2], float m) { for (int i = 0; i < 2; i++) if (m > -std::abs(n[i])) return true; return false; } -O1 movss xmm1, DWORD PTR [rdi] orps xmm1, XMMWORD PTR .LC1[rip] comiss xmm0, xmm1 ja .L3 movss xmm1, DWORD PTR [rdi+4] orps xmm1, XMMWORD PTR .LC1[rip] comiss xmm0, xmm1 seta al ret -O2/3 movss xmm1, DWORD PTR [rdi] movss xmm3, DWORD PTR .LC0[rip] movss xmm2, DWORD PTR .LC1[rip] andps xmm1, xmm3 xorps xmm1, xmm2 comiss xmm0, xmm1 ja .L3 movss xmm1, DWORD PTR [rdi+4] andps xmm1, xmm3 xorps xmm1, xmm2 comiss xmm0, xmm1 seta al ret https://godbolt.org/z/5ch5ceEj7