Fix pessimistic DImode handling in combine.c:make_field_assignment
authorRichard Sandiford <richard.sandiford@linaro.org>
Mon, 12 Jun 2017 16:06:38 +0000 (16:06 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Mon, 12 Jun 2017 16:06:38 +0000 (16:06 +0000)
The make_field_assignment code:

      src = force_to_mode (src, mode,
       GET_MODE_PRECISION (mode) >= HOST_BITS_PER_WIDE_INT
       ? HOST_WIDE_INT_M1U
       : (HOST_WIDE_INT_1U << len) - 1,
       0);

would ignore the field length len for DImode, even though DImode can be
handled using HWIs.  I think the code should be testing len instead.

2017-06-12  Richard Sandiford  <richard.sandiford@linaro.org>

gcc/
* combine.c (make_field_assignment): Check len rather than the mode
precision when calling force_to_mode.

From-SVN: r249128

gcc/ChangeLog
gcc/combine.c

index d4f4dee..cc5435d 100644 (file)
@@ -1,3 +1,8 @@
+2017-06-12  Richard Sandiford  <richard.sandiford@linaro.org>
+
+       * combine.c (make_field_assignment): Check len rather than the mode
+       precision when calling force_to_mode.
+
 2017-06-12  Georg-Johann Lay  <avr@gjlay.de>
 
        Support multilibs and devices that see flash in RAM address range.
index 39ef3c6..2d49bc2 100644 (file)
@@ -9634,7 +9634,7 @@ make_field_assignment (rtx x)
                                                     other, pos),
                               dest);
   src = force_to_mode (src, mode,
-                      GET_MODE_PRECISION (mode) >= HOST_BITS_PER_WIDE_INT
+                      len >= HOST_BITS_PER_WIDE_INT
                       ? HOST_WIDE_INT_M1U
                       : (HOST_WIDE_INT_1U << len) - 1,
                       0);