]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/43700 (global register variables defect)
authorRichard Sandiford <rdsandiford@googlemail.com>
Sun, 29 May 2011 17:51:03 +0000 (17:51 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Sun, 29 May 2011 17:51:03 +0000 (17:51 +0000)
gcc/
PR target/43700
* config/mips/mips.c (mips_cfun_call_saved_reg_p): Handle global
registers.

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

From-SVN: r174408

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 996e0d916dac3325d6776cd4f52d5d0d4344d9dc..053b6d1c67e13834f801795a5e94c7d460d6caa8 100644 (file)
@@ -1,3 +1,9 @@
+2011-05-29  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       PR target/43700
+       * config/mips/mips.c (mips_cfun_call_saved_reg_p): Handle global
+       registers.
+
 2011-05-29  Richard Sandiford  <rdsandiford@googlemail.com>
 
        PR target/43995
index d3c0709074e96b7fe4a0763b268aee8d743a2996..fd9e4b39c59a8353178cab9f38913af66b629110 100644 (file)
@@ -9007,6 +9007,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 7763aa8515df21fa04c622d3f011ed5c4c8190da..7d23efe076913d931d2a5e1a770c620949285459 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-25  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/49133
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;
+}