aboutsummaryrefslogtreecommitdiff
path: root/gcc/caller-save.c
diff options
context:
space:
mode:
authorH.J. Lu <hjl@gcc.gnu.org>2008-09-09 16:58:57 -0700
committerH.J. Lu <hjl@gcc.gnu.org>2008-09-09 16:58:57 -0700
commitc3c96e682fa283b5ea08faa30aa5eb2a93f08fd3 (patch)
tree68c6d2b63b5bca608049c29cc21f7a40607ee0b7 /gcc/caller-save.c
parenta26495282ef7adf3dd8ee3f5fc18149883e52e68 (diff)
downloadgcc-c3c96e682fa283b5ea08faa30aa5eb2a93f08fd3.zip
gcc-c3c96e682fa283b5ea08faa30aa5eb2a93f08fd3.tar.gz
gcc-c3c96e682fa283b5ea08faa30aa5eb2a93f08fd3.tar.bz2
re PR rtl-optimization/37435 (ICE with volatiles)
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
Diffstat (limited to 'gcc/caller-save.c')
-rw-r--r--gcc/caller-save.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/gcc/caller-save.c b/gcc/caller-save.c
index ee8a0dc..2d0925a 100644
--- a/gcc/caller-save.c
+++ b/gcc/caller-save.c
@@ -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);