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