OSDN Git Service

gcc/
authorrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 29 May 2011 17:48:14 +0000 (17:48 +0000)
committerrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 29 May 2011 17:48:14 +0000 (17:48 +0000)
* config/mips/mips.c (mips_cfun_call_saved_reg_p): Handle global
registers.

gcc/testsuite/
* gcc.target/mips/reg-var-1.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_6-branch@174405 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/mips/mips.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/mips/reg-var-1.c [new file with mode: 0644]

index 32933d9..083dfd4 100644 (file)
@@ -1,5 +1,10 @@
 2011-05-29  Richard Sandiford  <rdsandiford@googlemail.com>
 
+       * config/mips/mips.c (mips_cfun_call_saved_reg_p): Handle global
+       registers.
+
+2011-05-29  Richard Sandiford  <rdsandiford@googlemail.com>
+
        PR target/43995
        * config/mips/mips.c (mips_pic_call_symbol_from_set): Add a
        recurse_p argument.  Only follow register copies if it is set,
index 027fc2d..8069a0b 100644 (file)
@@ -9053,6 +9053,11 @@ mips_interrupt_extra_call_saved_reg_p (unsigned int regno)
 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))
index d32e95a..2f50595 100644 (file)
@@ -1,3 +1,7 @@
+2011-05-29  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       * gcc.target/mips/reg-var-1.c: New test.
+
 2011-05-29  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/49217
diff --git a/gcc/testsuite/gcc.target/mips/reg-var-1.c b/gcc/testsuite/gcc.target/mips/reg-var-1.c
new file mode 100644 (file)
index 0000000..d8b8118
--- /dev/null
@@ -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;
+}