When building g++.dg/torture/pr36445.C at -O2 you can see call _Z5func2v movaps %xmm0, (%rsp) movq (%rsp), %rdx movq 8(%rsp), %rax movq %rdx, 16(%rsp) movl %eax, 24(%rsp)
where the stack-slot spills are caused by (insn 26 5 27 2 (set (reg:V4SF 72) (reg:V4SF 21 xmm0)) /space/rguenther/src/svn/trunk/gcc/testsuite/g++.dg/torture/pr36445.C:20 1054 {*movv4sf_internal} (nil)) (insn 27 26 28 2 (set (reg:DI 70 [ D.2130 ]) (subreg:DI (reg:V4SF 72) 0)) /space/rguenther/src/svn/trunk/gcc/testsuite/g++.dg/torture/pr36445.C:20 61 {*movdi_internal_rex64} (nil)) (insn 28 27 24 2 (set (reg:DI 71 [ D.2130+8 ]) (subreg:DI (reg:V4SF 72) 8)) /space/rguenther/src/svn/trunk/gcc/testsuite/g++.dg/torture/pr36445.C:20 61 {*movdi_internal_rex64} (nil)) where we are unable to verify the constraints for insn 28 because there is no move pattern that would special case hipart extraction (which could use movhps). -- Summary: Unnecessary spill slot for highpart extraction of xmm reg Product: gcc Version: 4.6.0 Status: UNCONFIRMED Keywords: missed-optimization Severity: enhancement Priority: P3 Component: target AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: rguenth at gcc dot gnu dot org GCC target triplet: x86-64-*-* http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45198