[committed] lra: Ignore debug insns and notes in combine_reload_insn [PR109179]

Message ID b7ea52e2-ba72-aa92-3969-ab52f7d112d6@linux.ibm.com
State Committed
Commit 44a13125a0d56dbabb9bc61de7ff8bf94fb57928
Headers
Series [committed] lra: Ignore debug insns and notes in combine_reload_insn [PR109179] |

Commit Message

Peter Bergner March 18, 2023, 12:12 a.m. UTC
  We ICE in combine_reload_insn if we've deleted the TO insn operand during
processing, because lra_get_insn_recog_data doesn't expect to see the note
that replaces the deleted insn.  The solution here is to exit early if TO
is a debug insn or note.

This caused a bootstrap issue on powerpc64le-linux.  The fix was approved
by Vlad.  Committed and pushed after bootstrap testing and checking there
were no testsuite regressions when compared to the commit before the
commit that caused the ICE.

Peter


gcc/
	PR rtl-optimization/109179
	* lra-constraints.cc (combine_reload_insn): Enforce TO is not a debug
	insn or note.  Move the tests earlier to guard lra_get_insn_recog_data.
  

Patch

diff --git a/gcc/lra-constraints.cc b/gcc/lra-constraints.cc
index 95b534e1a70..405b8b92f5e 100644
--- a/gcc/lra-constraints.cc
+++ b/gcc/lra-constraints.cc
@@ -5014,14 +5014,19 @@  combine_reload_insn (rtx_insn *from, rtx_insn *to)
   enum reg_class to_class, from_class;
   int n, nop;
   signed char changed_nops[MAX_RECOG_OPERANDS + 1];
-  lra_insn_recog_data_t id = lra_get_insn_recog_data (to);
-  struct lra_static_insn_data *static_id = id->insn_static_data;
   
   /* Check conditions for second memory reload and original insn:  */
   if ((targetm.secondary_memory_needed
        == hook_bool_mode_reg_class_t_reg_class_t_false)
-      || NEXT_INSN (from) != to || CALL_P (to)
-      || id->used_insn_alternative == LRA_UNKNOWN_ALT
+      || NEXT_INSN (from) != to
+      || !NONDEBUG_INSN_P (to)
+      || CALL_P (to))
+    return false;
+
+  lra_insn_recog_data_t id = lra_get_insn_recog_data (to);
+  struct lra_static_insn_data *static_id = id->insn_static_data;
+  
+  if (id->used_insn_alternative == LRA_UNKNOWN_ALT
       || (set = single_set (from)) == NULL_RTX)
     return false;
   from_reg = SET_DEST (set);