From: Kewen Lin Date: Mon, 11 Jan 2021 02:33:23 +0000 (-0600) Subject: ira: Skip some pseudos in move_unallocated_pseudos X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=bcb3065b2ba6efb967c3a34fc34b09726f7579d1;p=gcc.git ira: Skip some pseudos in move_unallocated_pseudos This patch is to make move_unallocated_pseudos consistent to what we have in function find_moveable_pseudos, where we record the original pseudo into pseudo_replaced_reg only if validate_change succeeds with newreg. To ensure every unallocated pseudo in move_unallocated_pseudos has expected information, it's better to add a check and skip it if it's unexpected. This avoids possible ICEs in future. gcc/ChangeLog: * ira.c (move_unallocated_pseudos): Check other_reg and skip if it isn't set. --- diff --git a/gcc/ira.c b/gcc/ira.c index eb88f1ecb66..725b0ff0276 100644 --- a/gcc/ira.c +++ b/gcc/ira.c @@ -5111,6 +5111,15 @@ move_unallocated_pseudos (void) { int idx = i - first_moveable_pseudo; rtx other_reg = pseudo_replaced_reg[idx]; + /* The iterating range [first_moveable_pseudo, last_moveable_pseudo) + covers every new pseudo created in find_moveable_pseudos, + regardless of the validation with it is successful or not. + So we need to skip the pseudos which were used in those failed + validations to avoid unexpected DF info and consequent ICE. + We only set pseudo_replaced_reg[] when the validation is successful + in find_moveable_pseudos, it's enough to check it here. */ + if (!other_reg) + continue; rtx_insn *def_insn = DF_REF_INSN (DF_REG_DEF_CHAIN (i)); /* The use must follow all definitions of OTHER_REG, so we can insert the new definition immediately after any of them. */