combine: Query can_change_dest_mode before changing dest mode
authorSegher Boessenkool <segher@kernel.crashing.org>
Wed, 23 Nov 2016 23:30:38 +0000 (00:30 +0100)
committerSegher Boessenkool <segher@gcc.gnu.org>
Wed, 23 Nov 2016 23:30:38 +0000 (00:30 +0100)
As reported in https://gcc.gnu.org/ml/gcc-patches/2016-11/msg02388.html .

Changing the mode of a hard register can lead to problems, or at least
it can make worse code if the result will need reloads.

* combine.c (change_zero_ext): Only change the mode of a hard register
destination if can_change_dest_mode holds for that.

From-SVN: r242812

gcc/ChangeLog
gcc/combine.c

index 46b023e6400a07dcf447f911d5cdb6fdc7148404..1cd24041b5b7b0159caf41c1b36f93aa59496be1 100644 (file)
@@ -1,3 +1,8 @@
+2016-11-23  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       * combine.c (change_zero_ext): Only change the mode of a hard register
+       destination if can_change_dest_mode holds for that.
+
 2016-11-23  Jeff Law  <law@redhat.com>
 
        * varasm.c (assemble_name): Increase buffer size for name.
index ae25ef35ed9b985ae64f916e1e124c82420c3522..ce6cfde534d3a5d8518a5d6c2f32760b10b762e5 100644 (file)
@@ -11230,7 +11230,8 @@ change_zero_ext (rtx pat)
       else if (GET_CODE (x) == ZERO_EXTEND
               && SCALAR_INT_MODE_P (mode)
               && REG_P (XEXP (x, 0))
-              && HARD_REGISTER_P (XEXP (x, 0)))
+              && HARD_REGISTER_P (XEXP (x, 0))
+              && can_change_dest_mode (XEXP (x, 0), 0, mode))
        {
          size = GET_MODE_PRECISION (GET_MODE (XEXP (x, 0)));
          x = gen_rtx_REG (mode, REGNO (XEXP (x, 0)));