https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98647
Bug ID: 98647 Summary: Failure to optimize out convertion from float to vector type Product: gcc Version: 11.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: gabravier at gmail dot com Target Milestone: --- float f(float val) { return _mm_cvtss_f32(_mm_and_ps(_mm_set_ss(val), _mm_castsi128_ps(_mm_set1_epi32(0x7fffffff)))); } This can be optimized to avoid the conversions in the emitted assembly code. This optimization is done by LLVM, but not by GCC. LLVM code generation : .LCPI1_0: .long 0x7fffffff # float NaN .long 0x7fffffff # float NaN .long 0x7fffffff # float NaN .long 0x7fffffff # float NaN f(float): # @f(float) andps xmm0, xmmword ptr [rip + .LCPI1_0] ret GCC code generation : f(float): pxor xmm1, xmm1 movss xmm1, xmm0 movaps xmm0, XMMWORD PTR .LC1[rip] andps xmm0, xmm1 ret .LC1: .long 2147483647 .long 2147483647 .long 2147483647 .long 2147483647