alpha.c (alpha_split_conditional_move): Call copy_rtx as needed to avoid shared struc...
authorRichard Henderson <rth@redhat.com>
Tue, 8 Jan 2002 23:42:56 +0000 (15:42 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Tue, 8 Jan 2002 23:42:56 +0000 (15:42 -0800)
        * config/alpha/alpha.c (alpha_split_conditional_move): Call copy_rtx
        as needed to avoid shared structure.

From-SVN: r48667

gcc/ChangeLog
gcc/config/alpha/alpha.c

index 4809963c95c4bb886f19d209575e1eb7cbf24e65..72e514420a15979de0f3ac23b09584aa4ab666d5 100644 (file)
@@ -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
index b928609030c92ecda4e3b22ad41e2387676baaf7..8790e7d113758ce0652271570e2a6b7d13923338 100644 (file)
@@ -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));
            }