summaryrefslogtreecommitdiff
path: root/gcc/ipa-str-reorg-dead-field-eliminate.c
diff options
context:
space:
mode:
authorErick Ochoa <erick.ochoa@theobroma-systems.com>2020-02-24 23:20:48 +0100
committerErick Ochoa <erick.ochoa@theobroma-systems.com>2020-06-03 16:05:15 +0200
commit58b7e443c9290abaea391c09d6b1735f6761d9e0 (patch)
tree3745cfe01f9cd46073b0bb9f1a4972fe474f43bf /gcc/ipa-str-reorg-dead-field-eliminate.c
parentd1994f6ad7f492ec6f010565e6926bc8227101d1 (diff)
Deletes statements
Diffstat (limited to 'gcc/ipa-str-reorg-dead-field-eliminate.c')
-rw-r--r--gcc/ipa-str-reorg-dead-field-eliminate.c28
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;