From cc80b225c509c45dadbeccdb154985677e1ae3a3 Mon Sep 17 00:00:00 2001 From: Segher Boessenkool Date: Fri, 29 Jul 2016 14:34:21 +0200 Subject: [PATCH] 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 --- gcc/ChangeLog | 7 +++++++ gcc/combine.c | 6 ++++++ 2 files changed, 13 insertions(+) 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; -- 2.30.2