]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
cprop_hardreg: Ensure replacement reg has compatible mode [PR99221]
authorStefan Schulze Frielinghaus <stefansf@linux.ibm.com>
Fri, 12 Mar 2021 16:32:42 +0000 (17:32 +0100)
committerStefan Schulze Frielinghaus <stefansf@linux.ibm.com>
Tue, 23 Mar 2021 08:48:01 +0000 (09:48 +0100)
In addition to the existing check also ask the target whether a
replacement register may be accessed in a different mode than it was set
before.

gcc/ChangeLog:

* regcprop.c (find_oldest_value_reg): Ask target whether
  different mode is fine for replacement register.

gcc/regcprop.c

index e1342f56bd12cf57ff64ed1ed5c54be2f0ce76bf..02753a12510787bb87c02ea6757096654cf2ba70 100644 (file)
@@ -474,7 +474,8 @@ find_oldest_value_reg (enum reg_class cl, rtx reg, struct value_data *vd)
        (set (...) (reg:DI r9))
      Replacing r9 with r11 is invalid.  */
   if (mode != vd->e[regno].mode
-      && REG_NREGS (reg) > hard_regno_nregs (regno, vd->e[regno].mode))
+      && (REG_NREGS (reg) > hard_regno_nregs (regno, vd->e[regno].mode)
+         || !REG_CAN_CHANGE_MODE_P (regno, mode, vd->e[regno].mode)))
     return NULL_RTX;
 
   for (i = vd->e[regno].oldest_regno; i != regno; i = vd->e[i].next_regno)