http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60206
Bug ID: 60206 Summary: IVOPT has no idea of inline asm Product: gcc Version: 4.9.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: wmi at google dot com CC: rguenth at gcc dot gnu.org, shenhan at google dot com Host: i386 Target: i386 Created attachment 32141 --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=32141&action=edit Testcase This bug is found in google branch but I think the same problem also exists on trunk (but not exposed). For the testcase 1.c attached (1.c is extracted from libgcc/soft-fp/divtf3.c), use trunk compiler gcc-r202164 (Target: x86_64-unknown-linux-gnu) + the patch r204497 could expose the problem. The command: gcc -v -O2 -fno-omit-frame-pointer -fpic -c -S -m32 1.c The error: ./1.c: In function ‘__divtf3’: ./1.c:64:1194: error: ‘asm’ operand has impossible constraints The inline asm in error message is as follow: do { __asm__ ( "sub{l} {%11,%3|%3,%11}\n\t" "sbb{l} {%9,%2|%2,%9}\n\t" "sbb{l} {%7,%1|%1,%7}\n\t" "sbb{l} {%5,%0|%0,%5}" : "=r" ((USItype) (A_f[3])), "=&r" ((USItype) (A_f[2])), "=&r" ((USItype) (A_f[1])), "=&r" ((USItype) (A_f[0])) : "0" ((USItype) (B_f[2])), "g" ((USItype) (A_f[2])), "1" ((USItype) (B_f[1])), "g" ((USItype) (A_f[1])), "2" ((USItype) (B_f[0])), "g" ((USItype) (A_f[0])), "3" ((USItype) (0)), "g" ((USItype) (_n_f[_i]))); } while () Because -fno-omit-frame-pointer is turned on and the command line uses -fpic, there are only 5 registers for register allocation. Before IVOPT, %0, %1, %2, %3 require 4 registers. The index variable i of _n_f[_i] requires another register. So 5 registers are used up here. After IVOPT, MEM reference _n_f[_i] is converted to MEM[base: _874, index: ivtmp.22_821, offset: 0B]. base and index require 2 registers, Now 6 registers are required, so LRA cannot find enough registers to allocate. trunk compiler doesn't expose the problem because of patch r202165. With patch r202165, IVOPT doesn't change _n_f[_i] in inline asm above. But it just hided the problem. Should IVOPT care about the constraints in inline-asm and restrict its optimization in some case?