diff options
Diffstat (limited to 'gcc/ipa-type-escape-analysis.c')
-rw-r--r-- | gcc/ipa-type-escape-analysis.c | 44 |
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... |