------- Comment #5 from ubizjak at gmail dot com 2010-08-17 06:57 ------- (In reply to comment #3)
> Here's another example of valid gnu99 code: > > register long double F80a __asm__("st"); > register long double F80b __asm__("st(1)"); > > void x87_add() { > F80a += F80b; > } > > int main() { > return 0; > } > > This does not ICE at -O3. How does one construct this code if you reject st? The code does not do what you think should be doing: x87_add: .LFB0: .cfi_startproc flds .LC0(%rip) flds .LC0(%rip) faddp %st, %st(1) flds .LC0(%rip) fstp %st(0) fstp %st(0) ret I'm testing following patch: Index: reginfo.c =================================================================== --- reginfo.c (revision 163291) +++ reginfo.c (working copy) @@ -798,6 +798,14 @@ fix_register (const char *name, int fixe void globalize_reg (int i) { +#ifdef STACK_REGS + if (IN_RANGE (i, FIRST_STACK_REG, LAST_STACK_REG)) + { + error ("stack register used for global register variable"); + return; + } +#endif + if (fixed_regs[i] == 0 && no_global_reg_vars) error ("global register variable follows a function definition"); -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45296