More is_a <scalar_int_mode>
authorRichard Sandiford <richard.sandiford@linaro.org>
Wed, 1 Nov 2017 13:33:18 +0000 (13:33 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Wed, 1 Nov 2017 13:33:18 +0000 (13:33 +0000)
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

gcc/ChangeLog
gcc/alias.c

index b9b5ddd75b3bba0e71ca932869a39f348c89f46e..209219cc8f65656bfab5168cefba4afe6a480e16 100644 (file)
@@ -1,3 +1,10 @@
+2017-11-01  Richard Sandiford  <richard.sandiford@linaro.org>
+           Alan Hayward  <alan.hayward@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>
index cb57c6a10ff125a128110e06822d6ff6bb4a37fe..a02eadcaea81dcd2706ca91e56aca5aaa55b6116 100644 (file)
@@ -1349,6 +1349,7 @@ static rtx
 find_base_value (rtx src)
 {
   unsigned int regno;
+  scalar_int_mode int_mode;
 
 #if defined (FIND_BASE_TERM)
   /* Try machine-dependent ways to find the base term.  */
@@ -1475,7 +1476,8 @@ find_base_value (rtx src)
         address modes depending on the address space.  */
       if (!target_default_pointer_address_modes_p ())
        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;
       /* Fall through.  */
     case HIGH:
@@ -1876,6 +1878,7 @@ find_base_term (rtx x)
   cselib_val *val;
   struct elt_loc_list *l, *f;
   rtx ret;
+  scalar_int_mode int_mode;
 
 #if defined (FIND_BASE_TERM)
   /* Try machine-dependent ways to find the base term.  */
@@ -1893,7 +1896,8 @@ find_base_term (rtx x)
         address modes depending on the address space.  */
       if (!target_default_pointer_address_modes_p ())
        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;
       /* Fall through.  */
     case HIGH: