https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82405
--- Comment #6 from Antony Polukhin <antoshkka at gmail dot com> --- > And I don't think you can reassociate here validly unless -ffast-math. But you can. In the isolated test case, instead of getting r*r at first, just move the constant into the xmm1 first and after that multiply it twice with r. Clang does that .LCPI0_0: .quad 4616189618054758400 # double 4 .quad 4614256447914709615 # double 3.1415000000000002 test_switch_native_slow(int, double): # @test_switch_native_slow(int, double) xor eax, eax cmp edi, 123 sete al movsd xmm1, qword ptr [8*rax + .LCPI0_0] # xmm1 = mem[0],zero mulsd xmm1, xmm0 mulsd xmm0, xmm1 ret Moreover, the current approach "multiply r twice and then multiply it on the constant" changes the observable behavior, such optimization could be enabled only with -ffast-math