https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78090
Bug ID: 78090 Summary: [x86_64]: GCC allows integer register for inter unit conversion under -mtune-ctrl=^inter_unit_conversions . Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: rtl-optimization Assignee: unassigned at gcc dot gnu.org Reporter: venkataramanan.kumar at amd dot com Target Milestone: --- GCC is not honoring -mtune-ctrl=^inter_unit_conversions and allows integer register -O2 -mtune-ctrl=^inter_unit_conversions or -O2 -march=bdver4 gcc version 7.0.0 20161020 (experimental) (GCC) --- test case-- void test(float); int main(int a, int b) { if(a == 1) { return 1; } if (b==1) { return 1; } test((float)a); return 0; } ----- Assembly (snip) main: .LFB0: .cfi_startproc cmpl $1, %esi je .L3 cmpl $1, %edi je .L3 pxor %xmm0, %xmm0 subq $8, %rsp .cfi_def_cfa_offset 16 cvtsi2ss %edi, %xmm0 <== %edi should go via stack. call test xorl %eax, %eax popq %rdx .cfi_def_cfa_offset 8 ret .L3: movl $1, %eax ret (snip) The optimization is honored when modifying return value in branches void test(float); int main(int a, int b) { if(a == 1) { return -1; } if (b==1) { return -1; } test((float)a); return 0; } ---snip-- main: .LFB0: .cfi_startproc cmpl $1, %esi je .L3 cmpl $1, %edi je .L3 pxor %xmm0, %xmm0 subq $24, %rsp .cfi_def_cfa_offset 32 movl %edi, 12(%rsp) cvtsi2ss 12(%rsp), %xmm0 call test xorl %eax, %eax addq $24, %rsp .cfi_def_cfa_offset 8 ret .L3: orl $-1, %eax ret ---snip--