mips.c (r10k_safe_mem_expr_p): Use get_inner_reference.
authorRichard Sandiford <rdsandiford@googlemail.com>
Sun, 26 Aug 2012 19:20:31 +0000 (19:20 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Sun, 26 Aug 2012 19:20:31 +0000 (19:20 +0000)
gcc/
* config/mips/mips.c (r10k_safe_mem_expr_p): Use get_inner_reference.

From-SVN: r190700

gcc/ChangeLog
gcc/config/mips/mips.c

index ae2bb1b12ec2690532144462e53e104da8263d56..7277a9af370efb021eac3fff95adc4fd62ba646e 100644 (file)
@@ -1,3 +1,7 @@
+2012-08-26  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       * config/mips/mips.c (r10k_safe_mem_expr_p): Use get_inner_reference.
+
 2012-08-26  Richard Sandiford  <rdsandiford@googlemail.com>
 
        * config/mips/mips.c (mips_rtx_costs): Add costs for CINS.
index 1f0c9ae1df02c3b8c37f97ad60bda77f5e50becb..3a19f44a48f71006e8cb6686240865a9f644f6f7 100644 (file)
@@ -14398,17 +14398,18 @@ r10k_safe_address_p (rtx x, rtx insn)
 static bool
 r10k_safe_mem_expr_p (tree expr, HOST_WIDE_INT offset)
 {
-  if (offset < 0 || offset >= int_size_in_bytes (TREE_TYPE (expr)))
-    return false;
+  HOST_WIDE_INT bitoffset, bitsize;
+  tree inner, var_offset;
+  enum machine_mode mode;
+  int unsigned_p, volatile_p;
 
-  while (TREE_CODE (expr) == COMPONENT_REF)
-    {
-      expr = TREE_OPERAND (expr, 0);
-      if (expr == NULL_TREE)
-       return false;
-    }
+  inner = get_inner_reference (expr, &bitsize, &bitoffset, &var_offset, &mode,
+                              &unsigned_p, &volatile_p, false);
+  if (!DECL_P (inner) || !DECL_SIZE_UNIT (inner) || var_offset)
+    return false;
 
-  return DECL_P (expr);
+  offset += bitoffset / BITS_PER_UNIT;
+  return offset >= 0 && offset < tree_low_cst (DECL_SIZE_UNIT (inner), 1);
 }
 
 /* A for_each_rtx callback for which DATA points to the instruction