---
 gcc/ipa-dfe.c                  | 262 +++++++-------
 gcc/ipa-dfe.h                  | 108 +++---
 gcc/ipa-field-reorder.c        | 134 +++----
 gcc/ipa-type-escape-analysis.c | 636 ++++++++++++++++-----------------
 gcc/ipa-type-escape-analysis.h | 160 ++++-----
 5 files changed, 643 insertions(+), 657 deletions(-)

diff --git a/gcc/ipa-dfe.c b/gcc/ipa-dfe.c
index 7ab718c3628..98427e8e423 100644
--- a/gcc/ipa-dfe.c
+++ b/gcc/ipa-dfe.c
@@ -129,31 +129,31 @@ along with GCC; see the file COPYING3.  If not see
  * Find all non_escaping types which point to RECORD_TYPEs in
  * record_field_offset_map.
  */
-std::set<tree>
-get_all_types_pointing_to (record_field_offset_map_t record_field_offset_map,
-                          tpartitions_t casting)
+void
+get_all_types_pointing_to (record_field_offset_map4_t &record_field_offset_map2,
+                          tpartitions2_t casting,
+                          hash_set<tree> &to_modify2)
 {
-  const tset_t &non_escaping = casting.non_escaping;
+  tset2_t &non_escaping = casting.non_escaping;
 -  std::set<tree> specific_types;
   type_stringifier stringifier;
+  hash_set<tree> specific_types2;
    // Here we are just placing the types of interest in a set.
-  for (std::map<tree, field_offsets_t>::const_iterator i
-       = record_field_offset_map.begin (),
-       e = record_field_offset_map.end ();
+  for (hash_map<tree, field_offsets2_t*>::iterator i
+       = record_field_offset_map2.begin (),
+       e = record_field_offset_map2.end ();
        i != e; ++i)
     {
-      tree record = i->first;
-      std::string name = stringifier.stringify (record);
-      specific_types.insert (record);
+      tree record = (*i).first;
+      specific_types2.add (record);
     }
 -  specific_type_collector specifier (specific_types);
+  specific_type_collector specifier (&specific_types2);
// SpecificTypeCollector will collect all types which point to the types in
   // the set.
-  for (std::set<tree>::const_iterator i = non_escaping.begin (),
+  for (auto i = non_escaping.begin (),
                                            e = non_escaping.end ();
        i != e; ++i)
     {
@@ -162,8 +162,11 @@ get_all_types_pointing_to (record_field_offset_map_t record_field_offset_map,
     }
    // These are all the types which need modifications.
-  std::set<tree> to_modify = specifier.get_set ();
-  return to_modify;
+  hash_set<tree> to_modify = specifier.get_set2 ();
+ for (hash_set<tree>::iterator i = to_modify.begin(), e = to_modify.end(); i != e; ++i)
+  {
+    to_modify2.add (*i);
+  }
 }
/* record_field_offset_map holds information on which FIELD_DECLs might be @@ -180,13 +183,13 @@ get_all_types_pointing_to (record_field_offset_map_t record_field_offset_map,
  * The second maps old FIELD_DECLs trees to the new FIELD_DECLs.
  */
 reorg_maps_t
-get_types_replacement (record_field_offset_map_t record_field_offset_map,
-                      std::set<tree> to_modify)
+get_types_replacement (record_field_offset_map4_t &record_field_offset_map2, + hash_set<tree> &to_modify, reorg_record_map2_t &map2, reorg_field_map2_t &field_map2)
 {
   type_stringifier stringifier;
 -  type_reconstructor reconstructor (record_field_offset_map, "reorg");
-  for (std::set<tree>::const_iterator i = to_modify.begin (),
+ type_reconstructor reconstructor (record_field_offset_map2, "reorg", map2, field_map2);
+  for (hash_set<tree>::iterator i = to_modify.begin (),
                                            e = to_modify.end ();
        i != e; ++i)
     {
@@ -194,7 +197,7 @@ get_types_replacement (record_field_offset_map_t record_field_offset_map,
       reconstructor.walk (TYPE_MAIN_VARIANT (record));
     }
 -  for (std::set<tree>::const_iterator i = to_modify.begin (),
+  for (hash_set<tree>::iterator i = to_modify.begin (),
                                            e = to_modify.end ();
        i != e; ++i)
     {
@@ -202,20 +205,17 @@ get_types_replacement (record_field_offset_map_t record_field_offset_map,
       reconstructor.walk (record);
     }
 -  reorg_record_map_t map = reconstructor.get_map ();
-  reorg_field_map_t field_map = reconstructor.get_field_map ();
-
// Here, we are just making sure that we are not doing anything too crazy.
   // Also, we found some types for which TYPE_CACHED_VALUES_P is not being
// rewritten. This is probably indicative of a bug in TypeReconstructor.
-  for (std::map<tree, tree>::const_iterator i = map.begin (),
-                                                 e = map.end ();
+  for (hash_map<tree, tree>::iterator i = map2.begin (),
+                                                 e = map2.end ();
        i != e; ++i)
     {
-      tree o_record = i->first;
+      tree o_record = (*i).first;
       std::string o_name = stringifier.stringify (o_record);
       log ("original: %s\n", o_name.c_str ());
-      tree r_record = i->second;
+      tree r_record = (*i).second;
       std::string r_name
        = r_record ? stringifier.stringify (r_record) : std::string ("");
       log ("modified: %s\n", r_name.c_str ());
@@ -227,16 +227,17 @@ get_types_replacement (record_field_offset_map_t record_field_offset_map,
       TYPE_CACHED_VALUES_P (_o_record) = false;
       TYPE_CACHED_VALUES_P (m_record) = false;
 -      bool in_map = map.find (m_record) != map.end ();
+      bool in_map = map2.get (m_record);
       if (!in_map)
        continue;
-      tree mm_record = map[m_record];
+      tree mm_record = *map2.get (m_record);
       // Info: I think this is no longer needed...
       // Please verify
       TYPE_MAIN_VARIANT (r_record) = mm_record;
     }
 -  return std::make_pair (map, field_map);
+  // TODO: Ok, we will need to change this some time...
+  return std::make_pair (&map2, &field_map2);
 }
  /* Walk the gimple program and substitute
@@ -244,8 +245,8 @@ get_types_replacement (record_field_offset_map_t record_field_offset_map,
  * * the trees in field_map with field_map's values.
  */
 void
-substitute_types_in_program (reorg_record_map_t map,
-                            reorg_field_map_t field_map, bool _delete)
+substitute_types_in_program (reorg_record_map2_t &map,
+                            reorg_field_map2_t &field_map, bool _delete)
 {
   gimple_type_rewriter rewriter (map, field_map, _delete);
   rewriter.walk ();
@@ -255,46 +256,46 @@ substitute_types_in_program (reorg_record_map_t map,
 /* Return a set of trees which point to the set of trees
  * that can be modified.
  */
-std::set<tree>
-specific_type_collector::get_set ()
+hash_set<tree>
+specific_type_collector::get_set2 ()
 {
-  return to_return;
+  return to_return2;
 }
  void
 specific_type_collector::_walk_POINTER_TYPE_pre (tree t)
 {
-  path.insert (t);
+  path2.add (t);
 }
  void
 specific_type_collector::_walk_POINTER_TYPE_post (tree t)
 {
-  path.erase (t);
+  path2.remove (t);
 }
  void
 specific_type_collector::_walk_ARRAY_TYPE_pre (tree t)
 {
-  path.insert (t);
+  path2.add (t);
 }
  void
 specific_type_collector::_walk_ARRAY_TYPE_post (tree t)
 {
-  path.erase (t);
+  path2.remove (t);
 }
  void
 specific_type_collector::_walk_UNION_TYPE_pre (tree t)
 {
-  path.insert (t);
+  path2.add (t);
 }
  void
 specific_type_collector::_walk_UNION_TYPE_post (tree t)
 {
-  path.erase (t);
+  path2.remove (t);
 }
  /* If we find a RECORD_TYPE which is of interest, place
@@ -304,51 +305,32 @@ void
 specific_type_collector::_walk_RECORD_TYPE_pre (tree t)
 {
   const bool in_set
-    = _collect_these_types.find (t) != _collect_these_types.end ();
+    = _collect_these_types2->contains (t);
   const bool must_collect = in_set;
-  path.insert (t);
+  path2.add (t);
   if (!must_collect)
     return;
 -  for (std::set<tree>::const_iterator i = path.begin (),
-                                           e = path.end ();
-       i != e; ++i)
-    {
+ for (hash_set<tree>::iterator i = path2.begin(), e = path2.end(); i != e; ++i)
+  {
       tree type = *i;
-      to_return.insert (type);
-    }
+      to_return2.add (type);
+  }
+
 }
  void
 specific_type_collector::_walk_RECORD_TYPE_post (tree t)
 {
-  path.erase (t);
-}
-
-/*
- * old RECORD_TYPE -> new RECORD_TYPE.
- */
-reorg_record_map_t
-type_reconstructor::get_map ()
-{
-  return _reorg_map;
-}
-
-/*
- * old FIELD_DECL -> new FIELD_DECL.
- */
-reorg_field_map_t
-type_reconstructor::get_field_map ()
-{
-  return _reorg_fields;
+  path2.remove (t);
 }
  void
 type_reconstructor::set_is_not_modified_yet (tree t)
 {
   gcc_assert (t);
-  const bool is_in_reorg_map = _reorg_map.find (t) != _reorg_map.end ();
-  modified_map[t] = false;
+  const bool is_in_reorg_map = _reorg_map2.get (t);
+  modified_map2->put(t, false);
   if (is_in_reorg_map)
     mark_all_pointing_here_as_modified ();
 @@ -356,11 +338,11 @@ type_reconstructor::set_is_not_modified_yet (tree t)
   if (!tt)
     return;
- const bool is_in_reorg_map_2 = _reorg_map.find (tt) != _reorg_map.end ();
+  const bool is_in_reorg_map_2 = _reorg_map2.get (tt);
   if (!is_in_reorg_map_2)
     return;
 -  tree type = _reorg_map[tt];
+  tree type = *_reorg_map2.get(tt);
   bool is_modified
= strstr (type_stringifier::get_type_identifier (type).c_str (), ".reorg");
   is_modified
@@ -375,10 +357,10 @@ type_reconstructor::set_is_not_modified_yet (tree t)
 void
 type_reconstructor::mark_all_pointing_here_as_modified ()
 {
-  for (is_modified_map_t::iterator i = modified_map.begin (),
-       e = modified_map.end (); i != e; ++i)
+  for (is_modified_map2_t::iterator i = modified_map2->begin (),
+       e = modified_map2->end (); i != e; ++i)
     {
-      i->second = true;
+      (*i).second = true;
     }
 }
 @@ -386,10 +368,10 @@ bool
 type_reconstructor::get_is_modified (tree t)
 {
   gcc_assert (t);
-  const bool in_map = modified_map.find (t) != modified_map.end ();
+  const bool in_map = modified_map2->get(t);
   gcc_assert (in_map);
-  bool retval = modified_map[t];
-  modified_map.erase (t);
+  bool retval = *modified_map2->get(t);
+  modified_map2->remove (t);
    bool points_to_record = false;
   tree _t = tree_to_tree (t);
@@ -406,7 +388,7 @@ type_reconstructor::get_is_modified (tree t)
 bool
 type_reconstructor::is_memoized (tree t)
 {
-  const bool already_changed = _reorg_map.find (t) != _reorg_map.end ();
+  const bool already_changed = _reorg_map2.get (t);
   mark_all_pointing_here_as_modified ();
   return already_changed;
 }
@@ -449,7 +431,7 @@ get_new_identifier (tree type, const char *suffix)
 void
 type_reconstructor::_walk_ARRAY_TYPE_pre (tree t)
 {
-  for_reference.push (t);
+  for_reference2.safe_push(t);
   set_is_not_modified_yet (t);
    tree _t = tree_to_tree (t);
@@ -463,23 +445,23 @@ type_reconstructor::_walk_ARRAY_TYPE_pre (tree t)
       TYPE_MIN_VALUE (copy_domain) = copy_node (min);
       TYPE_MAX_VALUE (copy_domain) = copy_node (max);
     }
-  in_progress.push (copy);
+  in_progress2.safe_push (copy);
 }
  void
 type_reconstructor::_walk_ARRAY_TYPE_post (tree t)
 {
-  tree t2 = for_reference.top ();
+  tree t2 = for_reference2.last ();
   gcc_assert (t2 == t);
-  for_reference.pop ();
-  tree copy = in_progress.top ();
-  in_progress.pop ();
+  for_reference2.pop ();
+  tree copy = in_progress2.last ();
+  in_progress2.pop ();
    bool is_modified = get_is_modified (t);
    TREE_TYPE (copy) = build_variant_type_copy (TREE_TYPE (copy));
   copy = is_modified ? build_distinct_type_copy (copy) : copy;
- TREE_TYPE (copy) = is_modified ? _reorg_map[TREE_TYPE (t)] : TREE_TYPE (copy); + TREE_TYPE (copy) = is_modified ? *_reorg_map2.get(TREE_TYPE (t)) : TREE_TYPE (copy);
   TYPE_NAME (copy) = is_modified
                       ? get_new_identifier (copy, this->get_new_suffix ())
                       : TYPE_NAME (copy);
@@ -508,33 +490,33 @@ type_reconstructor::_walk_ARRAY_TYPE_post (tree t)
   if (!points_to_record)
     return;
 -  _reorg_map[t] = is_modified ? copy : _t;
+  _reorg_map2.put (t, is_modified ? copy : _t);
 }
  void
 type_reconstructor::_walk_POINTER_TYPE_pre (tree t)
 {
-  for_reference.push (t);
+  for_reference2.safe_push (t);
   set_is_not_modified_yet (t);
    tree _t = tree_to_tree (t);
   tree copy = build_variant_type_copy (_t);
-  in_progress.push (copy);
+  in_progress2.safe_push (copy);
 }
  void
 type_reconstructor::_walk_POINTER_TYPE_post (tree t)
 {
-  tree t2 = for_reference.top ();
+  tree t2 = for_reference2.last ();
   gcc_assert (t2 == t);
-  for_reference.pop ();
-  tree copy = in_progress.top ();
-  in_progress.pop ();
+  for_reference2.pop ();
+  tree copy = in_progress2.last ();
+  in_progress2.pop ();
    bool is_modified = get_is_modified (t);
    copy = is_modified ? build_variant_type_copy (copy) : copy;
- TREE_TYPE (copy) = is_modified ? _reorg_map[TREE_TYPE (t)] : TREE_TYPE (copy); + TREE_TYPE (copy) = is_modified ? *_reorg_map2.get(TREE_TYPE (t)) : TREE_TYPE (copy);
   TYPE_NAME (copy) = is_modified
                       ? get_new_identifier (copy, this->get_new_suffix ())
                       : TYPE_NAME (copy);
@@ -550,7 +532,7 @@ type_reconstructor::_walk_POINTER_TYPE_post (tree t)
   if (!points_to_record)
     return;
 -  _reorg_map[t] = is_modified ? copy : _t;
+  _reorg_map2.put(t, is_modified ? copy : _t);
 }
  void
@@ -566,26 +548,26 @@ type_reconstructor::_walk_RECORD_TYPE_pre (tree t)
     }
    set_is_not_modified_yet (t);
-  for_reference.push (t);
+  for_reference2.safe_push (t);
   // We don't know if we will modify this type t
   // So, let's make a copy.  Just in case.
   tree _t = tree_to_tree (t);
   tree copy = build_variant_type_copy (_t);
-  in_progress.push (copy);
-  field_list_stack.push (field_tuple_list_t ());
+  in_progress2.safe_push (copy);
+  field_list2_stack2.safe_push (vNULL);
 }
  void
 type_reconstructor::_walk_RECORD_TYPE_post (tree t)
 {
-  tree t2 = for_reference.top ();
+  tree t2 = for_reference2.last ();
   gcc_assert (t2 == t);
-  for_reference.pop ();
+  for_reference2.pop ();
 -  tree copy = in_progress.top ();
-  in_progress.pop ();
-  field_tuple_list_t field_tuple_list = field_list_stack.top ();
-  field_list_stack.pop ();
+  tree copy = in_progress2.last ();
+  in_progress2.pop ();
+  field_tuple_list2_t field_tuple_list2 = field_list2_stack2.last ();
+  field_list2_stack2.pop ();
    // So, here all the work has been done to make sure
   // that the fields produced a field_tuple_list_t
@@ -596,8 +578,8 @@ type_reconstructor::_walk_RECORD_TYPE_post (tree t)
   // of the copy
   bool is_modified = get_is_modified (t);
   tree prev_field = NULL;
-  for (field_tuple_list_t::iterator i = field_tuple_list.begin (),
-       e = field_tuple_list.end (); i != e; ++i)
+  for (auto i = field_tuple_list2.begin (),
+       e = field_tuple_list2.end (); i != e; ++i)
     {
       field_tuple_t field_tuple = *i;
       tree modified_field = field_tuple.second;
@@ -630,7 +612,7 @@ type_reconstructor::_walk_RECORD_TYPE_post (tree t)
   if (!is_main_variant)
     {
       tree main = TYPE_MAIN_VARIANT (t);
-      tree main_reorg = _reorg_map[main];
+      tree main_reorg = *_reorg_map2.get(main);
       tree copy_variant = build_variant_type_copy (main_reorg);
       TYPE_NAME (copy_variant)
        = get_new_identifier (copy, this->get_new_suffix ());
@@ -638,7 +620,7 @@ type_reconstructor::_walk_RECORD_TYPE_post (tree t)
       TYPE_MAIN_VARIANT (copy_variant) = main_reorg;
       TYPE_SIZE (main_reorg) = NULL;
       layout_type (copy_variant);
-      _reorg_map[t] = copy_variant;
+      _reorg_map2.put(t, copy_variant);
     }
   else
     {
@@ -654,10 +636,10 @@ type_reconstructor::_walk_RECORD_TYPE_post (tree t)
       if (is_modified)
        layout_type (copy);
       tree _t = tree_to_tree (t);
-      _reorg_map[t] = is_modified ? copy : _t;
+      _reorg_map2.put(t, is_modified ? copy : _t);
     }
 -  tree record = _reorg_map[t];
+  tree record = *_reorg_map2.get(t);
for (tree field = TYPE_FIELDS (record); field; field = DECL_CHAIN (field))
     {
       relayout_decl (field);
@@ -667,7 +649,7 @@ type_reconstructor::_walk_RECORD_TYPE_post (tree t)
 void
 type_reconstructor::_walk_field_pre (tree t)
 {
-  for_reference.push (t);
+  for_reference2.safe_push (t);
   // We don't know if we will rewrite the field
   // that we are working on.  So proactively, let's make
   // a copy.
@@ -677,49 +659,51 @@ type_reconstructor::_walk_field_pre (tree t)
   TREE_TYPE (copy) = type_copy;
   // To communicate this field to the other methods,
   // let's put it in the "in_progress" stack.
-  in_progress.push (copy);
+  in_progress2.safe_push (copy);
 }
  void
 type_reconstructor::_walk_field_post (tree t)
 {
-  tree t2 = for_reference.top ();
+  tree t2 = for_reference2.last ();
   gcc_assert (t2 == t);
-  for_reference.pop ();
+  for_reference2.pop ();
    // Let's get the copy we were working on.
-  tree copy = in_progress.top ();
+  tree copy = in_progress2.last ();
   // Let's put the stack in the same position...
-  in_progress.pop ();
+  in_progress2.pop ();
    // What record does this field belongs to?
-  tree record = for_reference.top ();
+  tree record = for_reference2.last ();
 -  field_offsets_t field_offsets = _records[record];
+  field_offsets2_t **field_offsets_ptr = _records2.get(record);
+  if (!field_offsets_ptr) return;
+  field_offsets2_t *field_offsets = *field_offsets_ptr;
   // What's the field offset?
   unsigned f_byte_offset = tree_to_uhwi (DECL_FIELD_OFFSET (t));
   unsigned f_bit_offset = tree_to_uhwi (DECL_FIELD_BIT_OFFSET (t));
   unsigned f_offset = 8 * f_byte_offset + f_bit_offset;
    const bool can_field_be_deleted
-    = field_offsets.find (f_offset) != field_offsets.end ();
+    = field_offsets->contains (f_offset);
   if (can_field_be_deleted)
     mark_all_pointing_here_as_modified ();
   tree original_type = TREE_TYPE (t);
   const bool type_memoized = is_memoized (original_type);
    TREE_TYPE (copy)
-    = type_memoized ? _reorg_map[original_type] : TREE_TYPE (copy);
+    = type_memoized ? *_reorg_map2.get(original_type) : TREE_TYPE (copy);
field_tuple_t tuple = std::make_pair (t, can_field_be_deleted ? NULL : copy);
    // Put the field into the vector
-  field_tuple_list_t &field_tuple_list = field_list_stack.top ();
-  field_tuple_list.push_back (tuple);
- const bool already_has_field = _reorg_fields.find (t) != _reorg_fields.end ();
+  field_tuple_list2_t &field_tuple_list2 = field_list2_stack2.last ();
+  field_tuple_list2.safe_push (tuple);
+  const bool already_has_field = _reorg_fields2.get (t);
   if (already_has_field)
     return;
-  _reorg_fields[t] = std::make_pair (copy, can_field_be_deleted);
+  _reorg_fields2.put(t, std::make_pair (copy, can_field_be_deleted));
 }
  // Relayout parameters
@@ -755,11 +739,11 @@ expr_type_rewriter::_walk_FUNCTION_DECL_post (tree t)
   // Therefore it is awkward to do this in the expr-walker...
   // const bool is_interesting = is_interesting_type (ret_type);
   // Instead use the following map
-  const bool is_interesting = _map.find (ret_type) != _map.end ();
+  const bool is_interesting = _map2.get (ret_type);
   if (!is_interesting)
     return;
 -  tree r_t = _map[ret_type];
+  tree r_t = *_map2.get(ret_type);
   TREE_TYPE (fn_type) = r_t;
 }
 @@ -769,7 +753,7 @@ expr_type_rewriter::_walk_MEM_REF_post (tree e)
 {
   tree op0 = TREE_OPERAND (e, 0);
   tree t2 = TREE_TYPE (op0);
-  const bool in_map2 = _map.find (t2) != _map.end ();
+  const bool in_map2 = _map2.get(t2);
    log ("trying out substituting expression in component_Ref directly\n");
   type_stringifier stringifier;
@@ -778,7 +762,7 @@ expr_type_rewriter::_walk_MEM_REF_post (tree e)
   if (in_map2)
     {
       log ("success\n");
-      tree r_t = _map[t2];
+      tree r_t = *_map2.get(t2);
       tree _e = tree_to_tree (op0);
       TREE_TYPE (_e) = r_t;
     }
@@ -794,7 +778,7 @@ expr_type_rewriter::_walk_MEM_REF_post (tree e)
   if (!already_rewritten)
     return;
 -  tree old_type = _imap[t];
+  tree old_type = *_imap2.get(t);
   assert_is_type (old_type, POINTER_TYPE);
   tree old_base_type = TREE_TYPE (old_type);
   tree old_type_size_tree = TYPE_SIZE_UNIT (old_base_type);
@@ -823,12 +807,12 @@ expr_type_rewriter::_walk_MEM_REF_post (tree e)
 bool
 expr_type_rewriter::is_interesting_type (tree t)
 {
-  const bool in_imap = _imap.find (t) != _imap.end ();
-  bool interesting = in_imap;
+  const bool in_imap2 = _imap2.get(t);
+  bool interesting = in_imap2;
   if (!interesting)
     return false;
 -  tree const_possibly_copy = _imap[t];
+  tree const_possibly_copy = *_imap2.get(t);
   tree possibly_copy = tree_to_tree (const_possibly_copy);
   const bool is_copy = possibly_copy == t;
   interesting = !is_copy;
@@ -870,7 +854,7 @@ expr_type_rewriter::handle_pointer_arithmetic_diff (gimple *s, tree op_0)
   tree reorg_type_size_tree = TYPE_SIZE_UNIT (inner_reorg_type);
   int reorg_type_size_int = tree_to_shwi (reorg_type_size_tree);
 -  tree const_old_type = _imap[reorg_type];
+  tree const_old_type = *_imap2.get(reorg_type);
   tree old_type = tree_to_tree (const_old_type);
   tree inner_old_type = TREE_TYPE (old_type);
   gcc_assert (old_type);
@@ -985,7 +969,7 @@ expr_type_rewriter::handle_pointer_arithmetic_nonconstant (gimple *s, tree op_0,
   tree reorg_type_size_tree = TYPE_SIZE_UNIT (reorg_inner_type);
   int reorg_type_size_int = tree_to_shwi (reorg_type_size_tree);
   // That means that the old type is
-  tree const_old_type_tree = _imap[reorg_type_tree];
+  tree const_old_type_tree = *_imap2.get(reorg_type_tree);
   tree old_type_tree = tree_to_tree (const_old_type_tree);
   tree old_inner_type = TREE_TYPE (old_type_tree);
   tree old_type_size_tree = TYPE_SIZE_UNIT (old_inner_type);
@@ -1061,7 +1045,7 @@ expr_type_rewriter::handle_pointer_arithmetic_constants (gimple *s, tree p,
     return;
tree reorg_type = possibly_reorged_type; // this is the type of the variable
-  tree original_type = _imap[reorg_type];
+  tree original_type = *_imap2.get(reorg_type);
   // If we are here, that means that our type has the ".reorg" suffix
   // Let's add a sanity check
   bool has_suffix
@@ -1110,11 +1094,11 @@ expr_type_rewriter::_walk_post (tree e)
 {
   gcc_assert (e);
   tree t = TREE_TYPE (e);
-  const bool in_map = _map.find (t) != _map.end ();
+  const bool in_map = _map2.get(t);
   if (!in_map)
     return;
 -  tree r_t = _map[t];
+  tree r_t = *_map2.get(t);
   tree _e = tree_to_tree (e);
   TREE_TYPE (_e) = r_t;
 }
@@ -1127,11 +1111,11 @@ expr_type_rewriter::_walk_COMPONENT_REF_post (tree e)
    tree f = TREE_OPERAND (e, 1);
   // So, what we need is a map between this field and the new field
-  const bool in_map = _map2.find (f) != _map2.end ();
+  const bool in_map = _fields2.get(f);
   if (!in_map)
     return;
 -  std::pair<tree, bool> p = _map2[f];
+  std::pair<tree, bool> p = *_fields2.get(f);
   tree n_f = p.first;
   bool is_deleted = p.second;
   tree _e = tree_to_tree (e);
diff --git a/gcc/ipa-dfe.h b/gcc/ipa-dfe.h
index 45a68f9039a..180fdc9e2db 100644
--- a/gcc/ipa-dfe.h
+++ b/gcc/ipa-dfe.h
@@ -29,21 +29,20 @@ class specific_type_collector : public type_walker
 {
 public:
   /* C is the set of types that are to be looked for.  */
-  specific_type_collector (std::set<tree> &c) : _collect_these_types (c)
+  specific_type_collector (hash_set<tree> *c2) : _collect_these_types2 (c2)
   {};
    /* Get final result of all types which point to types in C.  */
-  std::set<tree> get_set ();
+  hash_set<tree> get_set2 ();
  private:
-  /* _collect_these_types holds the input.  */
-  const std::set<tree> &_collect_these_types;
+  hash_set<tree> *_collect_these_types2;
    /* Working set that holds final result.  */
-  std::set<tree> to_return;
+  hash_set<tree> to_return2;
    /* Sets which reach current subtype.  */
-  std::set<tree> path;
+  hash_set<tree> path2;
    /* Push or pop from path.  */
   virtual void _walk_ARRAY_TYPE_pre (tree t);
@@ -59,68 +58,68 @@ private:
 };
  /* Map old RECORD_TYPE -> new RECORD_TYPE.  */
-typedef std::map<tree, tree> reorg_record_map_t;
+typedef hash_map<tree, tree> reorg_record_map2_t;
  /* Map RECORD_TYPE -> (FIELD_DECL -> delete).  */
-typedef std::map<tree, std::pair<tree, bool> > reorg_field_map_t;
+typedef hash_map<tree, std::pair<tree, bool> > reorg_field_map2_t;
  /* Class used to create new types derived from types that have fields
  * that can be deleted.  */
 class type_reconstructor : public type_walker
 {
 public:
- type_reconstructor (record_field_offset_map_t records, const char *suffix)
-    : _records (records), _suffix (suffix)
-  {};
+ type_reconstructor (record_field_offset_map4_t &records, const char *suffix, reorg_record_map2_t &a, reorg_field_map2_t &b) + : _records2(records), _suffix (suffix), in_progress2(vNULL), for_reference2(vNULL), field_list2_stack2 (vNULL), _reorg_map2(a), _reorg_fields2(b)
+  {
+    modified_map2 = new is_modified_map2_t;
+  };
+  ~type_reconstructor()
+  {
+    delete modified_map2;
+  }
    /* Whether a type has already been modified.  */
   virtual bool is_memoized (tree t);
 -  // Final result for record map.
-  reorg_record_map_t get_map ();
-
-  /* Final result for field map.  */
-  reorg_field_map_t get_field_map ();
-
   /* Map RECORD_TYPE -> is_modified.  */
-  typedef std::map<tree, bool> is_modified_map_t;
+  typedef hash_map<tree, bool> is_modified_map2_t;
  protected:
-  const char *get_new_suffix ();
+  // Which records can be modified.
+  record_field_offset_map4_t& _records2;
+
+  // The new suffix
+  const char *_suffix;
    // Modifications to the current sub_type
-  std::stack<tree> in_progress;
+  vec<tree> in_progress2;
    // Path to current subtype
-  std::stack<tree> for_reference;
+  vec<tree> for_reference2;
    // OLD FIELD -> new FIELD
   typedef std::pair<tree, tree> field_tuple_t;
    // list of fields for new type
-  typedef std::vector<field_tuple_t> field_tuple_list_t;
+  typedef vec<field_tuple_t> field_tuple_list2_t;
    // to deal with nested structures we need to have a stack
   // of field_tuple_list_t
-  typedef std::stack<field_tuple_list_t> field_tuple_list_stack_t;
+  typedef vec<field_tuple_list2_t> field_tuple_list2_stack2_t;
 -  // Which records can be modified.
-  record_field_offset_map_t _records;
-
-  // The new suffix
-  const char *_suffix;
+  const char *get_new_suffix ();
    // Which fields will be deleted.
-  field_tuple_list_stack_t field_list_stack;
+  field_tuple_list2_stack2_t field_list2_stack2;
    // old RECORD_TYPE -> new RECORD_TYPE
-  reorg_record_map_t _reorg_map;
+  reorg_record_map2_t &_reorg_map2;
    // old FIELD_DECL -> new FIELD_DECL
-  reorg_field_map_t _reorg_fields;
+  reorg_field_map2_t &_reorg_fields2;
    // old RECORD_TYPE -> is_modified
-  is_modified_map_t modified_map;
+  is_modified_map2_t *modified_map2;
    // Keep track of which types may need to be modified
   // defaults to not modified.
@@ -156,20 +155,23 @@ private:
 class expr_type_rewriter : public expr_walker
 {
 public:
-  expr_type_rewriter (reorg_record_map_t map, reorg_field_map_t map2,
+  expr_type_rewriter (reorg_record_map2_t &map, reorg_field_map2_t &map2,
                    bool can_delete)
-    : _delete (false), _can_delete (can_delete), _map (map), _map2 (map2)
+    : _delete (false), _can_delete (can_delete), _map2(map), _fields2(map2)
   {
     /* Create an inverse map new RECORD_TYPE -> old RECORD_TYPE.  */
-    for (reorg_record_map_t::iterator i = map.begin (),
-       e = map.end (); i != e; ++i)
+    for (auto i = map.begin (), e = map.end (); i != e; ++i)
       {
-       tree original = i->first;
-       tree modified = i->second;
-       _imap[modified] = original;
+       tree original = (*i).first;
+       tree modified = (*i).second;
+       _imap2.put (modified, original);
       }
   };
 +  ~expr_type_rewriter()
+  {
+  };
+
   // Handle pointer arithmetic with constants.
   void handle_pointer_arithmetic_constants (gimple *s, tree p, tree i);
 @@ -189,13 +191,14 @@ public:
  private:
   // Old RECORD_TYPE -> new RECORD_TYPE.
-  reorg_record_map_t _map;
+  reorg_record_map2_t& _map2;
    // Old FIELD_DECL -> new FIELD_DECL.
-  reorg_field_map_t _map2;
+  reorg_field_map2_t& _fields2;
    // New RECORD_TYPE -> old RECORD_TYPE.
-  std::map<tree, tree> _imap;
+  hash_map<tree, tree> _imap2;
+
   void _walk_post (tree e);
    // Substitute types and create new offset.
@@ -215,7 +218,7 @@ private:
 class gimple_type_rewriter : public gimple_walker
 {
 public:
-  gimple_type_rewriter (reorg_record_map_t map, reorg_field_map_t map2,
+  gimple_type_rewriter (reorg_record_map2_t &map, reorg_field_map2_t &map2,
                      bool can_delete)
     : exprTypeRewriter (map, map2, can_delete)
   {};
@@ -237,21 +240,24 @@ private:
 };
  // Get a set of all types pointing to types in RECORD_FIELD_OFFSET_MAP.
-std::set<tree>
-get_all_types_pointing_to (record_field_offset_map_t record_field_offset_map,
-                          tpartitions_t casting);
+void
+get_all_types_pointing_to (record_field_offset_map4_t &record_field_offset_map,
+                          tpartitions2_t casting,
+                          hash_set<tree> &to_modify);
 -typedef std::pair<reorg_record_map_t, reorg_field_map_t> reorg_maps_t;
+typedef std::pair<reorg_record_map2_t*, reorg_field_map2_t*> reorg_maps_t;
  // Compute the replacement types.
 reorg_maps_t
-get_types_replacement (record_field_offset_map_t record_field_offset_map,
-                      std::set<tree> to_modify);
+get_types_replacement (record_field_offset_map4_t &record_field_offset_map,
+                      hash_set<tree> &to_modify,
+                      reorg_record_map2_t &,
+                      reorg_field_map2_t &);
  // Substitute types.
 void
-substitute_types_in_program (reorg_record_map_t map,
-                            reorg_field_map_t field_map, bool _delete);
+substitute_types_in_program (reorg_record_map2_t &map,
+                            reorg_field_map2_t &field_map, bool _delete);
  tree
 get_new_identifier (tree type, const char *suffix);
diff --git a/gcc/ipa-field-reorder.c b/gcc/ipa-field-reorder.c
index 70d26d71324..e4c2ff4a62b 100644
--- a/gcc/ipa-field-reorder.c
+++ b/gcc/ipa-field-reorder.c
@@ -142,7 +142,7 @@ bitpos_of_field (const tree fdecl)
 class GimpleAccesserFieldReordering : public gimple_accessor
 {
 public:
-  GimpleAccesserFieldReordering ()
+ GimpleAccesserFieldReordering (record_field_map4_t &map) : gimple_accessor (map)
   {};
  private:
@@ -170,9 +170,10 @@ private:
 class TypeReconstructorFieldReordering : public type_reconstructor
 {
 public:
-  TypeReconstructorFieldReordering (record_field_offset_map_t records,
-                                   const char *suffix)
-    : type_reconstructor (records, suffix)
+  TypeReconstructorFieldReordering (record_field_offset_map4_t &records,
+                                   const char *suffix,
+                                   reorg_record_map2_t &a, reorg_field_map2_t 
&b)
+    : type_reconstructor (records, suffix, a, b)
   {};
  private:
@@ -221,14 +222,14 @@ compare_FIELD_DECLs_TYPE_SIZE (tree _l, tree _r)
 void
 TypeReconstructorFieldReordering::_walk_RECORD_TYPE_post (tree t)
 {
-  tree t2 = for_reference.top ();
+  tree t2 = for_reference2.last ();
   gcc_assert (t2 == t);
-  for_reference.pop ();
+  for_reference2.pop ();
 -  tree copy = in_progress.top ();
-  in_progress.pop ();
-  field_tuple_list_t field_tuple_list = field_list_stack.top ();
-  field_list_stack.pop ();
+  tree copy = in_progress2.last ();
+  in_progress2.pop ();
+  field_tuple_list2_t field_tuple_list2 = field_list2_stack2.last ();
+  field_list2_stack2.pop ();
    // So, here all the work has been done to make sure
   // that the fields produced a field_tuple_list_t
@@ -237,10 +238,10 @@ TypeReconstructorFieldReordering::_walk_RECORD_TYPE_post (tree t)
   // So, now we want to do a couple of things.
   // First, collect all fields in a struct and make a copy of them
   bool is_modified = get_is_modified (t);
-  std::vector<tree> to_reorder;
+  vec<tree> to_reorder2 = vNULL;
   is_modified = true;
-  for (field_tuple_list_t::iterator i = field_tuple_list.begin (),
-       e = field_tuple_list.end ();
+  for (auto i = field_tuple_list2.begin (),
+       e = field_tuple_list2.end ();
        i != e; ++i)
     {
       field_tuple_t field_tuple = *i;
@@ -255,7 +256,7 @@ TypeReconstructorFieldReordering::_walk_RECORD_TYPE_post (tree t)
       log ("we can reorder %s ? %s\n",
           type_stringifier::get_field_identifier (field_tuple.first).c_str (),
           !modified_field ? "true" : "false");
-      to_reorder.push_back (
+      to_reorder2.safe_push(
        (tree) copy_node (tree_to_tree (field_tuple.first)));
     }
@@ -264,12 +265,12 @@ TypeReconstructorFieldReordering::_walk_RECORD_TYPE_post (tree t)
       tree prev_field = NULL;
       bool entered_loop = false;
       // Sort them
-      std::sort (to_reorder.begin (), to_reorder.end (),
+      std::sort (to_reorder2.begin (), to_reorder2.end (),
                 compare_FIELD_DECLs_TYPE_SIZE);
       is_modified = false;
 -      for (field_tuple_list_t::iterator i = field_tuple_list.begin (),
-          e = field_tuple_list.end ();
+      for (auto i = field_tuple_list2.begin (),
+          e = field_tuple_list2.end ();
           i != e; ++i)
        {
          field_tuple_t field_tuple = *i;
@@ -290,8 +291,8 @@ TypeReconstructorFieldReordering::_walk_RECORD_TYPE_post (tree t)
          gcc_assert (!modified_field && is_modified);
          // Create new TYPE_FIELDS with the order we want
-         for (std::vector<tree>::iterator j = to_reorder.begin (),
-               f = to_reorder.end (); j != f; ++j)
+         for (auto j = to_reorder2.begin (),
+               f = to_reorder2.end (); j != f; ++j)
            {
              entered_loop = true;
              tree current_field_inner = *j;
@@ -313,8 +314,8 @@ TypeReconstructorFieldReordering::_walk_RECORD_TYPE_post (tree t)
        }
        // Modify _reorg_fields map
-      for (std::vector<tree>::iterator i = to_reorder.begin (),
-               e = to_reorder.end (); i != e; ++i)
+      for (auto i = to_reorder2.begin (),
+               e = to_reorder2.end (); i != e; ++i)
        {
          tree to_find = *i;
          unsigned to_find_i = bitpos_of_field (tree_to_tree (to_find));
@@ -329,8 +330,7 @@ TypeReconstructorFieldReordering::_walk_RECORD_TYPE_post (tree t)
              unsigned haystack_i = bitpos_of_field (field);
              if (haystack_i == to_find_i)
                {
-                 _reorg_fields[field]
-                   = std::make_pair (tree_to_tree (to_find), false);
+ _reorg_fields2.put(field, std::make_pair (tree_to_tree (to_find), false));
                  log ("substituting %s for %s\n", to_find_str, haystack);
                }
            }
@@ -342,7 +342,7 @@ TypeReconstructorFieldReordering::_walk_RECORD_TYPE_post (tree t)
   if (!is_main_variant)
     {
       tree main = TYPE_MAIN_VARIANT (t);
-      tree main_reorg = _reorg_map[main];
+      tree main_reorg = *_reorg_map2.get(main);
       tree copy_variant = build_distinct_type_copy (main_reorg);
       TYPE_NAME (copy_variant)
        = get_new_identifier (copy, this->get_new_suffix ());
@@ -350,7 +350,7 @@ TypeReconstructorFieldReordering::_walk_RECORD_TYPE_post (tree t)
       TYPE_ALIAS_SET (copy_variant) = -1;
       layout_type (copy_variant);
       TYPE_MAIN_VARIANT (copy_variant) = main_reorg;
-      _reorg_map[t] = copy_variant;
+      _reorg_map2.put (t, copy_variant);
     }
   else
     {
@@ -366,10 +366,10 @@ TypeReconstructorFieldReordering::_walk_RECORD_TYPE_post (tree t)
       if (is_modified)
        layout_type (copy);
       tree _t = tree_to_tree (t);
-      _reorg_map[t] = is_modified ? copy : _t;
+      _reorg_map2.put (t, is_modified ? copy : _t);
     }
 -  tree record = _reorg_map[t];
+  tree record = *_reorg_map2.get(t);
for (tree field = TYPE_FIELDS (record); field; field = DECL_CHAIN (field))
     {
       relayout_decl (field);
@@ -461,8 +461,8 @@ GimpleAccesserFieldReordering::_walk_pre_gcond (gcond *s)
 static unsigned int
 lto_fr_execute ();
 -static record_field_map_t
-find_fields_accessed ();
+static void
+find_fields_accessed (record_field_map4_t &f);
  namespace {
 const pass_data pass_data_ipa_field_reorder = {
@@ -495,15 +495,10 @@ public:
 };
 } // namespace
 -record_field_map_t static find_fields_accessed ()
+static void find_fields_accessed (record_field_map4_t &r)
 {
-  GimpleAccesserFieldReordering accesser;
+  GimpleAccesserFieldReordering accesser (r);
   accesser.walk ();
-
-  // This record_field_map holds
-  // RECORD_TYPE -> (FIELD_DECL -> how field is accessed)
-  record_field_map_t record_field_map = accesser.get_map ();
-  return record_field_map;
 }
/* record_field_offset_map holds information on which FIELD_DECLs might be
@@ -520,14 +515,15 @@ record_field_map_t static find_fields_accessed ()
  * The second maps old FIELD_DECLs trees to the new FIELD_DECLs.
  */
 reorg_maps_t
-get_reordered_field_maps (record_field_offset_map_t record_field_offset_map,
-                         std::set<tree> to_modify)
+get_reordered_field_maps (record_field_offset_map4_t &record_field_offset_map2,
+                         hash_set<tree> & to_modify,
+                         reorg_record_map2_t &map2, reorg_field_map2_t 
&field_map2)
 {
   type_stringifier stringifier;
- TypeReconstructorFieldReordering reconstructor (record_field_offset_map,
-                                                 "reorder");
-  for (std::set<tree>::const_iterator i = to_modify.begin (),
+  TypeReconstructorFieldReordering reconstructor (record_field_offset_map2,
+                                                 "reorder", map2, field_map2);
+  for (hash_set<tree>::iterator i = to_modify.begin (),
                                            e = to_modify.end ();
        i != e; ++i)
     {
@@ -535,7 +531,7 @@ get_reordered_field_maps (record_field_offset_map_t record_field_offset_map,
       reconstructor.walk (TYPE_MAIN_VARIANT (record));
     }
 -  for (std::set<tree>::const_iterator i = to_modify.begin (),
+  for (hash_set<tree>::iterator i = to_modify.begin (),
                                            e = to_modify.end ();
        i != e; ++i)
     {
@@ -543,21 +539,20 @@ get_reordered_field_maps (record_field_offset_map_t record_field_offset_map,
       reconstructor.walk (record);
     }
 -  reorg_record_map_t map = reconstructor.get_map ();
-  reorg_field_map_t field_map = reconstructor.get_field_map ();
+  typedef hash_map<tree, tree> reorg_record_map2_t;
// Here, we are just making sure that we are not doing anything too crazy.
   // Also, we found some types for which TYPE_CACHED_VALUES_P is not being
   // rewritten.  This is probably indicative of a bug in
   // TypeReconstructorFieldReordering.
-  for (std::map<tree, tree>::const_iterator i = map.begin (),
-                                                 e = map.end ();
+  for (reorg_record_map2_t::iterator i = map2.begin (),
+                                                 e = map2.end ();
        i != e; ++i)
     {
-      tree o_record = i->first;
+      tree o_record = (*i).first;
       std::string o_name = stringifier.stringify (o_record);
       log ("original: %s\n", o_name.c_str ());
-      tree r_record = i->second;
+      tree r_record = (*i).second;
       std::string r_name
        = r_record ? stringifier.stringify (r_record) : std::string ("");
       log ("modified: %s\n", r_name.c_str ());
@@ -569,16 +564,17 @@ get_reordered_field_maps (record_field_offset_map_t record_field_offset_map,
       TYPE_CACHED_VALUES_P (_o_record) = false;
       TYPE_CACHED_VALUES_P (m_record) = false;
 -      bool in_map = map.find (m_record) != map.end ();
+      bool in_map = map2.get (m_record);
       if (!in_map)
        continue;
-      tree mm_record = map[m_record];
+      tree mm_record = *map2.get(m_record);
       // Info: I think this is no longer needed...
       // Please verify
       TYPE_MAIN_VARIANT (r_record) = mm_record;
     }
 -  return std::make_pair (map, field_map);
+  // TODO: change this to return the GCC types...
+  return std::make_pair (&map2, &field_map2);
 }
  /* Top level function.  */
@@ -588,27 +584,31 @@ lto_fr_execute ()
   log ("here in field reordering \n");
   // Analysis.
   detected_incompatible_syntax = false;
-  std::map<tree, bool> whitelisted = get_whitelisted_nodes();
-  tpartitions_t escaping_nonescaping_sets
-    = partition_types_into_escaping_nonescaping (whitelisted);
-  record_field_map_t record_field_map = find_fields_accessed ();
-  record_field_offset_map_t record_field_offset_map
-    = obtain_nonescaping_unaccessed_fields (escaping_nonescaping_sets,
-                                           record_field_map, 0);
-
-  if (detected_incompatible_syntax || record_field_offset_map.empty ())
+  hash_map<tree, bool> *whitelisted2 = get_whitelisted_nodes2();
+  tpartitions2_t escaping_nonescaping_sets;
+ partition_types_into_escaping_nonescaping (escaping_nonescaping_sets, whitelisted2);
+  record_field_map4_t record_field_map;
+  find_fields_accessed (record_field_map);
+  record_field_offset_map4_t record_field_offset_map;
+  obtain_nonescaping_unaccessed_fields (escaping_nonescaping_sets,
+                                           record_field_map, 0, 
record_field_offset_map);
+
+  if (detected_incompatible_syntax || record_field_offset_map.is_empty ())
     return 0;
    // Prepare for transformation.
-  std::set<tree> to_modify
-    = get_all_types_pointing_to (record_field_offset_map,
-                                escaping_nonescaping_sets);
+  hash_set<tree> to_modify;
+  get_all_types_pointing_to (record_field_offset_map,
+                                escaping_nonescaping_sets, to_modify);
 +  reorg_record_map2_t a;
+  reorg_field_map2_t b;
   reorg_maps_t replacements
-    = get_reordered_field_maps (record_field_offset_map, to_modify);
-  reorg_record_map_t map = replacements.first;
-  reorg_field_map_t field_map = replacements.second;
-  substitute_types_in_program (map, field_map, false);
+    = get_reordered_field_maps (record_field_offset_map, to_modify, a, b);
+  reorg_record_map2_t *map = replacements.first;
+  reorg_field_map2_t *field_map = replacements.second;
+  gcc_assert(map && field_map);
+  substitute_types_in_program (*map, *field_map, false);
    gimple_walker walker;
   walker.walk ();
diff --git a/gcc/ipa-type-escape-analysis.c b/gcc/ipa-type-escape-analysis.c
index 8ccb2991090..f4917a96b54 100644
--- a/gcc/ipa-type-escape-analysis.c
+++ b/gcc/ipa-type-escape-analysis.c
@@ -181,8 +181,8 @@ static unsigned int
 lto_dfe_execute ();
  // Partition types into reching record or non reaching record sets.
-static tpartitions_t
-partition_types_into_record_reaching_or_non_record_reaching ();
+static void
+partition_types_into_record_reaching_or_non_record_reaching (tpartitions2_t &p);
  // Perform dead field elimination.
 static void
@@ -190,11 +190,11 @@ lto_dead_field_elimination ();
  // Fixed point calculating to determine escaping types.
 static void
-fix_escaping_types_in_set (tpartitions_t &types);
+fix_escaping_types_in_set (tpartitions2_t &types);
  // Find which fields are accessed.
-static record_field_map_t
-find_fields_accessed ();
+static void
+find_fields_accessed (record_field_map4_t &f);
  // TODO:
 // This was copy pasted from tree-ssa-structalias.c
@@ -271,58 +271,54 @@ lto_dfe_execute ()
* call graph as ``safe'' or ``unsafe''. The color is propagated to the * callers of the functions until a fixed point is reached.
  */
-std::map<tree, bool>
-get_whitelisted_nodes ()
+hash_map<tree, bool>*
+get_whitelisted_nodes2 ()
 {
   cgraph_node *node = NULL;
-  std::set<cgraph_node *> nodes;
-  std::set<cgraph_node *> leaf_nodes;
-  std::set<tree> leaf_nodes_decl;
+  hash_set<cgraph_node *> nodes;
+  hash_set<cgraph_node *> leaf_nodes;
+  hash_set<tree> leaf_nodes_decl;
+
   FOR_EACH_FUNCTION_WITH_GIMPLE_BODY (node)
   {
-    node->get_untransformed_body ();
-    nodes.insert(node);
+    node->get_untransformed_body();
+    nodes.add(node);
     if (node->callees) continue;
 -    leaf_nodes.insert (node);
-    leaf_nodes_decl.insert (node->decl);
+    leaf_nodes.add (node);
+    leaf_nodes_decl.add (node->decl);
   }
 -  std::queue<cgraph_node *> worklist;
-  for (std::set<cgraph_node*>::iterator i = leaf_nodes.begin (),
-    e = leaf_nodes.end (); i != e; ++i)
+  vec<cgraph_node *> worklist = vNULL;
+ for (hash_set<cgraph_node*>::iterator i = leaf_nodes.begin(), e = leaf_nodes.end (); i != e; ++i)
   {
if (dump_file) fprintf (dump_file, "is a leaf node %s\n", (*i)->name ());
-    worklist.push (*i);
+    worklist.safe_push (*i);
   }
 -  for (std::set<cgraph_node*>::iterator i = nodes.begin (),
+  for (hash_set<cgraph_node*>::iterator i = nodes.begin (),
     e = nodes.end (); i != e; ++i)
   {
-    worklist.push (*i);
+    worklist.safe_push (*i);
   }
 -  std::map<tree, bool> map;
-  while (!worklist.empty ())
+  hash_map<tree, bool> *map = new hash_map<tree, bool>;
+  while (!worklist.is_empty ())
   {
      if (detected_incompatible_syntax) return map;
-    cgraph_node *i = worklist.front ();
-    worklist.pop ();
+    cgraph_node *i = worklist[0];
+    worklist.ordered_remove (0);
if (dump_file) fprintf (dump_file, "analyzing %s %p\n", i->name (), (void*)i);
-    gimple_white_lister whitelister;
+    tpartitions2_t temp;
+    gimple_white_lister whitelister(temp);
     whitelister._walk_cnode (i);
- bool no_external = whitelister.does_not_call_external_functions (i, map);
-    bool before_in_map = map.find (i->decl) != map.end ();
+ bool no_external = whitelister.does_not_call_external_functions2 (i, map);
+    bool before_in_map = map->get (i->decl);
     bool place_callers_in_worklist = !before_in_map;
-    if (!before_in_map)
-    {
-      map.insert(std::pair<tree, bool>(i->decl, no_external));
-    } else
-    {
-      map[i->decl] = no_external;
-    }
-    bool previous_value = map[i->decl];
+    map->put(i->decl, no_external);
+    bool *previous_value_ptr = map->get(i->decl);
+    bool previous_value = *previous_value_ptr;
     place_callers_in_worklist |= previous_value != no_external;
     if (previous_value != no_external)
     {
@@ -335,12 +331,11 @@ get_whitelisted_nodes ()
     for (cgraph_edge *e = i->callers; place_callers_in_worklist && e;
       e = e->next_caller)
     {
-      worklist.push (e->caller);
+      worklist.safe_push (e->caller);
     }
   }
    return map;
-
 }
  /*
@@ -361,28 +356,32 @@ lto_dead_field_elimination ()
     cnode->get_body();
   }
   detected_incompatible_syntax = false;
-  std::map<tree, bool> whitelisted = get_whitelisted_nodes ();
-  tpartitions_t escaping_nonescaping_sets
-    = partition_types_into_escaping_nonescaping (whitelisted);
+  hash_map<tree, bool> *whitelisted2 = get_whitelisted_nodes2 ();
+  tpartitions2_t escaping_nonescaping_sets;
+ partition_types_into_escaping_nonescaping (escaping_nonescaping_sets, whitelisted2);
   if (detected_incompatible_syntax) return;
-  record_field_map_t record_field_map = find_fields_accessed ();
+  record_field_map4_t record_field_map;
+  find_fields_accessed (record_field_map);
   if (detected_incompatible_syntax) return;
-  record_field_offset_map_t record_field_offset_map
- = obtain_nonescaping_unaccessed_fields (escaping_nonescaping_sets, - record_field_map, OPT_Wdfa);
-  if (detected_incompatible_syntax || record_field_offset_map.empty ())
+  record_field_offset_map4_t record_field_offset_map;
+ obtain_nonescaping_unaccessed_fields (escaping_nonescaping_sets, + record_field_map, OPT_Wdfa, record_field_offset_map);
+  if (detected_incompatible_syntax || record_field_offset_map.is_empty ())
     return;
      // Prepare for transformation.
-  std::set<tree> to_modify
-    = get_all_types_pointing_to (record_field_offset_map,
-                                escaping_nonescaping_sets);
+  hash_set<tree> to_modify2;
+  get_all_types_pointing_to (record_field_offset_map,
+                                escaping_nonescaping_sets, to_modify2);
+  reorg_record_map2_t a;
+  reorg_field_map2_t b;
   reorg_maps_t replacements
-    = get_types_replacement (record_field_offset_map, to_modify);
-  reorg_record_map_t map = replacements.first;
-  reorg_field_map_t field_map = replacements.second;
+    = get_types_replacement (record_field_offset_map, to_modify2, a, b);
+  reorg_record_map2_t *map = replacements.first;
+  reorg_field_map2_t *field_map = replacements.second;
+  gcc_assert(map && field_map);
   // Transformation.
-  substitute_types_in_program (map, field_map, true);
+  substitute_types_in_program (*map, *field_map, true);
 }
  /* Iterate all gimple bodies and collect trees
@@ -391,48 +390,39 @@ lto_dead_field_elimination ()
  * pointer, array, reference, union, field, etc...).
  * Let's call these trees record_reaching_trees.
  */
-static tpartitions_t
-partition_types_into_record_reaching_or_non_record_reaching ()
+void
+partition_types_into_record_reaching_or_non_record_reaching (tpartitions2_t &partitions)
 {
-  gimple_type_collector collector;
+  gimple_type_collector collector(partitions);
   collector.walk ();
-  tpartitions_t partitions = collector.get_record_reaching_trees ();
-  return partitions;
 }
  /* Iterate over all gimple bodies and find out
  * which types are escaping AND are being casted.
  */
-tpartitions_t
-partition_types_into_escaping_nonescaping (std::map<tree, bool> &whitelisted)
+void
+partition_types_into_escaping_nonescaping (tpartitions2_t &partitions, hash_map<tree, bool> *whitelisted2)
 {
-  tpartitions_t partitions
-    = partition_types_into_record_reaching_or_non_record_reaching ();
-  if (detected_incompatible_syntax) return partitions;
-  gimple_caster caster (partitions, whitelisted);
+  partition_types_into_record_reaching_or_non_record_reaching (partitions);
+  if (detected_incompatible_syntax) return;
+  gimple_caster caster (partitions, whitelisted2);
   caster.walk ();
   caster.print_reasons ();
 -  partitions = caster.get_sets ();
+  caster.fix_sets ();
   // Unify results from different trees representing the same type
   // until a fixed point is reached.
   fix_escaping_types_in_set (partitions);
-  return partitions;
 }
  /* Iterate over all gimple bodies and find out
  * which fields are accessed for all RECORD_TYPE
  * types.
  */
-record_field_map_t static find_fields_accessed ()
+static void find_fields_accessed (record_field_map4_t &record_field_map)
 {
-  gimple_accessor accesser;
+  gimple_accessor accesser (record_field_map) ;
   accesser.walk ();
-
-  // This record_field_map holds
-  // RECORD_TYPE -> (FIELD_DECL -> how field is accessed)
-  record_field_map_t record_field_map = accesser.get_map ();
-  return record_field_map;
 }
  /* Find equivalent RECORD_TYPE trees to tree r_i.
@@ -443,22 +433,21 @@ record_field_map_t static find_fields_accessed ()
  * and it is a tree for which this method is going to find the rest of
  * equivalent trees found in record_field_map.
  */
-static std::vector<tree>
-find_equivalent_trees (tree r_i, record_field_map_t record_field_map,
-                      tpartitions_t casting)
+static vec<tree>*
+find_equivalent_trees (tree r_i, record_field_map4_t &record_field_map,
+                      tpartitions2_t casting)
 {
   type_incomplete_equality equality;
-  std::vector<tree> equivalence;
+  vec<tree> *equivalence = new vec<tree> ();
   bool is_rin_record = casting.in_points_to_record (r_i);
   if (!is_rin_record)
     return equivalence;
 -  for (std::map<tree, field_access_map_t>::const_iterator j
-       = record_field_map.begin (),
+  for (auto j = record_field_map.begin (),
        f = record_field_map.end ();
-       j != f; j++)
+       j != f; ++j)
     {
-      tree r_j = j->first;
+      tree r_j = (*j).first;
       const bool pointer_equal = r_i == r_j;
       if (pointer_equal)
        continue;
@@ -472,7 +461,7 @@ find_equivalent_trees (tree r_i, record_field_map_t record_field_map,
       if (!are_equal)
        continue;
 -      equivalence.push_back (r_j);
+      equivalence->safe_push(r_j);
     }
   return equivalence;
 }
@@ -484,8 +473,9 @@ find_equivalent_trees (tree r_i, record_field_map_t record_field_map,
  */
 static void
 add_offset_only_if_read (tree field, unsigned access,
-                        field_offsets_t &field_offset)
+                        field_offsets2_t &field_offset2)
 {
+  gcc_assert(field);
   assert_is_type (field, FIELD_DECL);
   const bool is_read = access & Read;
   if (!is_read)
@@ -493,7 +483,7 @@ add_offset_only_if_read (tree field, unsigned access,
    tree _field = tree_to_tree (field);
   unsigned f_offset = bitpos_of_field (_field);
-  field_offset.insert (f_offset);
+  field_offset2.add (f_offset);
 }
  /*
@@ -504,14 +494,12 @@ add_offset_only_if_read (tree field, unsigned access,
  * tree (RECORD_TYPE) -> bitpos_of_field for read fields).
  */
 static void
-keep_only_read_fields_from_field_map (field_access_map_t &field_map,
-                                     field_offsets_t &field_offset)
+keep_only_read_fields_from_field_map (field_access_map2_t &field_map,
+                                     field_offsets2_t &field_offset2)
 {
-  for (std::map<tree, unsigned>::iterator j = field_map.begin (),
-                                               f = field_map.end ();
-       j != f; ++j)
+  for (auto j = field_map.begin (), f = field_map.end (); j != f; ++j)
     {
-      add_offset_only_if_read (j->first, j->second, field_offset);
+      add_offset_only_if_read ((*j).first, (*j).second, field_offset2);
     }
 }
@@ -521,16 +509,16 @@ keep_only_read_fields_from_field_map (field_access_map_t &field_map,
  */
 static void
 keep_only_read_fields_from_equivalent_field_maps (
-  std::vector<tree> equivalent, record_field_map_t &record_field_map,
-  field_offsets_t &field_offset)
+  vec<tree> *equivalent, record_field_map4_t &record_field_map,
+  field_offsets2_t &field_offset2)
 {
-  for (std::vector<tree>::iterator j = equivalent.begin (),
-                                        f = equivalent.end ();
+  for (auto j = equivalent->begin (),
+                                        f = equivalent->end ();
        j != f; j++)
     {
       tree r_j = *j;
-      field_access_map_t equivalent_field_map = record_field_map[r_j];
- keep_only_read_fields_from_field_map (equivalent_field_map, field_offset); + field_access_map2_t *equivalent_field_map = *record_field_map.get(r_j); + keep_only_read_fields_from_field_map (*equivalent_field_map, field_offset2);
     }
 }
 @@ -540,28 +528,27 @@ keep_only_read_fields_from_equivalent_field_maps (
  */
 static void
 erase_if_no_fields_can_be_deleted (
-  record_field_offset_map_t &record_field_offset_map,
-  std::set<tree> &to_keep, std::set<tree> &to_erase)
+  record_field_offset_map4_t &record_field_offset_map,
+  hash_set<tree> &to_keep, hash_set<tree> &to_erase)
 {
-  for (std::map<tree, field_offsets_t>::iterator i
+  for (hash_map<tree, field_offsets2_t*>::iterator i
        = record_field_offset_map.begin (),
        e = record_field_offset_map.end ();
        i != e; ++i)
     {
-      tree record = i->first;
-      const bool keep = to_keep.find (record) != to_keep.end ();
+      tree record = (*i).first;
+      const bool keep = to_keep.contains (record);
       if (keep)
        continue;
 -      to_erase.insert (record);
+      to_erase.add (record);
     }
 -  for (std::set<tree>::iterator i = to_erase.begin (),
-                                     e = to_erase.end ();
+  for (auto i = to_erase.begin (), e = to_erase.end ();
        i != e; ++i)
     {
       tree record = *i;
-      record_field_offset_map.erase (record);
+      record_field_offset_map.remove (record);
     }
 }
 @@ -571,82 +558,84 @@ erase_if_no_fields_can_be_deleted (
  */
 static void
 mark_escaping_types_to_be_deleted (
-  record_field_offset_map_t &record_field_offset_map,
-  std::set<tree> &to_erase, tpartitions_t casting)
+  record_field_offset_map4_t &record_field_offset_map,
+  hash_set<tree> &to_erase, tpartitions2_t casting)
 {
-  const tset_t &non_escaping = casting.non_escaping;
-  for (std::map<tree, field_offsets_t>::iterator i
+  tset2_t &non_escaping = casting.non_escaping;
+  for (hash_map<tree, field_offsets2_t*>::iterator i
        = record_field_offset_map.begin (),
        e = record_field_offset_map.end ();
        i != e; ++i)
     {
-      tree record = i->first;
- const bool in_set = non_escaping.find (record) != non_escaping.end ();
+      tree record = (*i).first;
+      const bool in_set = non_escaping.contains (record);
       if (in_set)
        continue;
 -      to_erase.insert (record);
+      to_erase.add (record);
     }
 }
  // Obtain nonescaping unaccessed fields
-record_field_offset_map_t
-obtain_nonescaping_unaccessed_fields (tpartitions_t casting,
-                                     record_field_map_t record_field_map,
-                                     int _warning)
+void
+obtain_nonescaping_unaccessed_fields (tpartitions2_t casting,
+                                     record_field_map4_t &record_field_map,
+                                     int _warning,
+                                     record_field_offset_map4_t 
&record_field_offset_map)
 {
   bool has_fields_that_can_be_deleted = false;
-  record_field_offset_map_t record_field_offset_map;
-  for (std::map<tree, field_access_map_t>::iterator i
+  for (hash_map<tree, field_access_map2_t*>::iterator i
        = record_field_map.begin (),
        e = record_field_map.end ();
        i != e; ++i)
     {
-      tree r_i = i->first;
-      std::vector<tree> equivalence
+      tree r_i = (*i).first;
+      vec<tree>* equivalence
        = find_equivalent_trees (r_i, record_field_map, casting);
-      field_offsets_t field_offset;
-      field_access_map_t original_field_map = record_field_map[r_i];
- keep_only_read_fields_from_field_map (original_field_map, field_offset);
+      field_offsets2_t *field_offset = new field_offsets2_t;
+      field_access_map2_t *original_field_map = (*i).second;
+      gcc_assert(original_field_map);
+ keep_only_read_fields_from_field_map (*original_field_map, *field_offset);
       keep_only_read_fields_from_equivalent_field_maps (equivalence,
                                                        record_field_map,
-                                                       field_offset);
+                                                       *field_offset);
       // These map holds the following:
       // RECORD_TYPE -> unsigned (bit_pos_offset which has been read)
-      record_field_offset_map[r_i] = field_offset;
+      record_field_offset_map.put(r_i, field_offset);
+      delete equivalence;
     }
    // So now that we only have the FIELDS which are read,
   // we need to compute the complement...
    // Improve: This is tightly coupled, I need to decouple it...
-  std::set<tree> to_erase;
-  std::set<tree> to_keep;
+  hash_set<tree> to_erase;
+  hash_set<tree> to_keep;
   mark_escaping_types_to_be_deleted (record_field_offset_map, to_erase,
                                     casting);
-  for (std::map<tree, field_offsets_t>::iterator i
+  for (auto i
        = record_field_offset_map.begin (),
        e = record_field_offset_map.end ();
        i != e; ++i)
     {
-      tree record = i->first;
- const bool will_be_erased = to_erase.find (record) != to_erase.end ();
+      tree record = (*i).first;
+      const bool will_be_erased = to_erase.contains (record);
// No need to compute which fields can be deleted if type is escaping
       if (will_be_erased)
        continue;
 -      field_offsets_t field_offset = i->second;
+      field_offsets2_t *field_offset = (*i).second;
for (tree field = TYPE_FIELDS (record); field; field = DECL_CHAIN (field))
        {
          unsigned f_offset = bitpos_of_field (field);
-         bool in_set2 = field_offset.find (f_offset) != field_offset.end ();
+         bool in_set2 = field_offset->contains(f_offset);
          if (in_set2)
            {
-             field_offset.erase (f_offset);
+             field_offset->remove (f_offset);
              continue;
            }
-         to_keep.insert (record);
-         field_offset.insert (f_offset);
+         to_keep.add (record);
+         field_offset->add (f_offset);
          has_fields_that_can_be_deleted = true;
          // NOTE: With anonymous fields this might be weird to print.
          log ("%s.%s may be deleted\n",
@@ -659,20 +648,17 @@ obtain_nonescaping_unaccessed_fields (tpartitions_t casting,
          warning (_warning, "RECORD_TYPE %qE has dead field %qE in LTO.\n",
                   record, field);
        }
-      record_field_offset_map[record] = field_offset;
+      record_field_offset_map.put(record, field_offset);
     }
 -  // Improve: Make this more elegant.
-  if (!has_fields_that_can_be_deleted)
-    {
-      record_field_offset_map_t empty;
-      return empty;
-    }
+  if (!has_fields_that_can_be_deleted) {
+         record_field_offset_map.empty();
+         return;
+  }
    erase_if_no_fields_can_be_deleted (record_field_offset_map, to_keep,
                                     to_erase);
 -  return record_field_offset_map;
 }
  // Main interface to TypeWalker
@@ -681,7 +667,7 @@ void
 type_walker::walk (tree t)
 {
   gcc_assert (t);
-  this->tset.clear ();
+  this->tset2.empty ();
   this->_walk (t);
 }
 @@ -707,11 +693,11 @@ type_walker::_walk (tree type)
   // of trees and therefore we need a way to
   // avoid loops in this graph.
   // Imrpove: Outline finding if it is recursive?
-  const bool is_recursing = tset.find (type) != tset.end ();
+  const bool is_recursing = tset2.contains (type);
   if (is_recursing)
     return;
 -  tset.insert (type);
+  tset2.add (type);
   const enum tree_code code = TREE_CODE (type);
   switch (code)
     {
@@ -778,7 +764,7 @@ type_walker::_walk (tree type)
       }
       break;
     }
-  tset.erase (type);
+  tset2.remove (type);
 }
  // This is used to walk over subtrees.
@@ -1275,7 +1261,7 @@ void
 gimple_walker::walk ()
 {
   _walk_globals ();
-  std::set<tree> fndecls;
+  hash_set<tree> fndecls2;
   cgraph_node *node = NULL;
   FOR_EACH_FUNCTION_WITH_GIMPLE_BODY (node)
     {
@@ -1283,7 +1269,7 @@ gimple_walker::walk ()
       node->get_untransformed_body ();
       tree decl = node->decl;
       gcc_assert (decl);
-      const bool already_in_set = fndecls.find (decl) != fndecls.end ();
+      const bool already_in_set = fndecls2.contains (decl);
       // I think it is possible for different nodes to point to the same
       // declaration.
       if (already_in_set)
@@ -1293,7 +1279,7 @@ gimple_walker::walk ()
        dump_function_to_file (node->decl, dump_file, TDF_NONE);
        _walk_cnode (node);
-      fndecls.insert (decl);
+      fndecls2.add (decl);
     }
 }
@@ -1636,7 +1622,7 @@ gimple_walker::_walk_gphi (__attribute__((unused)) gphi *g)
 void
 type_collector::collect (tree t)
 {
-  const bool in_set = ptrset.in_universe (t);
+  const bool in_set = ptrset2.in_universe (t);
   // Early memoization...
    if (in_set)
@@ -1653,7 +1639,7 @@ type_collector::collect (tree t)
   // The boolean will be updated to show
   // whether a record is reachable from
   // the type.
-  gcc_assert (ptr.empty ());
+  gcc_assert (ptr2.is_empty ());
   walk (t);
 }
 @@ -1661,12 +1647,12 @@ type_collector::collect (tree t)
 void
 type_collector::_sanity_check ()
 {
-  for (tset_t::iterator i = ptrset.points_to_record.begin (),
-           e = ptrset.points_to_record.end ();
+  for (auto i = ptrset2.points_to_record.begin (),
+           e = ptrset2.points_to_record.end ();
        i != e; ++i)
     {
-      for (tset_t::iterator j = ptrset.complement.begin (),
-           f = ptrset.complement.end ();
+      for (auto j = ptrset2.complement.begin (),
+           f = ptrset2.complement.end ();
           j != f; ++j)
        {
          tree type_ptr = *i;
@@ -1692,18 +1678,18 @@ bool
 type_collector::is_memoized (tree t)
 {
   /* If we haven't seen it then no.  */
-  const bool in_set = ptrset.in_universe (t);
+  const bool in_set = ptrset2.in_universe (t);
   if (!in_set)
     return false;
    // If the memoized type points to a record
   // we must update all types that can refer
   // to memoized type.
-  const bool points_to_record = ptrset.in_points_to_record (t);
-  for (std::map<tree, bool>::iterator i = ptr.begin (),
-       e = ptr.end (); i != e; ++i)
+  const bool points_to_record = ptrset2.in_points_to_record (t);
+  for (auto i = ptr2.begin (),
+       e = ptr2.end (); i != e; ++i)
     {
-      i->second |= points_to_record;
+      (*i).second |= points_to_record;
     }
   return true;
 }
@@ -1711,7 +1697,7 @@ type_collector::is_memoized (tree t)
 void
 type_collector::_walk_VOID_TYPE_pre (tree t)
 {
-  ptr[t] = false;
+  ptr2.put(t, false);
 }
  void
@@ -1723,7 +1709,7 @@ type_collector::_walk_VOID_TYPE_post (tree t)
 void
 type_collector::_walk_INTEGER_TYPE_pre (tree t)
 {
-  ptr[t] = false;
+  ptr2.put(t, false);
 }
  void
@@ -1735,7 +1721,7 @@ type_collector::_walk_INTEGER_TYPE_post (tree t)
 void
 type_collector::_walk_REAL_TYPE_pre (tree t)
 {
-  ptr[t] = false;
+  ptr2.put(t, false);
 }
  void
@@ -1747,7 +1733,7 @@ type_collector::_walk_REAL_TYPE_post (tree t)
 void
 type_collector::_walk_FIXED_POINT_TYPE_pre (tree t)
 {
-  ptr[t] = false;
+  ptr2.put(t, false);
 }
  void
@@ -1759,7 +1745,7 @@ type_collector::_walk_FIXED_POINT_TYPE_post (tree t)
 void
 type_collector::_walk_COMPLEX_TYPE_pre (tree t)
 {
-  ptr[t] = false;
+  ptr2.put(t, false);
 }
  void
@@ -1771,7 +1757,7 @@ type_collector::_walk_COMPLEX_TYPE_post (tree t)
 void
 type_collector::_walk_ENUMERAL_TYPE_pre (tree t)
 {
-  ptr[t] = false;
+  ptr2.put(t, false);
 }
  void
@@ -1783,7 +1769,7 @@ type_collector::_walk_ENUMERAL_TYPE_post (tree t)
 void
 type_collector::_walk_BOOLEAN_TYPE_pre (tree t)
 {
-  ptr[t] = false;
+  ptr2.put(t, false);
 }
  void
@@ -1796,15 +1782,15 @@ void
 type_collector::_collect_simple (tree t)
 {
   // Insert into persistent set.
-  ptrset.insert (t, ptr[t]);
+  ptrset2.insert (t, *ptr2.get(t));
   // erase from current working set.
-  ptr.erase (t);
+  ptr2.remove (t);
 }
  void
 type_collector::_walk_ARRAY_TYPE_pre (tree t)
 {
-  ptr[t] = false;
+  ptr2.put(t, false);
 }
  void
@@ -1816,7 +1802,7 @@ type_collector::_walk_ARRAY_TYPE_post (tree t)
 void
 type_collector::_walk_POINTER_TYPE_pre (tree t)
 {
-  ptr[t] = false;
+  ptr2.put(t, false);
 }
  void
@@ -1828,7 +1814,7 @@ type_collector::_walk_POINTER_TYPE_post (tree t)
 void
 type_collector::_walk_REFERENCE_TYPE_pre (tree t)
 {
-  ptr[t] = false;
+  ptr2.put(t, false);
 }
  void
@@ -1841,10 +1827,10 @@ void
 type_collector::_walk_RECORD_TYPE_post (tree t)
 {
   // All in ptr point to record
-  for (std::map<tree, bool>::iterator i = ptr.begin (),
-       e = ptr.end (); i != e; ++i)
+  for (auto i = ptr2.begin (),
+       e = ptr2.end (); i != e; ++i)
     {
-      i->second = true;
+      (*i).second = true;
     }
   _collect_simple (t);
 @@ -1853,13 +1839,13 @@ type_collector::_walk_RECORD_TYPE_post (tree t)
 void
 type_collector::_walk_RECORD_TYPE_pre (tree t)
 {
-  ptr[t] = false;
+  ptr2.put(t, false);
 }
  void
 type_collector::_walk_UNION_TYPE_pre (tree t)
 {
-  ptr[t] = false;
+  ptr2.put(t, false);
 }
  void
@@ -1877,7 +1863,7 @@ type_collector::_walk_FUNCTION_TYPE_post (tree t)
 void
 type_collector::_walk_FUNCTION_TYPE_pre (tree t)
 {
-  ptr[t] = false;
+  ptr2.put(t, false);
 }
  void
@@ -1889,7 +1875,7 @@ type_collector::_walk_METHOD_TYPE_post (tree t)
 void
 type_collector::_walk_METHOD_TYPE_pre (tree t)
 {
-  ptr[t] = false;
+  ptr2.put(t, false);
 }
  inline void
@@ -1902,14 +1888,14 @@ expr_collector::_walk_pre (tree e)
    if (RECORD_TYPE != TREE_CODE (t)) return;
 -  if (_type_collector.ptrset.records.empty ()) {
-    _type_collector.ptrset.records.insert (TYPE_MAIN_VARIANT (t));
+  if (_type_collector.ptrset2.records.is_empty ()) {
+    _type_collector.ptrset2.records.add (TYPE_MAIN_VARIANT (t));
     return;
   }
 -  for (std::set<tree>::iterator
-       i = _type_collector.ptrset.records.begin (),
-       e = _type_collector.ptrset.records.end (); i != e; ++i)
+  for (auto
+       i = _type_collector.ptrset2.records.begin (),
+       e = _type_collector.ptrset2.records.end (); i != e; ++i)
   {
     tree r = *i;
     type_incomplete_equality structuralEquality;
@@ -1917,7 +1903,7 @@ expr_collector::_walk_pre (tree e)
     if (is_same) continue;
      type_stringifier stringifier;
-    _type_collector.ptrset.records.insert (TYPE_MAIN_VARIANT (t));
+    _type_collector.ptrset2.records.add (TYPE_MAIN_VARIANT (t));
   }
 }
 @@ -2024,7 +2010,7 @@ gimple_type_collector::_walk_pre_gdebug (gdebug *s)
 void
 gimple_type_collector::print_collected ()
 {
-  tpartitions_t sets = get_record_reaching_trees ();
+  tpartitions2_t sets = get_record_reaching_trees ();
   // TODO: I think previously we were printing info here for tests
 }
@@ -2047,13 +2033,14 @@ type_escaper::is_memoized (__attribute__ ((unused)) tree t)
   return false;
 }
 -tpartitions_t
-type_escaper::get_sets ()
+void
+type_escaper::fix_sets ()
 {
   place_escaping_types_in_set ();
-  return _ptrset;
+  //return _ptrset2;
 }
 +
 /* From a map of TREE -> BOOL, the key represents a tree type
  * and the value represents whether the tree escapes.
  * Partition this map into sets.
@@ -2062,20 +2049,20 @@ void
 type_escaper::place_escaping_types_in_set ()
 {
   type_stringifier stringifier;
-  for (typemap::iterator i = calc.begin (), e = calc.end (); i != e; ++i)
+  for (auto i = calc2.begin (), e = calc2.end (); i != e; ++i)
     {
-      tree type = i->first;
+      tree type = (*i).first;
        // We should only track interesting types
       // Types which are not in points_to_record are the ones
       // that are pointed to by records.
       // I think it is possible to prune them ahead of time...
-      if (!_ptrset.in_points_to_record (type))
+      if (!_ptrset2.in_points_to_record (type))
        continue;
 -      const Reason reason = i->second;
-      reason.is_escaping () ? _ptrset.escaping.insert (type)
-                           : _ptrset.non_escaping.insert (type);
+      const Reason reason = (*i).second;
+      reason.is_escaping () ? _ptrset2.escaping.add (type)
+                           : _ptrset2.non_escaping.add (type);
     }
 }
 @@ -2099,7 +2086,7 @@ void
 type_escaper::_update (tree t)
 {
   gcc_assert (t);
-  const bool already_in_typemap = calc.find (t) != calc.end ();
+  const bool already_in_typemap = calc2.get (t);
   // Do we have to invalidate all types which point to a volatile type?
   // Or do we have to invalidate all types pointed to by a volatile type?
   // Or do we only invalidate all types which are volatile.
@@ -2109,7 +2096,9 @@ type_escaper::_update (tree t)
   _is_volatile.type_is_volatile = is_volatile;
   Reason _inner = _reason | _is_volatile;
   // always OR
-  already_in_typemap ? calc[t] |= _inner : calc[t] = _inner;
+  Reason temp;
+  temp = already_in_typemap ? *calc2.get(t) | _inner : _inner;
+  calc2.put(t, temp);
 }
  void
@@ -2209,20 +2198,20 @@ void
 type_escaper::print_reasons ()
 {
   type_stringifier stringifier;
-  for (typemap::iterator i = calc.begin (), e = calc.end (); i != e; ++i)
+  for (auto i = calc2.begin (), e = calc2.end (); i != e; ++i)
     {
-      tree t = i->first;
+      tree t = (*i).first;
       std::string name = stringifier.stringify (t);
-      Reason r = i->second;
+      Reason r = (*i).second;
       log ("%s reason: ", name.c_str ());
       r.print ();
     }
 }
 -tpartitions_t
-expr_escaper::get_sets ()
+void
+expr_escaper::fix_sets ()
 {
-  return _type_escaper.get_sets ();
+  _type_escaper.fix_sets ();
 }
  void
@@ -2244,7 +2233,7 @@ expr_escaper::update (tree t, Reason r)
 void
 expr_escaper::_walk_pre (tree e)
 {
-  _stack.push (e);
+  _stack2.safe_push (e);
   tree t = TREE_TYPE (e);
    gcc_assert (t);
@@ -2254,7 +2243,7 @@ expr_escaper::_walk_pre (tree e)
 void
 expr_escaper::_walk_post (__attribute__ ((unused)) tree e)
 {
-  _stack.pop ();
+  _stack2.pop ();
 }
  /* Capture casting on LHS.  */
@@ -2264,16 +2253,16 @@ expr_escaper::_walk_SSA_NAME_pre (tree e)
   tree ssa_type = TREE_TYPE (e);
  -  if (_stack.size () < 4)
+  if (_stack2.length () < 4)
     return;
 -  tree this_expr = _stack.top ();
-  _stack.pop ();
-  tree twice = _stack.top ();
-  _stack.pop ();
-  tree prev_expr = _stack.top ();
-  _stack.push (twice);
-  _stack.push (this_expr);
+  tree this_expr = _stack2.last ();
+  _stack2.pop ();
+  tree twice = _stack2.last ();
+  _stack2.pop ();
+  tree prev_expr = _stack2.last ();
+  _stack2.safe_push (twice);
+  _stack2.safe_push (this_expr);
   if (TREE_CODE (prev_expr) != MEM_REF)
     return;
 @@ -2287,8 +2276,8 @@ expr_escaper::_walk_SSA_NAME_pre (tree e)
   if (TREE_CODE (TREE_TYPE (mref_type)) == INTEGER_TYPE)
     return;
- bool in_map = curr_node && _whitelisted.find (curr_node->decl) != _whitelisted.end ();
-  bool whitelisted = in_map && _whitelisted[curr_node->decl];
+  bool in_map = curr_node && _whitelisted2->get (curr_node->decl);
+  bool whitelisted = in_map && *_whitelisted2->get (curr_node->decl);
   if (whitelisted) return;
    if (dump_file) print_generic_stmt(dump_file, e);
@@ -2321,11 +2310,11 @@ expr_escaper::_walk_CONSTRUCTOR_pre (tree e)
   _type_escaper.update (t, _r);
 }
 -tpartitions_t
-gimple_escaper::get_sets ()
+void
+gimple_escaper::fix_sets ()
 {
   _expr_escaper.curr_node = NULL;
-  return _expr_escaper.get_sets ();
+  return _expr_escaper.fix_sets ();
 }
  void
@@ -2349,7 +2338,8 @@ gimple_escaper::_init ()
        tree decl = cnode->decl;
       gcc_assert (decl);
-      undefined.insert (decl);
+      //undefined.insert (decl);
+      undefined2.add (decl);
     }
    FOR_EACH_FUNCTION_WITH_GIMPLE_BODY (cnode)
@@ -2358,7 +2348,8 @@ gimple_escaper::_init ()
       cnode->get_untransformed_body ();
       tree decl = cnode->decl;
       gcc_assert (decl);
-      undefined.erase (decl);
+      //undefined.erase (decl);
+      undefined2.remove (decl);
     }
 }
 @@ -2548,7 +2539,7 @@ gimple_escaper::_walk_pre_gcall (gcall *s)
   type_stringifier stringifier;
   const bool _is_function_escaping
     = node ? is_function_escaping (node) : is_function_escaping (fn);
-  const bool is_undefined = undefined.find (fn) != undefined.end ();
+  const bool is_undefined = undefined2.contains (fn);
   log ("is undefined %s\n", is_undefined ? "t" : "f");
   const bool _is_escaping = is_undefined || _is_function_escaping;
 @@ -2626,8 +2617,8 @@ gimple_caster::_walk_pre_gassign (gassign *s)
log ("is_casted %s = %s\n", stringifier.stringify(t_rhs).c_str(), is_cast ? "T" : "F"); log ("is_casted %s = %s\n", stringifier.stringify(t_lhs).c_str(), is_cast ? "T" : "F"); reason.type_is_casted = is_cast; - bool in_map = _whitelisted.find (currently_walking->decl) != _whitelisted.end ();
-  bool whitelisted = in_map && _whitelisted[currently_walking->decl];
+  bool in_map = _whitelisted2->get (currently_walking->decl);
+ bool whitelisted = in_map && *_whitelisted2->get(currently_walking->decl);
   if (whitelisted) goto escaper_label;
   _expr_escaper.curr_node = currently_walking;
   _expr_escaper._type_escaper.update (TREE_TYPE (lhs), reason);
@@ -2656,9 +2647,9 @@ gimple_caster::_walk_pre_gcall (gcall *s)
     return;
    tree f_t = TREE_TYPE (fn);
- if (_whitelisted.find(fn) != _whitelisted.end() && _whitelisted[fn]) return; - bool in_map = _whitelisted.find(currently_walking->decl) != _whitelisted.end();
-  bool whitelisted = in_map && _whitelisted[currently_walking->decl];
+  if (_whitelisted2->get(fn) && *_whitelisted2->get(fn)) return;
+  bool in_map = _whitelisted2->get (currently_walking->decl);
+ bool whitelisted = in_map && *_whitelisted2->get(currently_walking->decl);
   if (whitelisted) return;
    if (!currently_walking->callers) return;
@@ -2703,10 +2694,34 @@ gimple_caster::_walk_pre_gcall (gcall *s)
   _expr_escaper.update (lhs, ret_reason);
 }
 +bool
+type_accessor::is_in_record_field_map(tree t)
+{
+  return _map4.get (t);
+}
+
+field_access_map2_t*
+type_accessor::get_from_record_field_map(tree t)
+{
+  gcc_assert (_map4.get (t));
+  field_access_map2_t *value = *_map4.get(t);
+  return value;
+}
+
+void
+type_accessor::put_in_record_field_map(tree t, field_access_map2_t* f)
+{
+  if (_map4.get (t) && (*_map4.get (t) != f))
+  {
+    delete *(_map4.get(t));
+  }
+  _map4.put(t, f);
+}
+
 bool
 type_accessor::is_memoized (tree t)
 {
-  return memoized_map.find (t) != memoized_map.end ();
+  return memoized_map2.contains (t);
 }
  /* Add all fields in struct to memoized map.  */
@@ -2714,7 +2729,7 @@ void
 type_accessor::_walk_RECORD_TYPE_pre (tree t)
 {
   add_all_fields_in_struct (t);
-  memoized_map.insert (t);
+  memoized_map2.add (t);
 }
  /* Initialize all fields as neither read nor written.  */
@@ -2726,27 +2741,21 @@ type_accessor::add_all_fields_in_struct (tree t)
   if (!is_record)
     return;
 -  const bool record_already_in_map = _map.find (t) != _map.end ();
-  field_access_map_t field_map;
-  field_map = record_already_in_map ? _map[t] : field_map;
+  const bool record_already_in_map = is_in_record_field_map(t);
+  field_access_map2_t *field_map;
+ field_map = record_already_in_map ? get_from_record_field_map(t) : new field_access_map2_t;
    // Let's add all fields to the field map as empty.
   for (tree field = TYPE_FIELDS (t); field; field = DECL_CHAIN (field))
     {
       const bool field_already_in_map_2
-       = field_map.find (field) != field_map.end ();
+       = field_map->get (field);
       if (field_already_in_map_2)
        continue;
-      field_map[field] = Empty;
+      field_map->put(field, Empty);
     }
 -  _map[t] = field_map;
-}
-
-record_field_map_t
-expr_accessor::get_map ()
-{
-  return record_field_map;
+  put_in_record_field_map(t, field_map);
 }
  void
@@ -2758,7 +2767,7 @@ expr_accessor::add_all_fields_in_struct (tree t)
 void
 expr_accessor::_walk_pre (tree e)
 {
-  _stack.push (e);
+  _stack2.safe_push (e);
   tree t = TREE_TYPE (e);
   add_all_fields_in_struct (t);
 }
@@ -2766,7 +2775,7 @@ expr_accessor::_walk_pre (tree e)
 void
 expr_accessor::_walk_post (__attribute__ ((unused)) tree e)
 {
-  _stack.pop ();
+  _stack2.pop ();
 }
  void
@@ -2792,19 +2801,19 @@ void
 expr_accessor::_walk_ADDR_EXPR_pre (__attribute__ ((unused)) tree e)
 {
   log ("expr accessor mem ref\n");
-  log ("stack size = %d\n", _stack.size ());
+  log ("stack size = %d\n", _stack2.length ());
 -  if (_stack.size () < 4)
+  if (_stack2.length () < 4)
     return;
    // TODO: Fix error with double pushing
-  tree addr_expr = _stack.top ();
-  _stack.pop ();
-  tree twice = _stack.top ();
-  _stack.pop ();
-  tree prev_expr = _stack.top ();
-  _stack.push (addr_expr);
-  _stack.push (twice);
+  tree addr_expr = _stack2.last ();
+  _stack2.pop ();
+  tree twice = _stack2.last ();
+  _stack2.pop ();
+  tree prev_expr = _stack2.last ();
+  _stack2.safe_push (addr_expr);
+  _stack2.safe_push (twice);
log ("prev_expr code = %s\n", get_tree_code_name (TREE_CODE (prev_expr)));
   if (TREE_CODE (prev_expr) != MEM_REF)
     return;
@@ -2830,9 +2839,9 @@ expr_accessor::_walk_ADDR_EXPR_pre (__attribute__ ((unused)) tree e)
   unsigned offset_int = tree_to_uhwi (offset) % type_size_int;
   // We need to get the field that corresponds to the offset_int
   const bool record_already_in_map
-    = record_field_map.find (addr_expr_t) != record_field_map.end ();
-  field_access_map_t field_map;
- field_map = record_already_in_map ? record_field_map[addr_expr_t] : field_map;
+    = _type_accessor.is_in_record_field_map (addr_expr_t);
+  field_access_map2_t *field_map;
+ field_map = record_already_in_map ? _type_accessor.get_from_record_field_map(addr_expr_t) : new field_access_map2_t;
    // UNSAFE! But it is necesseary for testing...
// Unless there is someone who is smarter that finds another way to test this. @@ -2855,13 +2864,13 @@ expr_accessor::_walk_ADDR_EXPR_pre (__attribute__ ((unused)) tree e)
       // Otherwise, this pointer arithmetic is invalid...
       // After the transformation
       const bool field_already_in_map
-       = field_map.find (field) != field_map.end ();
- unsigned prev_access = field_already_in_map ? field_map[field] : Empty;
+       = field_map->get (field);
+ unsigned prev_access = field_already_in_map ? *field_map->get(field) : Empty;
        prev_access |= Read;
-      field_map[field] = prev_access;
+      field_map->put(field, prev_access);
       add_all_fields_in_struct (addr_expr_t);
-      record_field_map[addr_expr_t] = field_map;
+      _type_accessor.put_in_record_field_map(addr_expr_t, field_map);
        if (f_offset == offset_int)
        break;
@@ -2893,27 +2902,27 @@ expr_accessor::_walk_COMPONENT_REF_pre (tree e)
   log ("%s.%s\n", type_stringifier::get_type_identifier (op0_t).c_str(),
        type_stringifier::get_field_identifier (op1).c_str());
   const bool record_already_in_map
-    = record_field_map.find (op0_t) != record_field_map.end ();
-  field_access_map_t field_map;
-  field_map = record_already_in_map ? record_field_map[op0_t] : field_map;
- const bool field_already_in_map = field_map.find (op1) != field_map.end ();
-  unsigned prev_access = field_already_in_map ? field_map[op1] : Empty;
+    = _type_accessor.is_in_record_field_map (op0_t);
+  field_access_map2_t *field_map;
+ field_map = record_already_in_map ? _type_accessor.get_from_record_field_map(op0_t) : new field_access_map2_t;
+  const bool field_already_in_map = field_map->get(op1);
+ unsigned prev_access = field_already_in_map ? *field_map->get(op1) : Empty;
    prev_access |= _access;
-  field_map[op1] = prev_access;
+  field_map->put(op1, prev_access);
   add_all_fields_in_struct (op0_t);
-  record_field_map[op0_t] = field_map;
+  _type_accessor.put_in_record_field_map(op0_t, field_map);
 -  if (_stack.size () < 4)
+  if (_stack2.length () < 4)
     return;
 -  tree this_expr = _stack.top ();
-  _stack.pop ();
-  tree twice = _stack.top ();
-  _stack.pop ();
-  tree prev_expr = _stack.top ();
-  _stack.push (twice);
-  _stack.push (this_expr);
+  tree this_expr = _stack2.last ();
+  _stack2.pop ();
+  tree twice = _stack2.last ();
+  _stack2.pop ();
+  tree prev_expr = _stack2.last ();
+  _stack2.safe_push (twice);
+  _stack2.safe_push (this_expr);
   if (TREE_CODE (prev_expr) != ADDR_EXPR)
     return;
 @@ -2936,13 +2945,13 @@ expr_accessor::_walk_COMPONENT_REF_pre (tree e)
   {
       log ("ever inside?\n");
       const bool field_already_in_map
-       = field_map.find (field) != field_map.end ();
- unsigned prev_access = field_already_in_map ? field_map[field] : Empty;
+       = field_map->get(field);
+ unsigned prev_access = field_already_in_map ? *field_map->get(field) : Empty;
        prev_access |= Read;
-      field_map[field] = prev_access;
+      field_map->put(field, prev_access);
       add_all_fields_in_struct (t);
-      record_field_map[t] = field_map;
+      _type_accessor.put_in_record_field_map(t, field_map);
   }
 }
 @@ -2950,9 +2959,10 @@ expr_accessor::_walk_COMPONENT_REF_pre (tree e)
 void
 expr_accessor::print_accesses ()
 {
+       /*
   for (std::map<tree, field_access_map_t>::const_iterator i
-       = record_field_map.begin (),
-       e = record_field_map.end ();
+       = _type_accessor.get_map_ref().begin (),
+       e = _type_accessor.get_map_ref().end ();
        i != e; ++i)
     {
       tree record = i->first;
@@ -2971,15 +2981,7 @@ expr_accessor::print_accesses ()
          log ("%s.%s = 0x%04x\n", name_r.c_str (), name_f.c_str (), access);
        }
     }
-}
-
-/* RECORD_TYPE -> (FIELD_DECL -> bitflag)
- * bitflag specifies if field is read, written or neither.
- */
-record_field_map_t
-gimple_accessor::get_map ()
-{
-  return _expr_accessor.get_map ();
+    */
 }
  void
@@ -3108,45 +3110,42 @@ Reason::operator|= (const Reason &other)
  /* Insert TYPE into a partition depending on IN_POINTS_TO_RECORD.  */
 void
-type_partitions_s::insert (tree type, bool in_points_to_record)
+type_partitions2_s::insert (tree type, bool in_points_to_record)
 {
   gcc_assert (type);
-  this->universe.insert (type);
-  in_points_to_record ? this->points_to_record.insert (type)
-                     : this->complement.insert (type);
-  const bool in_points_to_set = this->in_points_to_record (type);
+  this->universe.add (type);
+  in_points_to_record ? this->points_to_record.add (type)
+                     : this->complement.add (type);
+  const bool in_points_to_set = this->in_points_to_record(type);
   const bool in_complement = this->in_complement (type);
   const bool _xor = in_points_to_set != in_complement;
-  // sanity check...
   gcc_assert (_xor);
 }
  /* Find out whether TYPE is already in universe.  */
 bool
-type_partitions_s::in_universe (tree type) const
+type_partitions2_s::in_universe (tree type)
 {
   gcc_assert (type);
- const bool seen_before = this->universe.find (type) != this->universe.end ();
+  const bool seen_before = this->universe.contains (type);
   return seen_before;
 }
  /* Find out whether TYPE is in points_to_record partition.  */
 bool
-type_partitions_s::in_points_to_record (tree type) const
+type_partitions2_s::in_points_to_record (tree type)
 {
   gcc_assert (type);
-  const bool seen_before
-    = this->points_to_record.find (type) != this->points_to_record.end ();
+  const bool seen_before = this->points_to_record.contains (type);
   return seen_before;
 }
  /* Find out whether TYPE is not in points to record partition.  */
 bool
-type_partitions_s::in_complement (tree type) const
+type_partitions2_s::in_complement (tree type)
 {
   gcc_assert (type);
-  const bool seen_before
-    = this->complement.find (type) != this->complement.end ();
+  const bool seen_before = this->complement.contains (type);
   return seen_before;
 }
 @@ -3398,15 +3397,14 @@ type_structural_equality::_equal (tree l, tree r)
   if (!equal_codes)
     return equal_codes;
 -  bool recurse_l = set_l.find (l) != set_l.end ();
-  bool recurse_r = set_r.find (r) != set_r.end ();
-  // Verify that this the case every time.
-  bool recurse = recurse_l || recurse_r;
+  bool recurse2_l = set2_l.contains (l);
+  bool recurse2_r = set2_r.contains (r);
+  bool recurse = recurse2_l || recurse2_r;
   if (recurse)
     return recurse;
 -  set_l.insert (l);
-  set_r.insert (r);
+  set2_l.add (l);
+  set2_r.add (r);
   const enum tree_code code = TREE_CODE (l);
   bool equal_children = false;
   switch (code)
@@ -3441,8 +3439,8 @@ type_structural_equality::_equal (tree l, tree r)
       break;
     }
 -  set_l.erase (l);
-  set_r.erase (r);
+  set2_l.remove (l);
+  set2_r.remove (r);
   return equal_children;
 }
 @@ -3598,19 +3596,19 @@ type_incomplete_equality::_equal (tree l, tree r)
  * Perform this until a fixed point is reached.
  */
 static void
-fix_escaping_types_in_set (tpartitions_t &types)
+fix_escaping_types_in_set (tpartitions2_t &types)
 {
   bool fixed_point_reached = false;
   type_incomplete_equality structuralEquality;
   do
     {
-      std::vector<tree> fixes;
+      vec<tree> fixes2 = vNULL;
       fixed_point_reached = true;
-      for (std::set<tree>::const_iterator i = types.escaping.begin (),
+      for (auto i = types.escaping.begin (),
                                                e = types.escaping.end ();
           i != e; ++i)
        {
-         for (std::set<tree>::const_iterator j
+         for (auto j
               = types.non_escaping.begin (),
               f = types.non_escaping.end ();
               j != f; ++j)
@@ -3630,17 +3628,15 @@ fix_escaping_types_in_set (tpartitions_t &types)
              // Add incomplete to escaping
              // delete incomplete from non_escaping
              // We shouldn't do that inside our iteration loop.
-             fixes.push_back (type_non);
+             fixes2.safe_push (type_non);
            }
        }
 -      for (std::vector<tree>::const_iterator i = fixes.begin (),
-                                                  e = fixes.end ();
-          i != e; ++i)
+      for (auto i = fixes2.begin (), e = fixes2.end (); i != e; ++i)
        {
          tree escaping_type = *i;
-         types.escaping.insert (escaping_type);
-         types.non_escaping.erase (escaping_type);
+         types.escaping.add (escaping_type);
+         types.non_escaping.remove (escaping_type);
        }
     }
   while (!fixed_point_reached);
diff --git a/gcc/ipa-type-escape-analysis.h b/gcc/ipa-type-escape-analysis.h
index 0bf24eb7c23..702e13e62ba 100644
--- a/gcc/ipa-type-escape-analysis.h
+++ b/gcc/ipa-type-escape-analysis.h
@@ -106,7 +106,7 @@ tree_to_tree (tree t)
  // TODO: Rename?
 // TSET_T stands for type set.
-typedef std::set<tree> tset_t;
+typedef hash_set<tree> tset2_t;
  /* Base class used for visiting tree nodes starting with root T.
  * It can handle recursive cases in the tree graph by holding
@@ -130,7 +130,7 @@ public:
 protected:
    /* Typeset holds previously visited nodes.  */
-  tset_t tset;
+  tset2_t tset2;
    /* Inner walking method, used to recurse.  */
   void _walk (tree t);
@@ -421,40 +421,40 @@ protected:
   * Ideally 1 union 2 should be universe and 3 union 4 should be universe.
  */
-struct type_partitions_s
+struct type_partitions2_s
 {
   /* The set of all types which have been seen.  */
-  tset_t universe;
+  tset2_t universe;
    /* The set of all types which somehow refer to a RECORD_TYPE.  */
-  tset_t points_to_record;
+  tset2_t points_to_record;
    /* The complement of points_to_record.  */
-  tset_t complement;
+  tset2_t complement;
    /* The set of all escaping types.  */
-  tset_t escaping;
+  tset2_t escaping;
    /* The set of all non escaping types.  */
-  tset_t non_escaping;
+  tset2_t non_escaping;
    /* The set of all records. */
-  tset_t records;
+  tset2_t records;
    /* Determine if we have seen this type before.  */
-  bool in_universe (tree) const;
+  bool in_universe (tree);
    /* Determine if tree points to a record.  */
-  bool in_points_to_record (tree) const;
+  bool in_points_to_record (tree);
    /* Determine if tree does not point to a record.  */
-  bool in_complement (tree) const;
+  bool in_complement (tree);
    /* Insert either in points to record or complement.  */
   void insert (tree, bool);
 };
 -typedef struct type_partitions_s tpartitions_t;
+typedef struct type_partitions2_s tpartitions2_t;
  /* TypeCollector is a derived class from TypeWalker
  * that collects all types reachable from T into the partitions
@@ -463,17 +463,17 @@ typedef struct type_partitions_s tpartitions_t;
 class type_collector : public type_walker
 {
 public:
-  type_collector ()
+  type_collector (tpartitions2_t &ptrset)
+  : ptrset2(ptrset)
   {};
    /* Main interface.  */
   void collect (tree t);
    /* Collect the result after walking all trees.  */
-  tpartitions_t get_record_reaching_trees ()
+  tpartitions2_t& get_record_reaching_trees ()
   {
-    _sanity_check ();
-    return ptrset;
+    return ptrset2;
   }
  private:
@@ -488,7 +488,7 @@ private:
    * In other words, the contents are reset after every
    * call to collect.
    */
-  std::map<tree, bool> ptr;
+  hash_map<tree, bool> ptr2;
    /* The type partition set that will hold partitions for
    * points to record or does not point to record.
@@ -497,7 +497,7 @@ private:
    * This datastructure persists across calls to collect.
    */
 public:
-  tpartitions_t ptrset;
+  tpartitions2_t& ptrset2;
  private:
 @@ -644,11 +644,12 @@ private:
 class expr_collector : public expr_walker
 {
 public:
-  expr_collector ()
+  expr_collector (tpartitions2_t &p)
+  : _type_collector (p)
   {};
    /* Holds the result after collecting from all trees.  */
-  tpartitions_t get_record_reaching_trees ()
+  tpartitions2_t get_record_reaching_trees ()
   {
     return _type_collector.get_record_reaching_trees ();
   }
@@ -668,11 +669,12 @@ private:
 class gimple_type_collector : public gimple_walker
 {
 public:
-  gimple_type_collector ()
+  gimple_type_collector (tpartitions2_t &p)
+  : _expr_collector(p)
   {};
    /* This holds the result after walking the whole program.  */
-  tpartitions_t get_record_reaching_trees ()
+  tpartitions2_t get_record_reaching_trees ()
   {
     return _expr_collector.get_record_reaching_trees ();
   }
@@ -708,12 +710,12 @@ private:
 class gimple_white_lister : gimple_type_collector
 {
 public:
-  gimple_white_lister ()
+  gimple_white_lister (tpartitions2_t &t)
+  : gimple_type_collector (t)
   {};
    bool _no_external = true;
-  bool does_not_call_external_functions (cgraph_node *c,
-       std::map<tree, bool> &whitelisted)
+ bool does_not_call_external_functions2 (cgraph_node *c, hash_map<tree, bool> *whitelisted)
   {
     gcc_assert(c);
 @@ -721,18 +723,15 @@ public:
     {
        cgraph_node *callee = edge->callee;
        if (callee == c) continue;
-       bool in_map = whitelisted.find (callee->decl) != whitelisted.end();
+       bool in_map = whitelisted->get (callee->decl);
        if (!in_map) {
               return false;
        }
-       bool w = whitelisted[callee->decl];
-       if (!w) {
-              return false;
-       }
+       return *whitelisted->get(callee->decl);
     }
unsigned int how_many_records = - _expr_collector._type_collector.ptrset.records.size ();
+           _expr_collector._type_collector.ptrset2.records.elements ();
     return how_many_records <= 1;
    }
@@ -804,7 +803,7 @@ struct Reason
 {};
 };
 -typedef std::map<tree, Reason> typemap;
+typedef hash_map<tree, Reason> typemap2;
  /* Type Escaper propagates information on whether a type escapes
  * to all types reachable by a root type.  It also propagates
@@ -817,19 +816,19 @@ typedef std::map<tree, Reason> typemap;
 class type_escaper : public type_walker
 {
 public:
-  type_escaper (tpartitions_t &p)
-    : _ptrset (p), _inside_union (0), _inside_record (0)
+  type_escaper (tpartitions2_t &p)
+    : _ptrset2 (p), _inside_union (0), _inside_record (0)
   {};
    // Hold the partitions for escaping non escaping.
-  tpartitions_t &_ptrset;
+  tpartitions2_t &_ptrset2;
    // Have information that matches a tree type with
   // why a type is escaping.
-  typemap calc;
+  typemap2 calc2;
    // Get partitions after calculating escaping types.
-  tpartitions_t get_sets ();
+  void fix_sets ();
    // Print reasons why a type is escaping.
   void print_reasons ();
@@ -885,7 +884,7 @@ private:
 class expr_escaper : public expr_walker
 {
 public:
- expr_escaper (tpartitions_t &types, std::map<tree, bool> &whitelisted) : _type_escaper (types), _whitelisted(whitelisted) + expr_escaper (tpartitions2_t &types, hash_map<tree, bool> *whitelisted2) : _type_escaper (types), _whitelisted2(whitelisted2), _stack2(vNULL)
   {};
    /* Main interface: T escapes because R.  */
@@ -894,10 +893,10 @@ public:
   /* Will be used to propagate escaping reasons to Types.  */
   type_escaper _type_escaper;
 -  std::map<tree, bool> &_whitelisted;
+  hash_map<tree, bool> *_whitelisted2;
    /* Holds the end result.  */
-  tpartitions_t get_sets ();
+  void fix_sets ();
    /* Print end result.  */
   void print_reasons ();
@@ -909,7 +908,7 @@ private:
   // is the subexpression being examined.
   // The bottom of the stack is the expression called on the update
   // function.
-  std::stack<tree> _stack;
+  vec<tree> _stack2;
    // Reason to propagate across all subexpressions.
   Reason _r;
@@ -947,13 +946,13 @@ protected:
  private:
   // Use to limit recursion if we are revisiting a node
-  typedef std::set<tree> tset_t;
+  typedef hash_set<tree> tset2_t;
    // Limit recursion for LHS
-  tset_t set_l;
+  tset2_t set2_l;
    // Limit recursion for RHS
-  tset_t set_r;
+  tset2_t set2_r;
    // Determine if the code is equal
   bool _equal_code (tree a, tree b);
@@ -1002,7 +1001,7 @@ protected:
 class gimple_escaper : public gimple_walker
 {
 public:
- gimple_escaper (tpartitions_t &types, std::map<tree, bool> &whitelisted) : _expr_escaper (types, whitelisted) + gimple_escaper (tpartitions2_t &types, hash_map<tree, bool> *whitelisted2) : _expr_escaper (types, whitelisted2)
   {
     _init ();
   };
@@ -1011,7 +1010,7 @@ public:
   expr_escaper _expr_escaper;
    /* Obtain final result.  */
-  tpartitions_t get_sets ();
+  void fix_sets ();
    /* Print final result.  */
   void print_reasons ();
@@ -1019,8 +1018,8 @@ public:
 protected:
   /* Set of undefined functions, this set is filled with
    * functions obtained via FOR_EACH_FUNCTION_WITH_GIMPLE_BODY.  */
-  typedef std::set<tree> undefset;
-  undefset undefined;
+  typedef hash_set<tree> undefset2;
+  undefset2 undefined2;
    /* Initializes undefined.  */
   void _init ();
@@ -1068,12 +1067,12 @@ protected:
 class gimple_caster : public gimple_escaper
 {
 public:
- gimple_caster (tpartitions_t &types, std::map<tree, bool> &whitelisted) : gimple_escaper (types, whitelisted), _whitelisted(whitelisted) + gimple_caster (tpartitions2_t &types, hash_map<tree, bool> *whitelisted2) : gimple_escaper (types, whitelisted2), _whitelisted2(whitelisted2)
 {};
  private:
 -  std::map<tree, bool> &_whitelisted;
+  hash_map<tree, bool> *_whitelisted2;
    /* Determine if cast comes from a known function.  */
   static bool follow_def_to_find_if_really_cast (tree);
@@ -1099,24 +1098,33 @@ const unsigned Read = 0x01u;
 const unsigned Write = 0x02u;
  // maps FIELD_DECL -> bitflag.
-typedef std::map<tree, unsigned> field_access_map_t;
+typedef hash_map<tree, unsigned> field_access_map2_t;
  // maps RECORD_TYPE -> (FIELD_DECL -> bitflag).
-typedef std::map<tree, field_access_map_t> record_field_map_t;
+typedef hash_map<tree, field_access_map2_t*> record_field_map4_t;
  // Class used to determine if a FIELD is read, written or never accessed.
 class type_accessor : public type_walker
 {
 public:
-  type_accessor (record_field_map_t &map) : _map (map)
+  type_accessor (record_field_map4_t &map) : _map4(map)
   {};
 +  ~type_accessor()
+  {
+  };
+
+  bool is_in_record_field_map(tree t);
+  field_access_map2_t* get_from_record_field_map(tree t);
+  void put_in_record_field_map(tree t, field_access_map2_t*);
+
 private:
+
   // maps RECORD -> (FIELD_DECL -> bitflag).
-  record_field_map_t &_map;
+  record_field_map4_t &_map4;
    // set of trees which are memoized and we don't need to look into them.
-  std::set<tree> memoized_map;
+  hash_set<tree> memoized_map2;
    // If a RECORD_TYPE is walked into, add all fields in struct to
   // record_field_map.
@@ -1131,7 +1139,7 @@ private:
 class expr_accessor : public expr_walker
 {
 public:
-  expr_accessor () : _type_accessor (record_field_map)
+ expr_accessor (record_field_map4_t &map) : _type_accessor (map), _stack2 (vNULL)
   {};
    // Expr E is accessed in A manner.
@@ -1143,21 +1151,15 @@ public:
   // Add all fields to map.  Initialize with empty.
   void add_all_fields_in_struct (tree t);
 -  // Get final results.
-  record_field_map_t get_map ();
+  // Aids expr-accessor in updating types.
+  type_accessor _type_accessor;
  private:
// Access {"Read", "Write", "Neither"} to propagate to all subexpressions.
   unsigned _access;
    // Stack to keep track of how current subexpression was reached.
-  std::stack<tree> _stack;
-
-  // Holds main results.
-  record_field_map_t record_field_map;
-
-  // Aids expr-accessor in updating types.
-  type_accessor _type_accessor;
+  vec<tree> _stack2;
    // Mark FIELD_DECL as read.
   // If ADDR_EXPR is parent expression that means
@@ -1186,15 +1188,13 @@ private:
 class gimple_accessor : public gimple_walker
 {
 public:
-  gimple_accessor ()
+  gimple_accessor (record_field_map4_t &map)
+  : _expr_accessor(map)
   {};
    /* Print final results.  */
   void print_accesses ();
 -  /* Get final results.  */
-  record_field_map_t get_map ();
-
 protected:
   /* Navigate expressions in gimple statements.  */
   expr_accessor _expr_accessor;
@@ -1218,21 +1218,21 @@ private:
   // But we might need a gswitch.
 };
 -typedef std::set<unsigned> field_offsets_t;
-
-typedef std::map<tree, field_offsets_t> record_field_offset_map_t;
+typedef hash_set<int_hash <int , -1, -2>> field_offsets2_t;
+typedef hash_map<tree, field_offsets2_t*> record_field_offset_map4_t;
  // Partition types into escaping or non escaping sets.
-tpartitions_t
-partition_types_into_escaping_nonescaping (std::map<tree, bool>&);
+void
+partition_types_into_escaping_nonescaping (tpartitions2_t &p, hash_map<tree, bool>*);
  // Compute set of not escaping unaccessed fields
-record_field_offset_map_t
-obtain_nonescaping_unaccessed_fields (tpartitions_t casting,
-                                     record_field_map_t record_field_map,
-                                     int warning);
+void
+obtain_nonescaping_unaccessed_fields (tpartitions2_t casting,
+                                     record_field_map4_t& record_field_map,
+                                     int warning,
+                                     record_field_offset_map4_t &a);
  extern bool detected_incompatible_syntax;
-std::map<tree, bool> get_whitelisted_nodes();
+hash_map<tree, bool> *get_whitelisted_nodes2();
  #endif /* GCC_IPA_TYPE_ESCAPE_ANALYSIS_H */
--
2.18.1

Reply via email to