have to capture its current state and restore it afterwards. */
recog_data_d prev_recog_data = recog_data;
- rtx_insn* i = make_insn_raw (gen_rtx_SET (get_t_reg_rtx (), op));
+ /* Note we can't use insn_raw here since that increases the uid
+ and could cause debug compare differences; this insn never leaves
+ this function so create a dummy one. */
+ rtx_insn* i = as_a <rtx_insn *> (rtx_alloc (INSN));
+
+ INSN_UID (i) = 1;
+ PATTERN (i) = gen_rtx_SET (get_t_reg_rtx (), op);
+ INSN_CODE (i) = -1;
+ REG_NOTES (i) = NULL;
+ INSN_LOCATION (i) = curr_insn_location ();
+ BLOCK_FOR_INSN (i) = NULL;
SET_PREV_INSN (i) = NULL;
SET_NEXT_INSN (i) = NULL;
--- /dev/null
+/* { dg-additional-options "-fcompare-debug" } */
+
+/* PR target/116189 */
+
+/* In the sh backend, we used to create insn in the path of rtx_costs.
+ This means sometimes the max uid for insns would be different between
+ debugging and non debugging which then would cause gcse's hashtable
+ to have different number of slots which would cause a different walk
+ for that hash table. */
+
+extern void ff(void);
+extern short nn[8][4];
+typedef unsigned short move_table[4];
+extern signed long long ira_overall_cost;
+extern signed long long ira_load_cost;
+extern move_table *x_ira_register_move_cost[1];
+struct move { struct move *next; };
+unsigned short t;
+void emit_move_list(struct move * list, int freq, unsigned char mode, int regno) {
+ int cost;
+ for (; list != 0; list = list->next)
+ {
+ ff();
+ unsigned short aclass = t;
+ cost = (nn)[mode][aclass] ;
+ ira_load_cost = cost;
+ cost = x_ira_register_move_cost[mode][aclass][aclass] * freq ;
+ ira_overall_cost = cost;
+ }
+}