From: Segher Boessenkool Date: Fri, 29 Jul 2016 12:34:21 +0000 (+0200) Subject: re PR rtl-optimization/71976 (insn-combiner deletes a live 64-bit shift) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=cc80b225c509c45dadbeccdb154985677e1ae3a3;p=gcc.git re PR rtl-optimization/71976 (insn-combiner deletes a live 64-bit shift) gcc/ PR rtl-optimization/71976 * combine.c (get_last_value): Return 0 if the argument for which the function is called has a wider mode than the recorded value. Co-Authored-By: Georg-Johann Lay From-SVN: r238863 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 04cf940e7c4..a1822d93c8f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2016-07-29 Segher Boessenkool + Georg-Johann Lay + + PR rtl-optimization/71976 + * combine.c (get_last_value): Return 0 if the argument for which + the function is called has a wider mode than the recorded value. + 2016-07-29 Marek Polacek PR c/7652 diff --git a/gcc/combine.c b/gcc/combine.c index 93c17109cc2..b687867652f 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -13210,6 +13210,12 @@ get_last_value (const_rtx x) && DF_INSN_LUID (rsp->last_set) >= subst_low_luid) return 0; + /* If fewer bits were set than what we are asked for now, we cannot use + the value. */ + if (GET_MODE_PRECISION (rsp->last_set_mode) + < GET_MODE_PRECISION (GET_MODE (x))) + return 0; + /* If the value has all its registers valid, return it. */ if (get_last_value_validate (&value, rsp->last_set, rsp->last_set_label, 0)) return value;