tree-ssa-loop-ivopts.c (multiplier_allowed_in_address_p): Move from ...
authorBin Cheng <bin.cheng@arm.com>
Thu, 11 May 2017 09:38:22 +0000 (09:38 +0000)
committerBin Cheng <amker@gcc.gnu.org>
Thu, 11 May 2017 09:38:22 +0000 (09:38 +0000)
* tree-ssa-loop-ivopts.c (multiplier_allowed_in_address_p): Move
from ...
* tree-ssa-address.c (multiplier_allowed_in_address_p): ... to here
as local function.  Include necessary header files.
* tree-ssa-loop-ivopts.h (multiplier_allowed_in_address_p): Delete.

From-SVN: r247888

gcc/ChangeLog
gcc/tree-ssa-address.c
gcc/tree-ssa-loop-ivopts.c
gcc/tree-ssa-loop-ivopts.h

index b363799b7e268cd36fc1cea1736c450c86ddb085..262b25aa2f90d61b5e61da0fc3ff2695a08108e1 100644 (file)
@@ -1,3 +1,11 @@
+2017-05-11  Bin Cheng  <bin.cheng@arm.com>
+
+       * tree-ssa-loop-ivopts.c (multiplier_allowed_in_address_p): Move
+       from ...
+       * tree-ssa-address.c (multiplier_allowed_in_address_p): ... to here
+       as local function.  Include necessary header files.
+       * tree-ssa-loop-ivopts.h (multiplier_allowed_in_address_p): Delete.
+
 2017-05-11  Bin Cheng  <bin.cheng@arm.com>
 
        * tree-ssa-loop-ivopts.c (autoinc_possible_for_pair): Simplify.
index e35d3235e04d86f607b77ba23825451d62eb7953..8aefed695d524d1e6511491672646cb4b714d187 100644 (file)
@@ -28,11 +28,13 @@ along with GCC; see the file COPYING3.  If not see
 #include "rtl.h"
 #include "tree.h"
 #include "gimple.h"
+#include "memmodel.h"
 #include "stringpool.h"
 #include "tree-vrp.h"
 #include "tree-ssanames.h"
 #include "expmed.h"
 #include "insn-config.h"
+#include "emit-rtl.h"
 #include "recog.h"
 #include "tree-pretty-print.h"
 #include "fold-const.h"
@@ -537,6 +539,62 @@ add_to_parts (struct mem_address *parts, tree elt)
                               parts->base, elt);
 }
 
+/* Returns true if multiplying by RATIO is allowed in an address.  Test the
+   validity for a memory reference accessing memory of mode MODE in address
+   space AS.  */
+
+static bool
+multiplier_allowed_in_address_p (HOST_WIDE_INT ratio, machine_mode mode,
+                                addr_space_t as)
+{
+#define MAX_RATIO 128
+  unsigned int data_index = (int) as * MAX_MACHINE_MODE + (int) mode;
+  static vec<sbitmap> valid_mult_list;
+  sbitmap valid_mult;
+
+  if (data_index >= valid_mult_list.length ())
+    valid_mult_list.safe_grow_cleared (data_index + 1);
+
+  valid_mult = valid_mult_list[data_index];
+  if (!valid_mult)
+    {
+      machine_mode address_mode = targetm.addr_space.address_mode (as);
+      rtx reg1 = gen_raw_REG (address_mode, LAST_VIRTUAL_REGISTER + 1);
+      rtx reg2 = gen_raw_REG (address_mode, LAST_VIRTUAL_REGISTER + 2);
+      rtx addr, scaled;
+      HOST_WIDE_INT i;
+
+      valid_mult = sbitmap_alloc (2 * MAX_RATIO + 1);
+      bitmap_clear (valid_mult);
+      scaled = gen_rtx_fmt_ee (MULT, address_mode, reg1, NULL_RTX);
+      addr = gen_rtx_fmt_ee (PLUS, address_mode, scaled, reg2);
+      for (i = -MAX_RATIO; i <= MAX_RATIO; i++)
+       {
+         XEXP (scaled, 1) = gen_int_mode (i, address_mode);
+         if (memory_address_addr_space_p (mode, addr, as)
+             || memory_address_addr_space_p (mode, scaled, as))
+           bitmap_set_bit (valid_mult, i + MAX_RATIO);
+       }
+
+      if (dump_file && (dump_flags & TDF_DETAILS))
+       {
+         fprintf (dump_file, "  allowed multipliers:");
+         for (i = -MAX_RATIO; i <= MAX_RATIO; i++)
+           if (bitmap_bit_p (valid_mult, i + MAX_RATIO))
+             fprintf (dump_file, " %d", (int) i);
+         fprintf (dump_file, "\n");
+         fprintf (dump_file, "\n");
+       }
+
+      valid_mult_list[data_index] = valid_mult;
+    }
+
+  if (ratio > MAX_RATIO || ratio < -MAX_RATIO)
+    return false;
+
+  return bitmap_bit_p (valid_mult, ratio + MAX_RATIO);
+}
+
 /* Finds the most expensive multiplication in ADDR that can be
    expressed in an addressing mode and move the corresponding
    element(s) to PARTS.  */
