From: Segher Boessenkool Date: Fri, 3 Mar 2017 17:00:50 +0000 (+0100) Subject: rs6000: Fix for -mwarn-cell-microcode (PR43763) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=f325c4567336a2e5c9643e7adb3a152d22022d7d;p=gcc.git rs6000: Fix for -mwarn-cell-microcode (PR43763) 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d78b3f41d53..79d2004611f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2017-03-03 Segher Boesssenkool + + 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 PR tree-optimization/79699 diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 25b10f12742..fde7cc71fac 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -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,