diff options
author | Alan Modra <amodra@bigpond.net.au> | 2007-10-20 13:11:14 +0000 |
---|---|---|
committer | Alan Modra <amodra@gcc.gnu.org> | 2007-10-20 22:41:14 +0930 |
commit | 554c2941e0c1f3e3b312b19c42bf0eb57d9033c8 (patch) | |
tree | 7d355bcb1a828747f54336005dd7f4ef853e76d1 /gcc | |
parent | 70365b5c3d02f224299cd40fb48959eec8d9e020 (diff) | |
download | gcc-554c2941e0c1f3e3b312b19c42bf0eb57d9033c8.zip gcc-554c2941e0c1f3e3b312b19c42bf0eb57d9033c8.tar.gz gcc-554c2941e0c1f3e3b312b19c42bf0eb57d9033c8.tar.bz2 |
re PR target/33812 (ICE from epilogue vrsave code)
PR target/33812
* config/rs6000/rs6000.c (rs6000_emit_epilogue): Revert 2007-05-16
change for vrsave, ie restore after frame pop.
From-SVN: r129511
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 30 |
2 files changed, 21 insertions, 15 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2b16d94..0c7b102 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2007-10-20 Alan Modra <amodra@bigpond.net.au> + + PR target/33812 + * config/rs6000/rs6000.c (rs6000_emit_epilogue): Revert 2007-05-16 + change for vrsave, ie restore after frame pop. + 2007-10-19 David S. Miller <davem@davemloft.net> * config/sparc/niagara2.md: Fix copyright notice. diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 0415e44..024eda7 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -16082,21 +16082,6 @@ rs6000_emit_epilogue (int sibcall) } } - /* Restore VRSAVE if needed. */ - if (TARGET_ALTIVEC && TARGET_ALTIVEC_VRSAVE - && info->vrsave_mask != 0) - { - rtx addr, mem, reg; - - addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, - GEN_INT (info->vrsave_save_offset + sp_offset)); - mem = gen_frame_mem (SImode, addr); - reg = gen_rtx_REG (SImode, 12); - emit_move_insn (reg, mem); - - emit_insn (generate_set_vrsave (reg, info, 1)); - } - /* If we have a frame pointer, a call to alloca, or a large stack frame, restore the old stack pointer using the backchain. Otherwise, we know what size to update it with. */ @@ -16123,6 +16108,21 @@ rs6000_emit_epilogue (int sibcall) sp_offset = 0; } + /* Restore VRSAVE if needed. */ + if (TARGET_ALTIVEC && TARGET_ALTIVEC_VRSAVE + && info->vrsave_mask != 0) + { + rtx addr, mem, reg; + + addr = gen_rtx_PLUS (Pmode, frame_reg_rtx, + GEN_INT (info->vrsave_save_offset + sp_offset)); + mem = gen_frame_mem (SImode, addr); + reg = gen_rtx_REG (SImode, 12); + emit_move_insn (reg, mem); + + emit_insn (generate_set_vrsave (reg, info, 1)); + } + /* Get the old lr if we saved it. */ if (info->lr_save_p) { |