index 3dc6988d31db116efa6ca91aed78ac0551b8745b..436538229c1dc0d1425216de7c24f73cc12b07c9 100644 (file)
@@ -3898,63 +3898,6 @@ adjust_setup_cost (struct ivopts_data *data, unsigned cost,
     return cost;
 }
 
-/* Returns true if multiplying by RATIO is allowed in an address.  Test the
-   validity for a memory reference accessing memory of mode MODE in
-   address space AS.  */
-
-
-bool
-multiplier_allowed_in_address_p (HOST_WIDE_INT ratio, machine_mode mode,
-                                addr_space_t as)
-{
-#define MAX_RATIO 128
-  unsigned int data_index = (int) as * MAX_MACHINE_MODE + (int) mode;
-  static vec<sbitmap> valid_mult_list;
-  sbitmap valid_mult;
-
-  if (data_index >= valid_mult_list.length ())
-    valid_mult_list.safe_grow_cleared (data_index + 1);
-
-  valid_mult = valid_mult_list[data_index];
-  if (!valid_mult)
-    {
-      machine_mode address_mode = targetm.addr_space.address_mode (as);
-      rtx reg1 = gen_raw_REG (address_mode, LAST_VIRTUAL_REGISTER + 1);
-      rtx reg2 = gen_raw_REG (address_mode, LAST_VIRTUAL_REGISTER + 2);
-      rtx addr, scaled;
-      HOST_WIDE_INT i;
-
-      valid_mult = sbitmap_alloc (2 * MAX_RATIO + 1);
-      bitmap_clear (valid_mult);
-      scaled = gen_rtx_fmt_ee (MULT, address_mode, reg1, NULL_RTX);
-      addr = gen_rtx_fmt_ee (PLUS, address_mode, scaled, reg2);
-      for (i = -MAX_RATIO; i <= MAX_RATIO; i++)
-       {
-         XEXP (scaled, 1) = gen_int_mode (i, address_mode);
-         if (memory_address_addr_space_p (mode, addr, as)
-             || memory_address_addr_space_p (mode, scaled, as))
-           bitmap_set_bit (valid_mult, i + MAX_RATIO);
-       }
-
-      if (dump_file && (dump_flags & TDF_DETAILS))
-       {
-         fprintf (dump_file, "  allowed multipliers:");
-         for (i = -MAX_RATIO; i <= MAX_RATIO; i++)
-           if (bitmap_bit_p (valid_mult, i + MAX_RATIO))
-             fprintf (dump_file, " %d", (int) i);
-         fprintf (dump_file, "\n");
-         fprintf (dump_file, "\n");
-       }
-
-      valid_mult_list[data_index] = valid_mult;
-    }
-
-  if (ratio > MAX_RATIO || ratio < -MAX_RATIO)
-    return false;
-
-  return bitmap_bit_p (valid_mult, ratio + MAX_RATIO);
-}
-
  /* Calculate the SPEED or size cost of shiftadd EXPR in MODE.  MULT is the
     EXPR operand holding the shift.  COST0 and COST1 are the costs for
     calculating the operands of EXPR.  Returns true if successful, and returns
index 004a2c9dccb5559adfd3fba17c058326b684cf3d..f8f31e9385645cfda4ff58c76bbc5de9707d0ad6 100644 (file)
@@ -29,8 +29,6 @@ extern bool contains_abnormal_ssa_name_p (tree);
 extern struct loop *outermost_invariant_loop_for_expr (struct loop *, tree);
 extern bool expr_invariant_in_loop_p (struct loop *, tree);
 bool may_be_nonaddressable_p (tree expr);
-bool multiplier_allowed_in_address_p (HOST_WIDE_INT, machine_mode,
-                                     addr_space_t);
 void tree_ssa_iv_optimize (void);
 
 #endif /* GCC_TREE_SSA_LOOP_IVOPTS_H */