rs6000: Fix for -mwarn-cell-microcode (PR43763)
authorSegher Boessenkool <segher@kernel.crashing.org>
Fri, 3 Mar 2017 17:00:50 +0000 (18:00 +0100)
committerSegher Boessenkool <segher@gcc.gnu.org>
Fri, 3 Mar 2017 17:00:50 +0000 (18:00 +0100)
If using -mwarn-cell-microcode, rs6000_final_prescan_insn calls
get_insn_template to get the name of the machine instruction.  But,
get_insn_template calls the output template if that is code, and that
then can modify recog_data (it is normal to change the operands, for
example).

This patch saves and restores recog_data around the call to
get_insn_template to fix the problems this causes.

PR target/43763
* config/rs6000/rs6000.c (rs6000_final_prescan_insn): Save and
restore recog_data (including the operand rtxes inside it) around
the call to get_insn_template.

From-SVN: r245880

gcc/ChangeLog
gcc/config/rs6000/rs6000.c

index d78b3f41d5322ae4973311c8f03ae80106919310..79d2004611f2079c573c6f96c5d7ead22770c98b 100644 (file)
@@ -1,3 +1,10 @@
+2017-03-03  Segher Boesssenkool  <segher@kernel.crashing.org>
+
+       PR target/43763
+       * config/rs6000/rs6000.c (rs6000_final_prescan_insn): Save and
+       restore recog_data (including the operand rtxes inside it) around
+       the call to get_insn_template.
+
 2017-03-03  Martin Sebor  <msebor@redhat.com>
 
        PR tree-optimization/79699
index 25b10f12742d66c28f9a8f6e3123826ed06d01ad..fde7cc71fac439187369e10e80a1d4350d3323c4 100644 (file)
@@ -38848,7 +38848,12 @@ rs6000_final_prescan_insn (rtx_insn *insn, rtx *operand ATTRIBUTE_UNUSED,
       if (insn_code_number < 0)
        return;
 
+      /* get_insn_template can modify recog_data, so save and restore it.  */
+      struct recog_data_d recog_data_save = recog_data;
+      for (int i = 0; i < recog_data.n_operands; i++)
+       recog_data.operand[i] = copy_rtx (recog_data.operand[i]);
       temp = get_insn_template (insn_code_number, insn);
+      recog_data = recog_data_save;
 
       if (get_attr_cell_micro (insn) == CELL_MICRO_ALWAYS)
        warning_at (location, OPT_mwarn_cell_microcode,