diff options
author | Bernd Schmidt <bernds@redhat.co.uk> | 2000-11-24 17:40:09 +0000 |
---|---|---|
committer | Bernd Schmidt <bernds@gcc.gnu.org> | 2000-11-24 17:40:09 +0000 |
commit | ff6534ad165fa1e463d001240f14709327b27b1e (patch) | |
tree | 0b623f3cbe02997e8644f25b4cc6df8c34e3987b /gcc | |
parent | 176f9a7b1c1a668cde299dc350b949c88658b84c (diff) | |
download | gcc-ff6534ad165fa1e463d001240f14709327b27b1e.zip gcc-ff6534ad165fa1e463d001240f14709327b27b1e.tar.gz gcc-ff6534ad165fa1e463d001240f14709327b27b1e.tar.bz2 |
Fix code that substitutes reloadreg into SET_DEST of previous insn.
From-SVN: r37711
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/reload1.c | 17 |
2 files changed, 21 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 031d454..2c12a96 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 2000-11-24 Bernd Schmidt <bernds@redhat.co.uk> + * reload1.c (conflicts_with_override): New function. + (emit_input_reload_insns): Use it to tighten test for validity + of substituting into output of previous insn. + * haifa-sched.c (struct ready_list): New. (ready_lastpos, ready_add, ready_remove_first, ready_sort): New static functions. diff --git a/gcc/reload1.c b/gcc/reload1.c index 926d796..60eac68 100644 --- a/gcc/reload1.c +++ b/gcc/reload1.c @@ -417,6 +417,7 @@ static int reload_reg_reaches_end_p PARAMS ((unsigned int, int, enum reload_type)); static int allocate_reload_reg PARAMS ((struct insn_chain *, int, int)); +static int conflicts_with_override PARAMS ((rtx)); static void failed_reload PARAMS ((rtx, int)); static int set_reload_reg PARAMS ((int, int)); static void choose_reload_regs_init PARAMS ((struct insn_chain *, rtx *)); @@ -4882,6 +4883,21 @@ reload_reg_free_for_value_p (regno, opnum, type, value, out, reloadnum, return 1; } +/* Determine whether the reload reg X overlaps any rtx'es used for + overriding inheritance. Return nonzero if so. */ + +static int +conflicts_with_override (x) + rtx x; +{ + int i; + for (i = 0; i < n_reloads; i++) + if (reload_override_in[i] + && reg_overlap_mentioned_p (x, reload_override_in[i])) + return 1; + return 0; +} + /* Give an error message saying we failed to find a reload for INSN, and clear out reload R. */ static void @@ -6215,6 +6231,7 @@ emit_input_reload_insns (chain, rl, old, j) && dead_or_set_p (insn, old) /* This is unsafe if some other reload uses the same reg first. */ + && ! conflicts_with_override (reloadreg) && reload_reg_free_for_value_p (REGNO (reloadreg), rl->opnum, rl->when_needed, |