aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2019-07-12 10:15:39 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2019-07-12 10:15:39 +0000
commit49dbd6a0325f510af43b05bc0b91426779b4ed59 (patch)
tree219431365adbc550268ee861300f0c8b2fa5556b
parent831e688af50c5f77a2daa3cd3bfd0f27d54d5d72 (diff)
downloadgcc-49dbd6a0325f510af43b05bc0b91426779b4ed59.zip
gcc-49dbd6a0325f510af43b05bc0b91426779b4ed59.tar.gz
gcc-49dbd6a0325f510af43b05bc0b91426779b4ed59.tar.bz2
re PR rtl-optimization/91136 (incorrect move of instruction to delay slot causes application crash in exception handling)
PR rtl-optimization/91136 * df-core.c (ACCESSING REFS): Fix typos in comment. * resource.c (mark_target_live_reg): Add artificial defs that occur at the beginning of the block to the initial set of live registers. From-SVN: r273436
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/df-core.c6
-rw-r--r--gcc/resource.c4
3 files changed, 14 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index bd47ddd..7f01af3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2019-07-12 Eric Botcazou <ebotcazou@adacore.com>
+
+ PR rtl-optimization/91136
+ * df-core.c (ACCESSING REFS): Fix typos in comment.
+ * resource.c (mark_target_live_reg): Add artificial defs that occur at
+ the beginning of the block to the initial set of live registers.
+
2019-07-12 Richard Biener <rguenther@suse.de>
* fold-const.h (get_array_ctor_element_at_index): Adjust.
diff --git a/gcc/df-core.c b/gcc/df-core.c
index 44848aa..be19aba 100644
--- a/gcc/df-core.c
+++ b/gcc/df-core.c
@@ -298,12 +298,12 @@ There are 4 ways to obtain access to refs:
Artificial defs and uses occur both at the beginning and ends of blocks.
- For blocks that area at the destination of eh edges, the
+ For blocks that are at the destination of eh edges, the
artificial uses and defs occur at the beginning. The defs relate
to the registers specified in EH_RETURN_DATA_REGNO and the uses
- relate to the registers specified in ED_USES. Logically these
+ relate to the registers specified in EH_USES. Logically these
defs and uses should really occur along the eh edge, but there is
- no convenient way to do this. Artificial edges that occur at the
+ no convenient way to do this. Artificial defs that occur at the
beginning of the block have the DF_REF_AT_TOP flag set.
Artificial uses occur at the end of all blocks. These arise from
diff --git a/gcc/resource.c b/gcc/resource.c
index f8a23ed..c4bcfd7 100644
--- a/gcc/resource.c
+++ b/gcc/resource.c
@@ -987,9 +987,13 @@ mark_target_live_regs (rtx_insn *insns, rtx target_maybe_return, struct resource
{
regset regs_live = DF_LR_IN (BASIC_BLOCK_FOR_FN (cfun, b));
rtx_insn *start_insn, *stop_insn;
+ df_ref def;
/* Compute hard regs live at start of block. */
REG_SET_TO_HARD_REG_SET (current_live_regs, regs_live);
+ FOR_EACH_ARTIFICIAL_DEF (def, b)
+ if (DF_REF_FLAGS (def) & DF_REF_AT_TOP)
+ SET_HARD_REG_BIT (current_live_regs, DF_REF_REGNO (def));
/* Get starting and ending insn, handling the case where each might
be a SEQUENCE. */