xt_true_regnum is used by move expanders and insn conditions, which
IRA invokes through emit_move_insn and recog_memoized when emitting
moves for regional allocation.  At that point reg_renumber has not
been resized to cover the new pseudos, so indexing it reads out of
bounds.  Before LRA starts reg_renumber holds no final assignments,
so only consult it once LRA is in progress or reload has completed.

gcc/ChangeLog:

        * config/xtensa/xtensa.cc (xt_true_regnum): Don't index
        reg_renumber before LRA starts.
---
 gcc/config/xtensa/xtensa.cc | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/gcc/config/xtensa/xtensa.cc b/gcc/config/xtensa/xtensa.cc
index 6b5d8d1099a..99a244bf9fd 100644
--- a/gcc/config/xtensa/xtensa.cc
+++ b/gcc/config/xtensa/xtensa.cc
@@ -546,9 +546,12 @@ xt_true_regnum (rtx x)
 {
   if (REG_P (x))
     {
+      /* Before LRA, reg_renumber need not cover pseudos created since it
+        was last resized (e.g. by ira_emit during regional allocation).  */
       if (! HARD_REGISTER_P (x)
          && reg_renumber
-         && (lra_in_progress || reg_renumber[REGNO (x)] >= 0))
+         && (lra_in_progress
+             || (reload_completed && reg_renumber[REGNO (x)] >= 0)))
        return reg_renumber[REGNO (x)];
       return REGNO (x);
     }
-- 
2.55.0

Reply via email to