[backport gcc-4.7/trunk r172616 to fix PR target/43700 on MIPS ] gcc/ 2011-04-17 Richard Sandiford * config/mips/mips.c (mips_cfun_call_saved_reg_p): Handle global registers. gcc/testsuite/ 2011-04-17 Richard Sandiford * gcc.target/mips/reg-var-1.c: New test. --- gcc-4.6.0/gcc/config/mips/mips.c.~1~ 2011-03-08 21:51:11.000000000 +0100 +++ gcc-4.6.0/gcc/config/mips/mips.c 2011-04-17 21:28:06.000000000 +0200 @@ -9053,6 +9053,11 @@ mips_interrupt_extra_call_saved_reg_p (u static bool mips_cfun_call_saved_reg_p (unsigned int regno) { + /* If the user makes an ordinarily-call-saved register global, + that register is no longer call-saved. */ + if (global_regs[regno]) + return false; + /* Interrupt handlers need to save extra registers. */ if (cfun->machine->interrupt_handler_p && mips_interrupt_extra_call_saved_reg_p (regno)) --- gcc-4.6.0/gcc/testsuite/gcc.target/mips/reg-var-1.c.~1~ 1970-01-01 01:00:00.000000000 +0100 +++ gcc-4.6.0/gcc/testsuite/gcc.target/mips/reg-var-1.c 2011-04-17 21:28:06.000000000 +0200 @@ -0,0 +1,16 @@ +/* { dg-do run } */ +register int g asm ("$18"); + +void __attribute__((noinline)) +test (void) +{ + g = g + 1; +} + +int +main (void) +{ + g = 2; + test (); + return g != 3; +}