From: Stefan Schulze Frielinghaus Date: Fri, 12 Mar 2021 16:32:42 +0000 (+0100) Subject: cprop_hardreg: Ensure replacement reg has compatible mode [PR99221] X-Git-Tag: basepoints/gcc-12~482 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a28cc94a27529b3108ea85be9ef5557a3c95791d;p=thirdparty%2Fgcc.git cprop_hardreg: Ensure replacement reg has compatible mode [PR99221] 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. --- diff --git a/gcc/regcprop.c b/gcc/regcprop.c index e1342f56bd12..02753a125107 100644 --- a/gcc/regcprop.c +++ b/gcc/regcprop.c @@ -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)