aboutsummaryrefslogtreecommitdiff
path: root/gcc/ipa-prop.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/ipa-prop.cc')
-rw-r--r--gcc/ipa-prop.cc17
1 files changed, 15 insertions, 2 deletions
diff --git a/gcc/ipa-prop.cc b/gcc/ipa-prop.cc
index 9442cdd..827bdb6 100644
--- a/gcc/ipa-prop.cc
+++ b/gcc/ipa-prop.cc
@@ -5299,6 +5299,7 @@ write_ipcp_transformation_info (output_block *ob, cgraph_node *node,
bp = bitpack_create (ob->main_stream);
bp_pack_value (&bp, av.by_ref, 1);
+ bp_pack_value (&bp, av.killed, 1);
streamer_write_bitpack (&bp);
}
@@ -5331,6 +5332,7 @@ read_ipcp_transformation_info (lto_input_block *ib, cgraph_node *node,
bitpack_d bp = streamer_read_bitpack (ib);
av->by_ref = bp_unpack_value (&bp, 1);
+ av->killed = bp_unpack_value (&bp, 1);
}
}
@@ -5616,7 +5618,9 @@ ipcp_modif_dom_walker::before_dom_children (basic_block bb)
/* If IPA-CP discovered a constant in parameter PARM at OFFSET of a given SIZE
- whether passed by reference or not is given by BY_REF - return that
- constant. Otherwise return NULL_TREE. */
+ constant. Otherwise return NULL_TREE. The is supposed to be used only
+ after clone materialization and transformation is done (because it asserts
+ that killed constants have been pruned). */
tree
ipcp_get_aggregate_const (struct function *func, tree parm, bool by_ref,
@@ -5634,7 +5638,11 @@ ipcp_get_aggregate_const (struct function *func, tree parm, bool by_ref,
ipa_argagg_value_list avl (ts);
unsigned unit_offset = bit_offset / BITS_PER_UNIT;
- tree v = avl.get_value (index, unit_offset, by_ref);
+ const ipa_argagg_value *av = avl.get_elt (index, unit_offset);
+ if (!av || av->by_ref != by_ref)
+ return NULL_TREE;
+ gcc_assert (!av->killed);
+ tree v = av->value;
if (!v
|| maybe_ne (tree_to_poly_int64 (TYPE_SIZE (TREE_TYPE (v))), bit_size))
return NULL_TREE;
@@ -5884,6 +5892,11 @@ ipcp_transform_function (struct cgraph_node *node)
free_ipa_bb_info (bi);
fbi.bb_infos.release ();
+ ts->remove_argaggs_if ([](const ipa_argagg_value &v)
+ {
+ return v.killed;
+ });
+
vec_free (descriptors);
if (cfg_changed)
delete_unreachable_blocks_update_callgraph (node, false);