IA MCU psABI support: changes to libraries
[gcc.git] / gcc / tree-ssa-live.c
index 0f32b14a8634515ac0f80e82e606d223d3ff5a1a..450cf90d2efb598e273f889eb042f2aa933de577 100644 (file)
@@ -22,7 +22,6 @@ along with GCC; see the file COPYING3.  If not see
 #include "system.h"
 #include "coretypes.h"
 #include "tm.h"
-#include "input.h"
 #include "alias.h"
 #include "symtab.h"
 #include "tree.h"
@@ -39,7 +38,6 @@ along with GCC; see the file COPYING3.  If not see
 #include "tree-ssa-alias.h"
 #include "internal-fn.h"
 #include "gimple-expr.h"
-#include "is-a.h"
 #include "gimple.h"
 #include "gimple-iterator.h"
 #include "gimple-ssa.h"
@@ -66,7 +64,6 @@ along with GCC; see the file COPYING3.  If not see
 #include "debug.h"
 #include "tree-ssa.h"
 #include "lto-streamer.h"
-#include "ipa-ref.h"
 #include "cgraph.h"
 #include "ipa-utils.h"
 
@@ -89,6 +86,88 @@ static void  verify_live_on_entry (tree_live_info_p);
    ssa_name or variable, and vice versa.  */
 
 
+/* Hashtable helpers.  */
+
+struct tree_int_map_hasher : nofree_ptr_hash <tree_int_map>
+{
+  static inline hashval_t hash (const tree_int_map *);
+  static inline bool equal (const tree_int_map *, const tree_int_map *);
+};
+
+inline hashval_t
+tree_int_map_hasher::hash (const tree_int_map *v)
+{
+  return tree_map_base_hash (v);
+}
+
+inline bool
+tree_int_map_hasher::equal (const tree_int_map *v, const tree_int_map *c)
+{
+  return tree_int_map_eq (v, c);
+}
+
+
+/* This routine will initialize the basevar fields of MAP.  */
+
+static void
+var_map_base_init (var_map map)
+{
+  int x, num_part;
+  tree var;
+  struct tree_int_map *m, *mapstorage;
+
+  num_part = num_var_partitions (map);
+  hash_table<tree_int_map_hasher> tree_to_index (num_part);
+  /* We can have at most num_part entries in the hash tables, so it's
+     enough to allocate so many map elements once, saving some malloc
+     calls.  */
+  mapstorage = m = XNEWVEC (struct tree_int_map, num_part);
+
+  /* If a base table already exists, clear it, otherwise create it.  */
+  free (map->partition_to_base_index);
+  map->partition_to_base_index = (int *) xmalloc (sizeof (int) * num_part);
+
+  /* Build the base variable list, and point partitions at their bases.  */
+  for (x = 0; x < num_part; x++)
+    {
+      struct tree_int_map **slot;
+      unsigned baseindex;
+      var = partition_to_var (map, x);
+      if (SSA_NAME_VAR (var)
+         && (!VAR_P (SSA_NAME_VAR (var))
+             || !DECL_IGNORED_P (SSA_NAME_VAR (var))))
+       m->base.from = SSA_NAME_VAR (var);
+      else
+       /* This restricts what anonymous SSA names we can coalesce
+          as it restricts the sets we compute conflicts for.
+          Using TREE_TYPE to generate sets is the easies as
+          type equivalency also holds for SSA names with the same
+          underlying decl. 
+
+          Check gimple_can_coalesce_p when changing this code.  */
+       m->base.from = (TYPE_CANONICAL (TREE_TYPE (var))
+                       ? TYPE_CANONICAL (TREE_TYPE (var))
+                       : TREE_TYPE (var));
+      /* If base variable hasn't been seen, set it up.  */
+      slot = tree_to_index.find_slot (m, INSERT);
+      if (!*slot)
+       {
+         baseindex = m - mapstorage;
+         m->to = baseindex;
+         *slot = m;
+         m++;
+       }
+      else
+       baseindex = (*slot)->to;
+      map->partition_to_base_index[x] = baseindex;
+    }
+
+  map->num_basevars = m - mapstorage;
+
+  free (mapstorage);
+}
+
+
 /* Remove the base table in MAP.  */
 
 static void
@@ -266,17 +345,21 @@ partition_view_fini (var_map map, bitmap selected)
 }
 
 
-/* Create a partition view which includes all the used partitions in MAP.  */
+/* Create a partition view which includes all the used partitions in MAP.  If
+   WANT_BASES is true, create the base variable map as well.  */
 
 void
-partition_view_normal (var_map map)
+partition_view_normal (var_map map, bool want_bases)
 {
   bitmap used;
 
   used = partition_view_init (map);
   partition_view_fini (map, used);
 
-  var_map_base_fini (map);
+  if (want_bases)
+    var_map_base_init (map);
+  else
+    var_map_base_fini (map);
 }
 
 
@@ -285,7 +368,7 @@ partition_view_normal (var_map map)
    as well.  */
 
 void
-partition_view_bitmap (var_map map, bitmap only)
+partition_view_bitmap (var_map map, bitmap only, bool want_bases)
 {
   bitmap used;
   bitmap new_partitions = BITMAP_ALLOC (NULL);
@@ -301,7 +384,10 @@ partition_view_bitmap (var_map map, bitmap only)
     }
   partition_view_fini (map, new_partitions);
 
-  var_map_base_fini (map);
+  if (want_bases)
+    var_map_base_init (map);
+  else
+    var_map_base_fini (map);
 }