------- Comment #2 from xuepeng dot guo at intel dot com 2009-02-12 08:35 ------- Confirmed at revision 144120. This is caused by macro CONDITIONAL_REGISTER_USAGE at i386.h. At the first the code
if (! TARGET_SSE) \ { \ int i; \ for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) \ if (TEST_HARD_REG_BIT (reg_class_contents[(int)SSE_REGS], i)) \ fixed_regs[i] = call_used_regs[i] = 1, reg_names[i] = ""; \ } set fixed_regs[27], fixed_regs[28], call_used_regs[27], call_used_regs[28] to 1. And then the code in the same macro if (TARGET_64BIT \ && ((cfun && cfun->machine->call_abi == MS_ABI) \ || (!cfun && DEFAULT_ABI == MS_ABI))) \ { \ int i; \ call_used_regs[4 /*RSI*/] = 0; \ call_used_regs[5 /*RDI*/] = 0; \ for (i = 0; i < 8; i++) \ call_used_regs[45+i] = 0; \ call_used_regs[27] = call_used_regs[28] = 0; \ } set call_used_regs[27], call_used_regs[28] to 0. This finally caused gcc_assert (!fixed_regs[i] || call_used_regs[i]). -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38891