The attached program causes spill failure on latest 4.5 branch with -mthumb

it fails when no -O<n> is used and works when -Os/-O2 is used but fails again
when -fno-omit-frame-pointer is passed in addition to -Os or -O2

 arm-oe-linux-uclibceabi-gcc -mthumb -Os -fno-omit-frame-pointer recvfrom.i 
recvfrom.i: In function '__libc_recvfrom':
recvfrom.i:5:9: error: unable to find a register to spill in class 'LO_REGS'
recvfrom.i:5:9: error: this is the insn:
(insn 73 19 74 2 recvfrom.i:5 (set (reg:SI 12 ip [150])
        (const_int 146 [0x92])) 167 {*thumb1_movsi_insn} (expr_list:REG_EQUAL
(const_int 146 [0x92])
        (nil)))
recvfrom.i:5: confused by earlier errors, bailing out


here is the test case
extern __thread int __libc_errno __attribute__ ((tls_model ("initial-exec")));
int __libc_recvfrom(
 int sockfd, void * buffer, int len, int flags, void * to, void * tolen) { 
return (int)({ 
        unsigned int _inline_sys_result = ({ unsigned int _internal_sys_result;
{ int _sys_buf[2]; register int _a1 __asm__ ("a1"); register int *_v3 __asm__
("v3") = _sys_buf; int _v2tmp = (int) (tolen); int _v1tmp = (int) (to); int
_a4tmp = (int) (flags); int _a3tmp = (int) (len); int _a2tmp = (int) (buffer);
int _a1tmp = (int) (sockfd); _a1 = _a1tmp; register int _a2 __asm__ ("a2") =
_a2tmp; register int _a3 __asm__ ("a3") = _a3tmp; register int _a4 __asm__
("a4") = _a4tmp; register int _v1 __asm__ ("v1") = _v1tmp; register int _v2
__asm__ ("v2") = _v2tmp; *_v3 = (int) (((0 +292))); __asm__ __volatile__ ("str 
      r7, [v3, #4]\n" "\tldr      r7, [v3]\n" "\tswi      0       @ syscall "
"SYS_ify(__libc_recvfrom)" "\n" "\tldr      r7, [v3, #4]" : "=r" (_a1) : "r"
(_v3) , "r" (_a1), "r" (_a2), "r" (_a3), "r" (_a4), "r" (_v1), "r" (_v2) :
"memory"); _internal_sys_result = _a1; } (int) _internal_sys_result; }); if
(__builtin_expect (((unsigned int) (_inline_sys_result) >= 0xfffff001u), 0)) {
(__libc_errno = ((-(_inline_sys_result)))); _inline_sys_result = (unsigned int)
-1; } (int) _inline_sys_result; }); }


-- 
           Summary: Thumb ICE due to spill failure
           Product: gcc
           Version: 4.5.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: raj dot khem at gmail dot com
 GCC build triplet: x86_64-linux
  GCC host triplet: x86_64-linux
GCC target triplet: arm-oe-linux-uclibceabi


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44860

Reply via email to