diff options
author | Erick Ochoa <erick.ochoa@theobroma-systems.com> | 2020-02-24 23:20:48 +0100 |
---|---|---|
committer | Erick Ochoa <erick.ochoa@theobroma-systems.com> | 2020-06-03 16:05:15 +0200 |
commit | 58b7e443c9290abaea391c09d6b1735f6761d9e0 (patch) | |
tree | 3745cfe01f9cd46073b0bb9f1a4972fe474f43bf /gcc/ipa-str-reorg-dead-field-eliminate.c | |
parent | d1994f6ad7f492ec6f010565e6926bc8227101d1 (diff) |
Deletes statements
Diffstat (limited to 'gcc/ipa-str-reorg-dead-field-eliminate.c')
-rw-r--r-- | gcc/ipa-str-reorg-dead-field-eliminate.c | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/gcc/ipa-str-reorg-dead-field-eliminate.c b/gcc/ipa-str-reorg-dead-field-eliminate.c index 479f02abcbd..357ff20cc11 100644 --- a/gcc/ipa-str-reorg-dead-field-eliminate.c +++ b/gcc/ipa-str-reorg-dead-field-eliminate.c @@ -1602,8 +1602,6 @@ rewrite_component_ref_def_lhs (gimple_stmt_iterator &gsi, tree expr, t_map &type gcc_assert (expr_type); delete_info_t *delete_info1 = type_map.get (expr_type); const_tree *new_expr_type_ptr = delete_info1 ? &(delete_info1->new_record) : NULL; - if (new_expr_type_ptr) - substitute_type(expr, new_expr_type_ptr); tree _struct = TREE_OPERAND (expr, 0); gcc_assert (_struct); @@ -1612,6 +1610,9 @@ rewrite_component_ref_def_lhs (gimple_stmt_iterator &gsi, tree expr, t_map &type delete_info_t *delete_info = type_map.get (_struct_type); const_tree *new_struct_type_ptr = delete_info ? &(delete_info->new_record) : NULL; + if (new_expr_type_ptr) + substitute_type(expr, new_expr_type_ptr); + bool retval = rewrite_expr (_struct, type_map, indent); tree new_type @@ -1620,15 +1621,16 @@ rewrite_component_ref_def_lhs (gimple_stmt_iterator &gsi, tree expr, t_map &type bool has_been_deleted = delete_info ? delete_info->deleted_fields->contains(field_decl) : false; if (has_been_deleted) { - test_log("we are removing some stuff", 0); - gsi_remove(&gsi, true); - //gsi_prev(&gsi); + const char *field_name = get_field_name (field_decl); + test_log("we are removing field %s from struct %s", 0, field_name, get_type_name(delete_info->old_record)); return true; } + const char *field_name = get_field_name (field_decl); if (strcmp (field_name, "anonymous") == 0) - return retval; + return false; + const_tree new_field = get_field_with_name (new_type, field_name); // INFO: We need to rewrite the whole operand @@ -1645,7 +1647,7 @@ rewrite_component_ref_def_lhs (gimple_stmt_iterator &gsi, tree expr, t_map &type test_log ("rewrite,field_offset,%s,%d", indent, field_name, offset); gcc_assert (TREE_OPERAND (expr, 2) == NULL); - return true; + return false; } static bool @@ -1676,9 +1678,8 @@ rewrite_component_ref_def (tree expr, bool has_been_deleted = delete_info ? delete_info->deleted_fields->contains(field_decl) : false; if (has_been_deleted) { - //TODO: we need to delete this statement gcc_unreachable(); - return true; + return false; } const char *field_name = get_field_name (field_decl); @@ -2366,8 +2367,7 @@ rewrite_assign_lhs (gimple *stmt, gimple_stmt_iterator &gsi, t_map &type_map, t_ bool is_component_ref = code == COMPONENT_REF; if (is_component_ref) { - rewrite_component_ref_def_lhs(gsi, lhs, type_map, 0); - return stmt != gsi_stmt(gsi); + return rewrite_component_ref_def_lhs(gsi, lhs, type_map, 0); } rewrite_expr(lhs, type_map, 0); @@ -2382,7 +2382,11 @@ rewrite_assign (gimple *stmt, gimple_stmt_iterator &gsi, gcc_assert (stmt); test_print_gimple_stmt (stmt); bool deleted = rewrite_assign_lhs (stmt, gsi, type_map, inverse); - if (deleted) return deleted; + if (deleted) { + unlink_stmt_vdef (stmt); + gsi_remove(&gsi, true); + return deleted; + } rewrite_assign_rhs (stmt, gsi, type_map, inverse); test_print_gimple_stmt (stmt); return false; |