Commit e56f5f3e by Jakub Jelinek Committed by Jakub Jelinek

re PR other/37419 (mpfr related memory corruption)

	PR other/37419
	* ipa-prop.h (ipa_propagate_indirect_call_infos): Change last argument
	to pointer to vector pointer.
	* ipa-prop.c (ipa_propagate_indirect_call_infos,
	propagate_info_to_inlined_callees): Likewise.
	(update_call_notes_after_inlining): Likewise.  Push new indirect edge
	to *new_edges instead of new_edges.  Reread IPA_EDGE_REF after
	ipa_check_create_edge_args.
	* ipa-inline.c (cgraph_decide_recursive_inlining): Change last argument
	to pointer to vector pointer.
	(cgraph_decide_inlining_of_small_function): Adjust
	cgraph_decide_recursive_inlining and ipa_propagate_indirect_call_infos
	calls.

From-SVN: r140168
parent 71aaa2ff
2008-09-09 Jakub Jelinek <jakub@redhat.com> 2008-09-09 Jakub Jelinek <jakub@redhat.com>
PR other/37419
* ipa-prop.h (ipa_propagate_indirect_call_infos): Change last argument
to pointer to vector pointer.
* ipa-prop.c (ipa_propagate_indirect_call_infos,
propagate_info_to_inlined_callees): Likewise.
(update_call_notes_after_inlining): Likewise. Push new indirect edge
to *new_edges instead of new_edges. Reread IPA_EDGE_REF after
ipa_check_create_edge_args.
* ipa-inline.c (cgraph_decide_recursive_inlining): Change last argument
to pointer to vector pointer.
(cgraph_decide_inlining_of_small_function): Adjust
cgraph_decide_recursive_inlining and ipa_propagate_indirect_call_infos
calls.
PR target/37438 PR target/37438
* config/i386/i386.md (zero_extendqihi2_movzbl): Enable when optimizing * config/i386/i386.md (zero_extendqihi2_movzbl): Enable when optimizing
for size, not speed. for size, not speed.
......
...@@ -646,11 +646,12 @@ lookup_recursive_calls (struct cgraph_node *node, struct cgraph_node *where, ...@@ -646,11 +646,12 @@ lookup_recursive_calls (struct cgraph_node *node, struct cgraph_node *where,
/* Decide on recursive inlining: in the case function has recursive calls, /* Decide on recursive inlining: in the case function has recursive calls,
inline until body size reaches given argument. If any new indirect edges inline until body size reaches given argument. If any new indirect edges
are discovered in the process, add them to NEW_EDGES, unless it is NULL. */ are discovered in the process, add them to *NEW_EDGES, unless NEW_EDGES
is NULL. */
static bool static bool
cgraph_decide_recursive_inlining (struct cgraph_node *node, cgraph_decide_recursive_inlining (struct cgraph_node *node,
VEC (cgraph_edge_p, heap) *new_edges) VEC (cgraph_edge_p, heap) **new_edges)
{ {
int limit = PARAM_VALUE (PARAM_MAX_INLINE_INSNS_RECURSIVE_AUTO); int limit = PARAM_VALUE (PARAM_MAX_INLINE_INSNS_RECURSIVE_AUTO);
int max_depth = PARAM_VALUE (PARAM_MAX_INLINE_RECURSIVE_DEPTH_AUTO); int max_depth = PARAM_VALUE (PARAM_MAX_INLINE_RECURSIVE_DEPTH_AUTO);
...@@ -980,7 +981,9 @@ cgraph_decide_inlining_of_small_functions (void) ...@@ -980,7 +981,9 @@ cgraph_decide_inlining_of_small_functions (void)
where = edge->caller; where = edge->caller;
if (where->global.inlined_to) if (where->global.inlined_to)
where = where->global.inlined_to; where = where->global.inlined_to;
if (!cgraph_decide_recursive_inlining (where, new_indirect_edges)) if (!cgraph_decide_recursive_inlining (where,
flag_indirect_inlining
? &new_indirect_edges : NULL))
continue; continue;
if (flag_indirect_inlining) if (flag_indirect_inlining)
add_new_edges_to_heap (heap, new_indirect_edges); add_new_edges_to_heap (heap, new_indirect_edges);
...@@ -1002,7 +1005,7 @@ cgraph_decide_inlining_of_small_functions (void) ...@@ -1002,7 +1005,7 @@ cgraph_decide_inlining_of_small_functions (void)
cgraph_mark_inline_edge (edge, true); cgraph_mark_inline_edge (edge, true);
if (flag_indirect_inlining) if (flag_indirect_inlining)
{ {
ipa_propagate_indirect_call_infos (edge, new_indirect_edges); ipa_propagate_indirect_call_infos (edge, &new_indirect_edges);
add_new_edges_to_heap (heap, new_indirect_edges); add_new_edges_to_heap (heap, new_indirect_edges);
} }
update_callee_keys (heap, callee, updated_nodes); update_callee_keys (heap, callee, updated_nodes);
......
...@@ -890,12 +890,12 @@ print_edge_addition_message (FILE *f, struct ipa_param_call_note *nt, ...@@ -890,12 +890,12 @@ print_edge_addition_message (FILE *f, struct ipa_param_call_note *nt,
/* Update the param called notes associated with NODE when CS is being inlined, /* Update the param called notes associated with NODE when CS is being inlined,
assuming NODE is (potentially indirectly) inlined into CS->callee. assuming NODE is (potentially indirectly) inlined into CS->callee.
Moreover, if the callee is discovered to be constant, create a new cgraph Moreover, if the callee is discovered to be constant, create a new cgraph
edge for it. Newly discovered indirect edges will be added to NEW_EDGES, edge for it. Newly discovered indirect edges will be added to *NEW_EDGES,
unless it is NULL. */ unless NEW_EDGES is NULL. */
static void static void
update_call_notes_after_inlining (struct cgraph_edge *cs, update_call_notes_after_inlining (struct cgraph_edge *cs,
struct cgraph_node *node, struct cgraph_node *node,
VEC (cgraph_edge_p, heap) *new_edges) VEC (cgraph_edge_p, heap) **new_edges)
{ {
struct ipa_node_params *info = IPA_NODE_REF (node); struct ipa_node_params *info = IPA_NODE_REF (node);
struct ipa_edge_args *top = IPA_EDGE_REF (cs); struct ipa_edge_args *top = IPA_EDGE_REF (cs);
...@@ -949,7 +949,8 @@ update_call_notes_after_inlining (struct cgraph_edge *cs, ...@@ -949,7 +949,8 @@ update_call_notes_after_inlining (struct cgraph_edge *cs,
new_indirect_edge->indirect_call = 1; new_indirect_edge->indirect_call = 1;
ipa_check_create_edge_args (); ipa_check_create_edge_args ();
if (new_edges) if (new_edges)
VEC_safe_push (cgraph_edge_p, heap, new_edges, new_indirect_edge); VEC_safe_push (cgraph_edge_p, heap, *new_edges, new_indirect_edge);
top = IPA_EDGE_REF (cs);
} }
} }
} }
...@@ -959,11 +960,11 @@ update_call_notes_after_inlining (struct cgraph_edge *cs, ...@@ -959,11 +960,11 @@ update_call_notes_after_inlining (struct cgraph_edge *cs,
update_call_notes_after_inlining on all nodes and update_call_notes_after_inlining on all nodes and
update_jump_functions_after_inlining on all non-inlined edges that lead out update_jump_functions_after_inlining on all non-inlined edges that lead out
of this subtree. Newly discovered indirect edges will be added to of this subtree. Newly discovered indirect edges will be added to
NEW_EDGES, unless it is NULL. */ *NEW_EDGES, unless NEW_EDGES is NULL. */
static void static void
propagate_info_to_inlined_callees (struct cgraph_edge *cs, propagate_info_to_inlined_callees (struct cgraph_edge *cs,
struct cgraph_node *node, struct cgraph_node *node,
VEC (cgraph_edge_p, heap) *new_edges) VEC (cgraph_edge_p, heap) **new_edges)
{ {
struct cgraph_edge *e; struct cgraph_edge *e;
...@@ -979,10 +980,10 @@ propagate_info_to_inlined_callees (struct cgraph_edge *cs, ...@@ -979,10 +980,10 @@ propagate_info_to_inlined_callees (struct cgraph_edge *cs,
/* Update jump functions and call note functions on inlining the call site CS. /* Update jump functions and call note functions on inlining the call site CS.
CS is expected to lead to a node already cloned by CS is expected to lead to a node already cloned by
cgraph_clone_inline_nodes. Newly discovered indirect edges will be added to cgraph_clone_inline_nodes. Newly discovered indirect edges will be added to
NEW_EDGES, unless it is NULL. */ *NEW_EDGES, unless NEW_EDGES is NULL. */
void void
ipa_propagate_indirect_call_infos (struct cgraph_edge *cs, ipa_propagate_indirect_call_infos (struct cgraph_edge *cs,
VEC (cgraph_edge_p, heap) *new_edges) VEC (cgraph_edge_p, heap) **new_edges)
{ {
propagate_info_to_inlined_callees (cs, cs->callee, new_edges); propagate_info_to_inlined_callees (cs, cs->callee, new_edges);
} }
......
...@@ -378,7 +378,7 @@ void ipa_create_param_decls_array (struct cgraph_node *); ...@@ -378,7 +378,7 @@ void ipa_create_param_decls_array (struct cgraph_node *);
void ipa_detect_param_modifications (struct cgraph_node *); void ipa_detect_param_modifications (struct cgraph_node *);
void ipa_analyze_params_uses (struct cgraph_node *); void ipa_analyze_params_uses (struct cgraph_node *);
void ipa_propagate_indirect_call_infos (struct cgraph_edge *cs, void ipa_propagate_indirect_call_infos (struct cgraph_edge *cs,
VEC (cgraph_edge_p, heap) *new_edges); VEC (cgraph_edge_p, heap) **new_edges);
/* Debugging interface. */ /* Debugging interface. */
void ipa_print_node_params (FILE *, struct cgraph_node *node); void ipa_print_node_params (FILE *, struct cgraph_node *node);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment