Fix pessimistic DImode handling in combine.c:make_field_assignment

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
This commit is contained in:
Richard Sandiford 2017-06-12 16:06:38 +00:00 committed by Richard Sandiford
parent 64ff4f60d0
commit e701e0b9e8
2 changed files with 6 additions and 1 deletions

View 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.

View 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);