re PR rtl-optimization/71976 (insn-combiner deletes a live 64-bit shift)
authorSegher Boessenkool <segher@kernel.crashing.org>
Fri, 29 Jul 2016 12:34:21 +0000 (14:34 +0200)
committerGeorg-Johann Lay <gjl@gcc.gnu.org>
Fri, 29 Jul 2016 12:34:21 +0000 (12:34 +0000)
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 <avr@gjlay.de>
From-SVN: r238863

gcc/ChangeLog
gcc/combine.c

index 04cf940e7c47eed684313fa18ef84f2954cd150c..a1822d93c8fa3b3701142828f0f30738acbbe446 100644 (file)
@@ -1,3 +1,10 @@
+2016-07-29  Segher Boessenkool  <segher@kernel.crashing.org>
+           Georg-Johann Lay  <avr@gjlay.de>
+
+       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  <polacek@redhat.com>
 
        PR c/7652
index 93c17109cc2a2ffdd5f9a9d7a00d3d562928de7b..b687867652fc8dc722909e8ffff034dafda3da66 100644 (file)
@@ -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;