combine: Another hard register problem (PR85805)
authorSegher Boessenkool <segher@gcc.gnu.org>
Thu, 26 Jul 2018 10:16:48 +0000 (12:16 +0200)
committerSegher Boessenkool <segher@gcc.gnu.org>
Thu, 26 Jul 2018 10:16:48 +0000 (12:16 +0200)
The current code in reg_nonzero_bits_for_combine allows using the
reg_stat info when last_set_mode is a different integer mode.  This is
completely wrong for non-pseudos.  For example, as in the PR, a value
in a DImode hard register is set by eight writes to its constituent
QImode parts.  The value written to the DImode is not the same as that
written to the lowest-numbered QImode!

PR rtl-optimization/85805
* combine.c (reg_nonzero_bits_for_combine): Only use the last set
value for hard registers if that was written in the same mode.

From-SVN: r262994

gcc/ChangeLog
gcc/combine.c

index 7a66a6329f7bed8c965d08b55610114c50e04440..3518ecfc376b8927f5ab84ea56c9527403df33e1 100644 (file)
@@ -1,8 +1,14 @@
+2018-07-26  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       PR rtl-optimization/85805
+       * combine.c (reg_nonzero_bits_for_combine): Only use the last set
+       value for hard registers if that was written in the same mode.
+
 2018-07-26  Martin Liska  <mliska@suse.cz>
 
-        PR gcov-profile/86536
+       PR gcov-profile/86536
        * gcov.c (format_gcov): Use printf format %.*f directly
-        and do not handle special values.
+       and do not handle special values.
 
 2018-07-25  Claudiu Zissulescu  <claziss@synopsys.com>
 
index cfe0f190ece982e520c132e3921b1964cf1353f2..8f6db4ff95be5f1d7967a9ebba6e809b903cff6c 100644 (file)
@@ -10169,7 +10169,8 @@ reg_nonzero_bits_for_combine (const_rtx x, scalar_int_mode xmode,
   rsp = &reg_stat[REGNO (x)];
   if (rsp->last_set_value != 0
       && (rsp->last_set_mode == mode
-         || (GET_MODE_CLASS (rsp->last_set_mode) == MODE_INT
+         || (REGNO (x) >= FIRST_PSEUDO_REGISTER
+             && GET_MODE_CLASS (rsp->last_set_mode) == MODE_INT
              && GET_MODE_CLASS (mode) == MODE_INT))
       && ((rsp->last_set_label >= label_tick_ebb_start
           && rsp->last_set_label < label_tick)