rs6000: Don't use operands[] for temporaries in define_expand
authorSegher Boessenkool <segher@kernel.crashing.org>
Fri, 2 Oct 2020 00:06:56 +0000 (00:06 +0000)
committerSegher Boessenkool <segher@kernel.crashing.org>
Fri, 6 Nov 2020 23:59:15 +0000 (23:59 +0000)
In ac001f5ce604 Alan fixed my thinko using operands that do not refer
to anything mentioned in the RTL pattern.  Instead, it just uses fresh
new local rtxes for those.

This patch takes that a tiny bit further: it uses local rtx for all
temporaries used in the expanders.  As a bonus that simplifies the code
a tiny bit as well.

2020-11-06  Segher Boessenkool  <segher@kernel.crashing.org>

* config/rs6000/rs6000.md (@tablejump<mode>_normal): Don't abuse
operands[].
(@tablejump<mode>_nospec): Ditto.

gcc/config/rs6000/rs6000.md

index acbf1303ab2b5315ed41f6f8ba38633e99a4a888..5e5ad9f7c3d02508bfb6446c1c2338ea2cedd6ca 100644 (file)
    (use (match_operand:P 1))]
   "rs6000_speculate_indirect_jumps"
 {
-  rtx off;
-  operands[0] = force_reg (SImode, operands[0]);
-  if (<MODE>mode == SImode)
-    off = operands[0];
-  else
+  rtx off = force_reg (SImode, operands[0]);
+  if (<MODE>mode != SImode)
     {
+      rtx src = gen_rtx_fmt_e (SIGN_EXTEND, Pmode, off);
       off = gen_reg_rtx (Pmode);
-      rtx src = gen_rtx_fmt_e (SIGN_EXTEND, Pmode, operands[0]);
       emit_move_insn (off, src);
     }
 
    (use (match_operand:CC 2))]
   "!rs6000_speculate_indirect_jumps"
 {
-  rtx off;
-  operands[0] = force_reg (SImode, operands[0]);
-  if (<MODE>mode == SImode)
-    off = operands[0];
-  else
+  rtx off = force_reg (SImode, operands[0]);
+  if (<MODE>mode != SImode)
     {
+      rtx src = gen_rtx_fmt_e (SIGN_EXTEND, Pmode, off);
       off = gen_reg_rtx (Pmode);
-      rtx src = gen_rtx_fmt_e (SIGN_EXTEND, Pmode, operands[0]);
       emit_move_insn (off, src);
     }