re PR middle-end/65182 (-Wuninitialized fails when pointer to variable later passed...
authorAlan Modra <amodra@gmail.com>
Tue, 24 Feb 2015 00:00:59 +0000 (10:30 +1030)
committerAlan Modra <amodra@gcc.gnu.org>
Tue, 24 Feb 2015 00:00:59 +0000 (10:30 +1030)
PR target/65182
* config/rs6000/rs6000.c (get_memref_parts): Only return true
when *base is a reg.  Handle nested plus addresses.  Simplify
pre_modify test.

From-SVN: r220924

gcc/ChangeLog
gcc/config/rs6000/rs6000.c

index 02e60b77dc209736e587ed456cabfd04a68e70d6..c1e46fb7286985c6f194e3e347051b1bde61084e 100644 (file)
@@ -1,3 +1,10 @@
+2015-02-24  Alan Modra  <amodra@gmail.com>
+
+       PR target/65182
+       * config/rs6000/rs6000.c (get_memref_parts): Only return true
+       when *base is a reg.  Handle nested plus addresses.  Simplify
+       pre_modify test.
+
 2015-02-22  Max Filippov  <jcmvbkbc@gmail.com>
 
        * config/xtensa/xtensa.h (CONSTANT_ALIGNMENT, DATA_ALIGNMENT):
index e482547aecc09e55cd5c19fbd76ef6501e5d861d..6cef0f5a93cc637ffa9c7de9f44ca3a82750b8e1 100644 (file)
@@ -27172,25 +27172,21 @@ get_memref_parts (rtx mem, rtx *base, HOST_WIDE_INT *offset,
   else
     return false;
 
-  if (GET_CODE (XEXP (mem, 0)) == PRE_MODIFY)
-    addr_rtx = XEXP (XEXP (mem, 0), 1);
-  else
-    addr_rtx = (XEXP (mem, 0));
+  addr_rtx = (XEXP (mem, 0));
+  if (GET_CODE (addr_rtx) == PRE_MODIFY)
+    addr_rtx = XEXP (addr_rtx, 1);
 
-  if (GET_CODE (addr_rtx) == REG)
-    {
-      *base = addr_rtx;
-      *offset = 0;
-    }
-  else if (GET_CODE (addr_rtx) == PLUS
-          && CONST_INT_P (XEXP (addr_rtx, 1)))
+  *offset = 0;
+  while (GET_CODE (addr_rtx) == PLUS
+        && CONST_INT_P (XEXP (addr_rtx, 1)))
     {
-      *base = XEXP (addr_rtx, 0);
-      *offset = INTVAL (XEXP (addr_rtx, 1));
+      *offset += INTVAL (XEXP (addr_rtx, 1));
+      addr_rtx = XEXP (addr_rtx, 0);
     }
-  else
+  if (!REG_P (addr_rtx))
     return false;
 
+  *base = addr_rtx;
   return true;
 }