diff options
author | H.J. Lu <hjl@gcc.gnu.org> | 2008-09-09 16:58:57 -0700 |
---|---|---|
committer | H.J. Lu <hjl@gcc.gnu.org> | 2008-09-09 16:58:57 -0700 |
commit | c3c96e682fa283b5ea08faa30aa5eb2a93f08fd3 (patch) | |
tree | 68c6d2b63b5bca608049c29cc21f7a40607ee0b7 /gcc/caller-save.c | |
parent | a26495282ef7adf3dd8ee3f5fc18149883e52e68 (diff) | |
download | gcc-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.c | 10 |
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); |