summaryrefslogtreecommitdiff
path: root/gcc/ipa-type-escape-analysis.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/ipa-type-escape-analysis.c')
-rw-r--r--gcc/ipa-type-escape-analysis.c44
1 files changed, 21 insertions, 23 deletions
diff --git a/gcc/ipa-type-escape-analysis.c b/gcc/ipa-type-escape-analysis.c
index a9deb05cc5f..a961fb40d3d 100644
--- a/gcc/ipa-type-escape-analysis.c
+++ b/gcc/ipa-type-escape-analysis.c
@@ -161,6 +161,7 @@ along with GCC; see the file COPYING3. If not see
#include "gimple-iterator.h"
#include "gimple-ssa.h"
#include "gimple-pretty-print.h"
+#include "tree-cfg.h"
#include <vector>
#include <set>
#include <map>
@@ -177,10 +178,6 @@ lto_dfe_execute ();
static tpartitions_t
partition_types_into_record_reaching_or_non_record_reaching ();
-// Partition types into escaping or non escaping sets.
-static tpartitions_t
-partition_types_into_escaping_nonescaping ();
-
// Perform dead field elimination.
static void
lto_dead_field_elimination ();
@@ -193,11 +190,6 @@ fix_escaping_types_in_set (tpartitions_t &types);
static record_field_map_t
find_fields_accessed ();
-// Obtain intersection of unaccessed and non escaping types.
-static record_field_offset_map_t
-obtain_nonescaping_unaccessed_fields (tpartitions_t casting,
- record_field_map_t record_field_map);
-
// TODO:
// This was copy pasted from tree-ssa-structalias.c
// Maybe delete this and make the function visible?
@@ -269,7 +261,7 @@ lto_dead_field_elimination ()
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);
+ record_field_map, OPT_Wdfa);
if (record_field_offset_map.empty ())
return;
@@ -282,8 +274,7 @@ lto_dead_field_elimination ()
reorg_record_map_t map = replacements.first;
reorg_field_map_t field_map = replacements.second;
// Transformation.
- substitute_types_in_program (map, field_map);
-
+ substitute_types_in_program (map, field_map, true);
}
/* Iterate all gimple bodies and collect trees
@@ -304,7 +295,7 @@ partition_types_into_record_reaching_or_non_record_reaching ()
/* Iterate over all gimple bodies and find out
* which types are escaping AND are being casted.
*/
-static tpartitions_t
+tpartitions_t
partition_types_into_escaping_nonescaping ()
{
tpartitions_t partitions
@@ -327,8 +318,7 @@ partition_types_into_escaping_nonescaping ()
* which fields are accessed for all RECORD_TYPE
* types.
*/
-static record_field_map_t
-find_fields_accessed ()
+record_field_map_t static find_fields_accessed ()
{
GimpleAccesser accesser;
accesser.walk ();
@@ -498,9 +488,10 @@ mark_escaping_types_to_be_deleted (
}
// Obtain nonescaping unaccessed fields
-static record_field_offset_map_t
+record_field_offset_map_t
obtain_nonescaping_unaccessed_fields (tpartitions_t casting,
- record_field_map_t record_field_map)
+ record_field_map_t record_field_map,
+ int _warning)
{
bool has_fields_that_can_be_deleted = false;
record_field_offset_map_t record_field_offset_map;
@@ -560,10 +551,11 @@ obtain_nonescaping_unaccessed_fields (tpartitions_t casting,
TypeStringifier::get_type_identifier (record).c_str (),
TypeStringifier::get_field_identifier (field).c_str ());
- if (OPT_Wdfa == 0) continue;
+ if (_warning == 0)
+ continue;
// Anonymous fields? (Which the record can be!).
- warning (OPT_Wdfa, "RECORD_TYPE %qE has dead field %qE in LTO.\n",
- record, field);
+ warning (_warning, "RECORD_TYPE %qE has dead field %qE in LTO.\n",
+ record, field);
}
record_field_offset_map[record] = field_offset;
}
@@ -1182,6 +1174,8 @@ GimpleWalker::walk ()
if (already_in_set)
continue;
+ if (dump_file)
+ dump_function_to_file (node->decl, dump_file, TDF_NONE);
_walk_cnode (node);
fndecls.insert (decl);
}
@@ -1403,8 +1397,8 @@ GimpleWalker::_walk_gimple (gimple *stmt)
const enum gimple_code code = gimple_code (stmt);
switch (code)
{
- case GIMPLE_PREDICT:
case GIMPLE_DEBUG:
+ case GIMPLE_PREDICT:
case GIMPLE_NOP:
// I think it is safe to skip these
// but it would also be nice to walk their sub-trees
@@ -2641,9 +2635,13 @@ ExprAccessor::_walk_ADDR_EXPR_pre (__attribute__ ((unused)) const_tree e)
for (field = TYPE_FIELDS (addr_expr_t); field; field = DECL_CHAIN (field))
{
log ("ever inside?\n");
+ // This is a weird result...
unsigned f_byte_offset = tree_to_uhwi (DECL_FIELD_OFFSET (field));
- unsigned f_offset = f_byte_offset;
- log ("offset field %d, offset by pointer %d\n", f_offset, offset_int);
+ unsigned f_bit_offset = tree_to_uhwi (DECL_FIELD_BIT_OFFSET (field)) / 8;
+ unsigned f_offset = f_byte_offset + f_bit_offset;
+ // unsigned f_offset = bitpos_of_field (field);
+ log ("offset field %d %d, offset by pointer %d \n ", f_offset,
+ f_bit_offset, offset_int);
// NOTE: ALL FIELDS BEFORE THIS ONE NEED TO EXIST
// Otherwise, this pointer arithmetic is invalid...