aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2002-01-08 15:42:56 -0800
committerRichard Henderson <rth@gcc.gnu.org>2002-01-08 15:42:56 -0800
commita53762766744fa37c804b1cc79c6a8032ca7b84a (patch)
tree5b436ba811570ffb5c03899622aec4ecdf31a60d /gcc
parent18cf8ddadafa4b013652db01a344192fc09c67a8 (diff)
downloadgcc-a53762766744fa37c804b1cc79c6a8032ca7b84a.zip
gcc-a53762766744fa37c804b1cc79c6a8032ca7b84a.tar.gz
gcc-a53762766744fa37c804b1cc79c6a8032ca7b84a.tar.bz2
alpha.c (alpha_split_conditional_move): Call copy_rtx as needed to avoid shared structure.
* config/alpha/alpha.c (alpha_split_conditional_move): Call copy_rtx as needed to avoid shared structure. From-SVN: r48667
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/alpha/alpha.c19
2 files changed, 17 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4809963..72e5144 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 b928609..8790e7d 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));
}