]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR rtl-optimization/37435 (ICE with volatiles)
authorH.J. Lu <hjl@gcc.gnu.org>
Tue, 9 Sep 2008 23:58:57 +0000 (16:58 -0700)
committerH.J. Lu <hjl@gcc.gnu.org>
Tue, 9 Sep 2008 23:58:57 +0000 (16:58 -0700)
gcc/

2008-09-09  Vladimir Makarov  <vmakarov@redhat.com>

PR rtl-optimization/37435
* caller-save.c (insert_restore, insert_save): Check the mode by
reg_save_code.

gcc/testsuite/

2008-09-09  H.J. Lu  <hongjiu.lu@intel.com>

PR rtl-optimization/37435
* gcc.dg/dfp/pr37435.c: New.

From-SVN: r140184

gcc/ChangeLog
gcc/caller-save.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/dfp/pr37435.c [new file with mode: 0644]

index 7178941e146312da07cbaedac1d34ba23b66427a..d07d85d0e2913291b117255b2d8088e80ce9248d 100644 (file)
@@ -1,3 +1,9 @@
+2008-09-09  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR rtl-optimization/37435
+       * caller-save.c (insert_restore, insert_save): Check the mode by
+       reg_save_code.
+
 2008-09-09  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
 
        PR other/37265
index ee8a0dc663122c867ba8a2374dc3f7b19c1dea80..2d0925a4686e9c04623bcad92adeb335e592b416 100644 (file)
@@ -1067,7 +1067,10 @@ insert_restore (struct insn_chain *chain, int before_p, int regno,
   mem = regno_save_mem [regno][numregs];
   if (save_mode [regno] != VOIDmode
       && save_mode [regno] != GET_MODE (mem)
-      && numregs == (unsigned int) hard_regno_nregs[regno][save_mode [regno]])
+      && numregs == (unsigned int) hard_regno_nregs[regno][save_mode [regno]]
+      /* Check that insn to restore REGNO in save_mode[regno] is
+        correct.  */
+      && reg_save_code (regno, save_mode[regno]) >= 0)
     mem = adjust_address (mem, save_mode[regno], 0);
   else
     mem = copy_rtx (mem);
@@ -1145,7 +1148,10 @@ insert_save (struct insn_chain *chain, int before_p, int regno,
   mem = regno_save_mem [regno][numregs];
   if (save_mode [regno] != VOIDmode
       && save_mode [regno] != GET_MODE (mem)
-      && numregs == (unsigned int) hard_regno_nregs[regno][save_mode [regno]])
+      && numregs == (unsigned int) hard_regno_nregs[regno][save_mode [regno]]
+      /* Check that insn to save REGNO in save_mode[regno] is
+        correct.  */
+      && reg_save_code (regno, save_mode[regno]) >= 0)
     mem = adjust_address (mem, save_mode[regno], 0);
   else
     mem = copy_rtx (mem);
index 6e14ee51bd9c5e91815436528e02058545e4655b..4f1f9e07a7328baa6c2ac83bda5fc7da30cf875e 100644 (file)
@@ -1,3 +1,8 @@
+2008-09-09  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR rtl-optimization/37435
+       * gcc.dg/dfp/pr37435.c: New.
+
 2008-09-09  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/37417
diff --git a/gcc/testsuite/gcc.dg/dfp/pr37435.c b/gcc/testsuite/gcc.dg/dfp/pr37435.c
new file mode 100644 (file)
index 0000000..98acc9c
--- /dev/null
@@ -0,0 +1,11 @@
+/* { dg-do compile { target fpic } } */
+/* { dg-options "-std=gnu99 -O2 -fPIC" } */
+
+volatile _Decimal32 d;
+volatile int i;
+
+void foo()
+{
+  d += i;
+  d += i;
+}