From: Alan Modra Date: Sat, 20 Oct 2007 13:11:14 +0000 (+0000) Subject: re PR target/33812 (ICE from epilogue vrsave code) X-Git-Tag: releases/gcc-4.3.0~1910 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=554c2941e0c1f3e3b312b19c42bf0eb57d9033c8;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2b16d94bb820..0c7b1026afad 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2007-10-20 Alan Modra + + 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 * config/sparc/niagara2.md: Fix copyright notice. diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 0415e44c5669..024eda782c86 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) {