From 16044a800cfb1d6dd796bc094926a2c3b4c89db1 Mon Sep 17 00:00:00 2001 From: Pat Haugen Date: Fri, 26 Sep 2008 14:31:57 +0000 Subject: [PATCH] rs6000.c (rs6000_emit_allocate_stack): Use correct alias set on MEM when saving stack pointer. 2008-09-26 Pat Haugen * config/rs6000/rs6000.c (rs6000_emit_allocate_stack): Use correct alias set on MEM when saving stack pointer. * config/rs6000/rs6000.md (allocate_stack): Likewise From-SVN: r140693 --- gcc/ChangeLog | 6 ++++++ gcc/config/rs6000/rs6000.c | 16 +++++++++++++++- gcc/config/rs6000/rs6000.md | 24 +++++++++++++++++++++--- 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 21c62160ba1..d59b25b50f3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2008-09-26 Pat Haugen + + * config/rs6000/rs6000.c (rs6000_emit_allocate_stack): Use correct + alias set on MEM when saving stack pointer. + * config/rs6000/rs6000.md (allocate_stack): Likewise + 2008-09-26 Dorit Nuzman PR tree-optimization/37574 diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index cdeb1c9c500..924fa9e5954 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -15438,6 +15438,8 @@ rs6000_emit_allocate_stack (HOST_WIDE_INT size, int copy_r12, int copy_r11) if (TARGET_UPDATE) { + rtx par, set, mem; + if (size > 32767) { /* Need a note here so that try_split doesn't get confused. */ @@ -15453,13 +15455,25 @@ rs6000_emit_allocate_stack (HOST_WIDE_INT size, int copy_r12, int copy_r11) todec, stack_reg) : gen_movdi_di_update (stack_reg, stack_reg, todec, stack_reg)); + /* Since we didn't use gen_frame_mem to generate the MEM, grab + it now and set the alias set/attributes. The above gen_*_update + calls will generate a PARALLEL with the MEM set being the first + operation. */ + par = PATTERN (insn); + gcc_assert (GET_CODE (par) == PARALLEL); + set = XVECEXP (par, 0, 0); + gcc_assert (GET_CODE (set) == SET); + mem = SET_DEST (set); + gcc_assert (MEM_P (mem)); + MEM_NOTRAP_P (mem) = 1; + set_mem_alias_set (mem, get_frame_alias_set ()); } else { insn = emit_insn (TARGET_32BIT ? gen_addsi3 (stack_reg, stack_reg, todec) : gen_adddi3 (stack_reg, stack_reg, todec)); - emit_move_insn (gen_rtx_MEM (Pmode, stack_reg), + emit_move_insn (gen_frame_mem (Pmode, stack_reg), copy_r11 ? gen_rtx_REG (Pmode, 11) : gen_rtx_REG (Pmode, 12)); diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index d35e9d4eac2..fb55fc00962 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -10340,14 +10340,32 @@ neg_op0 = GEN_INT (- INTVAL (operands[1])); if (TARGET_UPDATE) - emit_insn ((* ((TARGET_32BIT) ? gen_movsi_update : gen_movdi_di_update)) - (stack_pointer_rtx, stack_pointer_rtx, neg_op0, chain)); + { + rtx insn, par, set, mem; + + insn = emit_insn ((* ((TARGET_32BIT) ? gen_movsi_update + : gen_movdi_di_update)) + (stack_pointer_rtx, stack_pointer_rtx, neg_op0, + chain)); + /* Since we didn't use gen_frame_mem to generate the MEM, grab + it now and set the alias set/attributes. The above gen_*_update + calls will generate a PARALLEL with the MEM set being the first + operation. */ + par = PATTERN (insn); + gcc_assert (GET_CODE (par) == PARALLEL); + set = XVECEXP (par, 0, 0); + gcc_assert (GET_CODE (set) == SET); + mem = SET_DEST (set); + gcc_assert (MEM_P (mem)); + MEM_NOTRAP_P (mem) = 1; + set_mem_alias_set (mem, get_frame_alias_set ()); + } else { emit_insn ((* ((TARGET_32BIT) ? gen_addsi3 : gen_adddi3)) (stack_pointer_rtx, stack_pointer_rtx, neg_op0)); - emit_move_insn (gen_rtx_MEM (Pmode, stack_pointer_rtx), chain); + emit_move_insn (gen_frame_mem (Pmode, stack_pointer_rtx), chain); } emit_move_insn (operands[0], virtual_stack_dynamic_rtx);