diff mbox

rs6000: Fix for -mwarn-cell-microcode (PR43763)

Message ID 89bf219c2fb87a5e01356a61a68dbc6001672885.1488537768.git.segher@kernel.crashing.org
State New
Headers show

Commit Message

Segher Boessenkool March 3, 2017, 10:46 a.m. UTC
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.

Bootstrap and test running on powerpc64-linux; I'll commit it to
trunk if that goes well (and 6 and 5 later).


Segher


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_data.

---
 gcc/config/rs6000/rs6000.c | 5 +++++
 1 file changed, 5 insertions(+)
diff mbox

Patch

diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 3f13ce5..ecc7823 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -39041,7 +39041,12 @@  rs6000_final_prescan_insn (rtx_insn *insn, rtx *operand ATTRIBUTE_UNUSED,
       if (insn_code_number < 0)
 	return;
 
+      /* get_insn_data 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,