From b8377ab8fb714e909adb89427acfcb1d646b615e Mon Sep 17 00:00:00 2001 From: Georg-Johann Lay Date: Mon, 8 Aug 2016 10:13:54 +0000 Subject: [PATCH] backport: re PR rtl-optimization/71976 (insn-combiner deletes a live 64-bit shift) Backport from 2016-07-29 trunk r238863. 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. From-SVN: r239239 --- gcc/ChangeLog | 8 ++++++++ gcc/combine.c | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f9a0a0a4c9c1..d6d59efacecb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2016-08-08 Georg-Johann Lay + + Backport from 2016-07-29 trunk r238863. + + 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-08-04 Uros Bizjak PR target/72805 diff --git a/gcc/combine.c b/gcc/combine.c index 16048bf3557e..fb3215370deb 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -13041,6 +13041,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.47.2