arm.c (arm_set_return_address): Mark the store as frame related, if any.
authorEric Botcazou <ebotcazou@adacore.com>
Sat, 8 Nov 2014 09:17:23 +0000 (09:17 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Sat, 8 Nov 2014 09:17:23 +0000 (09:17 +0000)
* config/arm/arm.c (arm_set_return_address): Mark the store as frame
related, if any.
(thumb_set_return_address): Likewise.

From-SVN: r217251

gcc/ChangeLog
gcc/config/arm/arm.c

index c2ec869..6bfc320 100644 (file)
@@ -1,3 +1,9 @@
+2014-11-08  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * config/arm/arm.c (arm_set_return_address): Mark the store as frame
+       related, if any.
+       (thumb_set_return_address): Likewise.
+
 2014-11-07  Jeff Law  <law@redhat.com>
 
        PR tree-optimization/61515
index cc005d6..0552952 100644 (file)
@@ -29012,7 +29012,11 @@ arm_set_return_address (rtx source, rtx scratch)
 
          addr = plus_constant (Pmode, addr, delta);
        }
-      emit_move_insn (gen_frame_mem (Pmode, addr), source);
+      /* The store needs to be marked as frame related in order to prevent
+        DSE from deleting it as dead if it is based on fp.  */
+      rtx insn = emit_move_insn (gen_frame_mem (Pmode, addr), source);
+      RTX_FRAME_RELATED_P (insn) = 1;
+      add_reg_note (insn, REG_CFA_RESTORE, gen_rtx_REG (Pmode, LR_REGNUM));
     }
 }
 
@@ -29064,7 +29068,11 @@ thumb_set_return_address (rtx source, rtx scratch)
       else
        addr = plus_constant (Pmode, addr, delta);
 
-      emit_move_insn (gen_frame_mem (Pmode, addr), source);
+      /* The store needs to be marked as frame related in order to prevent
+        DSE from deleting it as dead if it is based on fp.  */
+      rtx insn = emit_move_insn (gen_frame_mem (Pmode, addr), source);
+      RTX_FRAME_RELATED_P (insn) = 1;
+      add_reg_note (insn, REG_CFA_RESTORE, gen_rtx_REG (Pmode, LR_REGNUM));
     }
   else
     emit_move_insn (gen_rtx_REG (Pmode, LR_REGNUM), source);