diff options
| author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-01-08 23:42:56 +0000 |
|---|---|---|
| committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-01-08 23:42:56 +0000 |
| commit | 646566957d44e151a1ec02c160ff1579d0acf587 (patch) | |
| tree | 5b436ba811570ffb5c03899622aec4ecdf31a60d | |
| parent | d2079f6d4a8a393d5827100db17f7bba2cbe9ba1 (diff) | |
| download | ppe42-gcc-646566957d44e151a1ec02c160ff1579d0acf587.tar.gz ppe42-gcc-646566957d44e151a1ec02c160ff1579d0acf587.zip | |
* config/alpha/alpha.c (alpha_split_conditional_move): Call copy_rtx
as needed to avoid shared structure.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@48667 138bc75d-0d04-0410-961f-82ee72b054a4
| -rw-r--r-- | gcc/ChangeLog | 5 | ||||
| -rw-r--r-- | gcc/config/alpha/alpha.c | 19 |
2 files changed, 17 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4809963c95c..72e514420a1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2002-01-08 Richard Henderson <rth@redhat.com> + + * config/alpha/alpha.c (alpha_split_conditional_move): Call copy_rtx + as needed to avoid shared structure. + 2002-01-08 Kazu Hirata <kazu@hxi.com> * config/h8300/h8300.c (get_shift_alg): Fix 15-bit LSHIFTRT on diff --git a/gcc/config/alpha/alpha.c b/gcc/config/alpha/alpha.c index b928609030c..8790e7d1137 100644 --- a/gcc/config/alpha/alpha.c +++ b/gcc/config/alpha/alpha.c @@ -3166,6 +3166,9 @@ alpha_split_conditional_move (code, dest, cond, t_rtx, f_rtx) else subtarget = target; } + /* Below, we must be careful to use copy_rtx on target and subtarget + in intermediate insns, as they may be a subreg rtx, which may not + be shared. */ if (f == 0 && exact_log2 (diff) > 0 /* On EV6, we've got enough shifters to make non-arithmatic shifts @@ -3174,33 +3177,35 @@ alpha_split_conditional_move (code, dest, cond, t_rtx, f_rtx) && (diff <= 8 || alpha_cpu == PROCESSOR_EV6)) { tmp = gen_rtx_fmt_ee (code, DImode, cond, const0_rtx); - emit_insn (gen_rtx_SET (VOIDmode, subtarget, tmp)); + emit_insn (gen_rtx_SET (VOIDmode, copy_rtx (subtarget), tmp)); - tmp = gen_rtx_ASHIFT (DImode, subtarget, GEN_INT (exact_log2 (t))); + tmp = gen_rtx_ASHIFT (DImode, copy_rtx (subtarget), + GEN_INT (exact_log2 (t))); emit_insn (gen_rtx_SET (VOIDmode, target, tmp)); } else if (f == 0 && t == -1) { tmp = gen_rtx_fmt_ee (code, DImode, cond, const0_rtx); - emit_insn (gen_rtx_SET (VOIDmode, subtarget, tmp)); + emit_insn (gen_rtx_SET (VOIDmode, copy_rtx (subtarget), tmp)); - emit_insn (gen_negdi2 (target, subtarget)); + emit_insn (gen_negdi2 (target, copy_rtx (subtarget))); } else if (diff == 1 || diff == 4 || diff == 8) { rtx add_op; tmp = gen_rtx_fmt_ee (code, DImode, cond, const0_rtx); - emit_insn (gen_rtx_SET (VOIDmode, subtarget, tmp)); + emit_insn (gen_rtx_SET (VOIDmode, copy_rtx (subtarget), tmp)); if (diff == 1) - emit_insn (gen_adddi3 (target, subtarget, GEN_INT (f))); + emit_insn (gen_adddi3 (target, copy_rtx (subtarget), GEN_INT (f))); else { add_op = GEN_INT (f); if (sext_add_operand (add_op, mode)) { - tmp = gen_rtx_MULT (DImode, subtarget, GEN_INT (diff)); + tmp = gen_rtx_MULT (DImode, copy_rtx (subtarget), + GEN_INT (diff)); tmp = gen_rtx_PLUS (DImode, tmp, add_op); emit_insn (gen_rtx_SET (VOIDmode, target, tmp)); } |

