rs6000.c (rs6000_emit_allocate_stack): Use correct alias set on MEM when saving stack...
authorPat Haugen <pthaugen@us.ibm.com>
Fri, 26 Sep 2008 14:31:57 +0000 (14:31 +0000)
committerPat Haugen <pthaugen@gcc.gnu.org>
Fri, 26 Sep 2008 14:31:57 +0000 (14:31 +0000)
2008-09-26  Pat Haugen  <pthaugen@us.ibm.com>

* 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
gcc/config/rs6000/rs6000.c
gcc/config/rs6000/rs6000.md

index 21c6216..d59b25b 100644 (file)
@@ -1,3 +1,9 @@
+2008-09-26  Pat Haugen  <pthaugen@us.ibm.com>
+
+       * 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  <dorit@il.ibm.com>
 
        PR tree-optimization/37574
index cdeb1c9..924fa9e 100644 (file)
@@ -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));
index d35e9d4..fb55fc0 100644 (file)
     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);