[PATCH 8/8 v4] The Great STL migration
Erick Ochoa
erick.ochoa@theobroma-systems.com
Fri Dec 4 09:59:11 GMT 2020
---
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
More information about the Gcc-patches
mailing list