https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68952
Bug ID: 68952 Summary: Wrong code with AVX inline-asm in 32-bit mode Product: gcc Version: 6.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: inline-asm Assignee: unassigned at gcc dot gnu.org Reporter: jamrial at gmail dot com Target Milestone: --- Regression since GCC 4.9.0. -O0, -O1, -O2 and -O3 are all affected. -Os works as intended. float clipf(float a, float amin, float amax) { float ret; __asm__ ("vminss %1, %3, %0 \n\t" "vmaxss %2, %0, %0 \n\t" : "=x"(ret) : "xm"(a), "x"(amin), "x"(amax)); return ret; } gcc-trunk -O2 -mavx -m32 gcc-5.3 -O2 -mavx -m32 gcc-4.9.2 -O2 -mavx -m32 subl $4, %esp vmovss 16(%esp), %xmm1 vmovss 12(%esp), %xmm0 vminss 8(%esp), %xmm1, %xmm0 <--- amin overwritten vmaxss %xmm0, %xmm0, %xmm0 vmovss %xmm0, (%esp) flds (%esp) addl $4, %esp ret gcc-4.8.2 -O2 -mavx -m32 subl $4, %esp vmovss 16(%esp), %xmm1 vmovss 12(%esp), %xmm0 vminss 8(%esp), %xmm1, %xmm2 vmaxss %xmm0, %xmm2, %xmm2 vmovss %xmm2, (%esp) flds (%esp) addl $4, %esp ret gcc-trunk -Os -mavx -m32 gcc-5.3 -Os -mavx -m32 gcc-4.9.2 -Os -mavx -m32 pushl %ebp movl %esp, %ebp pushl %eax vmovss 16(%ebp), %xmm1 vmovss 12(%ebp), %xmm0 vminss 8(%ebp), %xmm1, %xmm2 vmaxss %xmm0, %xmm2, %xmm2 vmovss %xmm2, -4(%ebp) flds -4(%ebp) leave ret