OSDN Git Service

* caller-save.c (reg_save_code): After HARD_REGNO_MODE_OK check fails,
authoramylaar <amylaar@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 8 Nov 2010 15:07:32 +0000 (15:07 +0000)
committeramylaar <amylaar@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 8 Nov 2010 15:07:32 +0000 (15:07 +0000)
assert that REG is a hard register number before using it as an index.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@166434 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/caller-save.c

index 963cfe0..bd2529c 100644 (file)
@@ -1,3 +1,8 @@
+2010-11-08  Joern Rennecke  <amylaar@spamcop.net>
+
+       * caller-save.c (reg_save_code): After HARD_REGNO_MODE_OK check fails,
+       assert that REG is a hard register number before using it as an index.
+
 2010-11-08  Eric Botcazou  <ebotcazou@adacore.com>
 
        PR target/46208
index 9ca8592..e10681c 100644 (file)
@@ -116,11 +116,15 @@ reg_save_code (int reg, enum machine_mode mode)
   if (cached_reg_save_code[reg][mode])
      return cached_reg_save_code[reg][mode];
   if (!HARD_REGNO_MODE_OK (reg, mode))
-     {
-       cached_reg_save_code[reg][mode] = -1;
-       cached_reg_restore_code[reg][mode] = -1;
-       return -1;
-     }
+    {
+      /* Depending on how HARD_REGNO_MODE_OK is defined, range propagation
+        might deduce here that reg >= FIRST_PSEUDO_REGISTER.  So the assert
+        below silences a warning.  */
+      gcc_assert (reg < FIRST_PSEUDO_REGISTER);
+      cached_reg_save_code[reg][mode] = -1;
+      cached_reg_restore_code[reg][mode] = -1;
+      return -1;
+    }
 
   /* Update the register number and modes of the register
      and memory operand.  */