Commit 6645d841 by Richard Sandiford Committed by Richard Sandiford

More is_a <scalar_int_mode>

alias.c:find_base_term and find_base_value checked:

      if (GET_MODE_SIZE (GET_MODE (src)) < GET_MODE_SIZE (Pmode))

but (a) comparing the precision seems more correct, since it's possible
for modes to have the same memory size as Pmode but fewer bits and
(b) the functions are called on arbitrary rtl, so there's no guarantee
that we're handling an integer truncation.

Since there's no point processing truncations of anything other than an
integer, this patch checks that first.

2017-11-01  Richard Sandiford  <richard.sandiford@linaro.org>
	    Alan Hayward  <alan.hayward@arm.com>
	    David Sherwood  <david.sherwood@arm.com>

gcc/
	* alias.c (find_base_value, find_base_term): Only process integer
	truncations.  Check the precision rather than the size.

Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
Co-Authored-By: David Sherwood <david.sherwood@arm.com>

From-SVN: r254306
parent 7aaba298
...@@ -2,6 +2,13 @@ ...@@ -2,6 +2,13 @@
Alan Hayward <alan.hayward@arm.com> Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com> David Sherwood <david.sherwood@arm.com>
* alias.c (find_base_value, find_base_term): Only process integer
truncations. Check the precision rather than the size.
2017-11-01 Richard Sandiford <richard.sandiford@linaro.org>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
* machmode.h (is_narrower_int_mode): New function * machmode.h (is_narrower_int_mode): New function
* optabs.c (expand_float, expand_fix): Use it. * optabs.c (expand_float, expand_fix): Use it.
* dwarf2out.c (rotate_loc_descriptor): Likewise. * dwarf2out.c (rotate_loc_descriptor): Likewise.
...@@ -1349,6 +1349,7 @@ static rtx ...@@ -1349,6 +1349,7 @@ static rtx
find_base_value (rtx src) find_base_value (rtx src)
{ {
unsigned int regno; unsigned int regno;
scalar_int_mode int_mode;
#if defined (FIND_BASE_TERM) #if defined (FIND_BASE_TERM)
/* Try machine-dependent ways to find the base term. */ /* Try machine-dependent ways to find the base term. */
...@@ -1475,7 +1476,8 @@ find_base_value (rtx src) ...@@ -1475,7 +1476,8 @@ find_base_value (rtx src)
address modes depending on the address space. */ address modes depending on the address space. */
if (!target_default_pointer_address_modes_p ()) if (!target_default_pointer_address_modes_p ())
break; break;
if (GET_MODE_SIZE (GET_MODE (src)) < GET_MODE_SIZE (Pmode)) if (!is_a <scalar_int_mode> (GET_MODE (src), &int_mode)
|| GET_MODE_PRECISION (int_mode) < GET_MODE_PRECISION (Pmode))
break; break;
/* Fall through. */ /* Fall through. */
case HIGH: case HIGH:
...@@ -1876,6 +1878,7 @@ find_base_term (rtx x) ...@@ -1876,6 +1878,7 @@ find_base_term (rtx x)
cselib_val *val; cselib_val *val;
struct elt_loc_list *l, *f; struct elt_loc_list *l, *f;
rtx ret; rtx ret;
scalar_int_mode int_mode;
#if defined (FIND_BASE_TERM) #if defined (FIND_BASE_TERM)
/* Try machine-dependent ways to find the base term. */ /* Try machine-dependent ways to find the base term. */
...@@ -1893,7 +1896,8 @@ find_base_term (rtx x) ...@@ -1893,7 +1896,8 @@ find_base_term (rtx x)
address modes depending on the address space. */ address modes depending on the address space. */
if (!target_default_pointer_address_modes_p ()) if (!target_default_pointer_address_modes_p ())
return 0; return 0;
if (GET_MODE_SIZE (GET_MODE (x)) < GET_MODE_SIZE (Pmode)) if (!is_a <scalar_int_mode> (GET_MODE (x), &int_mode)
|| GET_MODE_PRECISION (int_mode) < GET_MODE_PRECISION (Pmode))
return 0; return 0;
/* Fall through. */ /* Fall through. */
case HIGH: case HIGH:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment