* Do not use PARM_DECLs in ipa-cp and ipa-prop
@ 2013-08-01 13:11 Jan Hubicka
2013-08-01 13:56 ` Richard Biener
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: Jan Hubicka @ 2013-08-01 13:11 UTC (permalink / raw)
To: gcc-patches, mjambor
Hi,
this is preparation work to move DECL_ARGUMENTS and DECL_RESULT into function
sections during WPA. Even with some work to release unused ones, there are 4M
of PARM_DECLs and 2M of RESULT_DECLs streamed during LTO (for 6M of
function_decls) making them one of the most common nodes.
This patch makes ipa-cp and ipa-prop to not use DECL_ARGUMENTS during WPA
stage. this only needed to tamn debug info, move logic doing casts from
get_replacement_map to tree_function_versioning and stream move_cost that is
computed form parm type.
Martin, does this patch look OK?
Honza
* ipa-cp.c (gather_context_independent_values): Use ipa_get_param_move_cost.
(get_replacement_map): Remove PARAM; move parameter folding into tree-inline.c
(create_specialized_node): Update.
* ipa-prop.c (ipa_populate_param_decls): Do not look for origins;
assert that we have gimple body; update move_cost.
(count_formal_params): Assert that we have gimple body.
(ipa_alloc_node_params): Break out from ...
(ipa_initialize_node_params): ... here.
(ipa_get_vector_of_formal_parms): ICE when used in WPA.
(ipa_write_node_info): Stream move costs.
(ipa_read_node_info): Read move costs.
(ipa_update_after_lto_read): Do not recompute node params.
* ipa-prop.h (ipa_param_descriptor): Add move_cost.
(ipa_get_param): Check we are not in WPA.
(ipa_get_param_move_cost): New.
* tree-inline.c (tree_function_versioning): Fold replacement as needed.
Index: ipa-cp.c
===================================================================
*** ipa-cp.c (revision 201291)
--- ipa-cp.c (working copy)
*************** gather_context_independent_values (struc
*** 1758,1770 ****
}
else if (removable_params_cost
&& !ipa_is_param_used (info, i))
! *removable_params_cost
! += estimate_move_cost (TREE_TYPE (ipa_get_param (info, i)));
}
else if (removable_params_cost
&& !ipa_is_param_used (info, i))
*removable_params_cost
! += estimate_move_cost (TREE_TYPE (ipa_get_param (info, i)));
if (known_aggs)
{
--- 1758,1769 ----
}
else if (removable_params_cost
&& !ipa_is_param_used (info, i))
! *removable_params_cost += ipa_get_param_move_cost (info, i);
}
else if (removable_params_cost
&& !ipa_is_param_used (info, i))
*removable_params_cost
! += ipa_get_param_move_cost (info, i);
if (known_aggs)
{
*************** gather_edges_for_value (struct ipcp_valu
*** 2480,2515 ****
Return it or NULL if for some reason it cannot be created. */
static struct ipa_replace_map *
! get_replacement_map (tree value, tree parm, int parm_num)
{
- tree req_type = TREE_TYPE (parm);
struct ipa_replace_map *replace_map;
- if (!useless_type_conversion_p (req_type, TREE_TYPE (value)))
- {
- if (fold_convertible_p (req_type, value))
- value = fold_build1 (NOP_EXPR, req_type, value);
- else if (TYPE_SIZE (req_type) == TYPE_SIZE (TREE_TYPE (value)))
- value = fold_build1 (VIEW_CONVERT_EXPR, req_type, value);
- else
- {
- if (dump_file)
- {
- fprintf (dump_file, " const ");
- print_generic_expr (dump_file, value, 0);
- fprintf (dump_file, " can't be converted to param ");
- print_generic_expr (dump_file, parm, 0);
- fprintf (dump_file, "\n");
- }
- return NULL;
- }
- }
replace_map = ggc_alloc_ipa_replace_map ();
if (dump_file)
{
! fprintf (dump_file, " replacing param ");
! print_generic_expr (dump_file, parm, 0);
fprintf (dump_file, " with const ");
print_generic_expr (dump_file, value, 0);
fprintf (dump_file, "\n");
--- 2479,2494 ----
Return it or NULL if for some reason it cannot be created. */
static struct ipa_replace_map *
! get_replacement_map (tree value, int parm_num)
{
struct ipa_replace_map *replace_map;
replace_map = ggc_alloc_ipa_replace_map ();
if (dump_file)
{
! fprintf (dump_file, " replacing param %i", parm_num);
!
fprintf (dump_file, " with const ");
print_generic_expr (dump_file, value, 0);
fprintf (dump_file, "\n");
*************** create_specialized_node (struct cgraph_n
*** 2697,2703 ****
{
struct ipa_replace_map *replace_map;
! replace_map = get_replacement_map (t, ipa_get_param (info, i), i);
if (replace_map)
vec_safe_push (replace_trees, replace_map);
}
--- 2676,2682 ----
{
struct ipa_replace_map *replace_map;
! replace_map = get_replacement_map (t, i);
if (replace_map)
vec_safe_push (replace_trees, replace_map);
}
Index: ipa-prop.c
===================================================================
*** ipa-prop.c (revision 201291)
--- ipa-prop.c (working copy)
*************** ipa_populate_param_decls (struct cgraph_
*** 130,145 ****
tree parm;
int param_num;
- /* We do not copy DECL_ARGUMENTS to virtual clones. */
- while (node->clone_of)
- node = node->clone_of;
-
fndecl = node->symbol.decl;
fnargs = DECL_ARGUMENTS (fndecl);
param_num = 0;
for (parm = fnargs; parm; parm = DECL_CHAIN (parm))
{
descriptors[param_num].decl = parm;
param_num++;
}
}
--- 130,143 ----
tree parm;
int param_num;
fndecl = node->symbol.decl;
+ gcc_assert (gimple_has_body_p (fndecl));
fnargs = DECL_ARGUMENTS (fndecl);
param_num = 0;
for (parm = fnargs; parm; parm = DECL_CHAIN (parm))
{
descriptors[param_num].decl = parm;
+ descriptors[param_num].move_cost = estimate_move_cost (TREE_TYPE (parm));
param_num++;
}
}
*************** count_formal_params (tree fndecl)
*** 151,156 ****
--- 149,155 ----
{
tree parm;
int count = 0;
+ gcc_assert (gimple_has_body_p (fndecl));
for (parm = DECL_ARGUMENTS (fndecl); parm; parm = DECL_CHAIN (parm))
count++;
*************** count_formal_params (tree fndecl)
*** 158,163 ****
--- 157,174 ----
return count;
}
+ /* Initialize the ipa_node_params structure associated with NODE
+ to hold PARAM_COUNT parameters. */
+
+ void
+ ipa_alloc_node_params (struct cgraph_node *node, int param_count)
+ {
+ struct ipa_node_params *info = IPA_NODE_REF (node);
+
+ if (!info->descriptors.exists () && param_count)
+ info->descriptors.safe_grow_cleared (param_count);
+ }
+
/* Initialize the ipa_node_params structure associated with NODE by counting
the function parameters, creating the descriptors and populating their
param_decls. */
*************** ipa_initialize_node_params (struct cgrap
*** 169,183 ****
if (!info->descriptors.exists ())
{
! int param_count;
! gcc_assert (!node->clone_of);
!
! param_count = count_formal_params (node->symbol.decl);
! if (param_count)
! {
! info->descriptors.safe_grow_cleared (param_count);
! ipa_populate_param_decls (node, info->descriptors);
! }
}
}
--- 180,187 ----
if (!info->descriptors.exists ())
{
! ipa_alloc_node_params (node, count_formal_params (node->symbol.decl));
! ipa_populate_param_decls (node, info->descriptors);
}
}
*************** ipa_get_vector_of_formal_parms (tree fnd
*** 3064,3069 ****
--- 3068,3074 ----
int count;
tree parm;
+ gcc_assert (!flag_wpa);
count = count_formal_params (fndecl);
args.create (count);
for (parm = DECL_ARGUMENTS (fndecl); parm; parm = DECL_CHAIN (parm))
*************** ipa_write_node_info (struct output_block
*** 3856,3861 ****
--- 3861,3869 ----
node_ref = lto_symtab_encoder_encode (encoder, (symtab_node) node);
streamer_write_uhwi (ob, node_ref);
+ streamer_write_uhwi (ob, ipa_get_param_count (info));
+ for (j = 0; j < ipa_get_param_count (info); j++)
+ streamer_write_uhwi (ob, ipa_get_param_move_cost (info, j));
bp = bitpack_create (ob->main_stream);
gcc_assert (info->uses_analysis_done
|| ipa_get_param_count (info) == 0);
*************** ipa_read_node_info (struct lto_input_blo
*** 3896,3903 ****
struct cgraph_edge *e;
struct bitpack_d bp;
! ipa_initialize_node_params (node);
bp = streamer_read_bitpack (ib);
if (ipa_get_param_count (info) != 0)
info->uses_analysis_done = true;
--- 3904,3914 ----
struct cgraph_edge *e;
struct bitpack_d bp;
! ipa_alloc_node_params (node, streamer_read_uhwi (ib));
+ for (k = 0; k < ipa_get_param_count (info); k++)
+ info->descriptors[k].move_cost = streamer_read_uhwi (ib);
+
bp = streamer_read_bitpack (ib);
if (ipa_get_param_count (info) != 0)
info->uses_analysis_done = true;
*************** ipa_prop_read_jump_functions (void)
*** 4049,4061 ****
void
ipa_update_after_lto_read (void)
{
- struct cgraph_node *node;
-
ipa_check_create_node_params ();
ipa_check_create_edge_args ();
-
- FOR_EACH_DEFINED_FUNCTION (node)
- ipa_initialize_node_params (node);
}
void
--- 4060,4067 ----
Index: ipa-prop.h
===================================================================
*** ipa-prop.h (revision 201291)
--- ipa-prop.h (working copy)
*************** struct ipa_param_descriptor
*** 320,325 ****
--- 320,326 ----
says how many there are. If any use could not be described by means of
ipa-prop structures, this is IPA_UNDESCRIBED_USE. */
int controlled_uses;
+ unsigned int move_cost : 31;
/* The parameter is used. */
unsigned used : 1;
};
*************** ipa_get_param_count (struct ipa_node_par
*** 377,385 ****
--- 378,396 ----
static inline tree
ipa_get_param (struct ipa_node_params *info, int i)
{
+ gcc_checking_assert (!flag_wpa);
return info->descriptors[i].decl;
}
+ /* Return the move cost of Ith formal parameter of the function corresponding
+ to INFO. */
+
+ static inline int
+ ipa_get_param_move_cost (struct ipa_node_params *info, int i)
+ {
+ return info->descriptors[i].move_cost;
+ }
+
/* Set the used flag corresponding to the Ith formal parameter of the function
associated with INFO to VAL. */
Index: tree-inline.c
===================================================================
*** tree-inline.c (revision 201291)
--- tree-inline.c (working copy)
*************** tree_function_versioning (tree old_decl,
*** 5146,5162 ****
{
int i = replace_info->parm_num;
tree parm;
for (parm = DECL_ARGUMENTS (old_decl); i; parm = DECL_CHAIN (parm))
i --;
replace_info->old_tree = parm;
}
- gcc_assert (TREE_CODE (replace_info->old_tree) == PARM_DECL);
- init = setup_one_parameter (&id, replace_info->old_tree,
- replace_info->new_tree, id.src_fn,
- NULL,
- &vars);
- if (init)
- init_stmts.safe_push (init);
}
}
/* Copy the function's arguments. */
--- 5150,5192 ----
{
int i = replace_info->parm_num;
tree parm;
+ tree req_type;
+
for (parm = DECL_ARGUMENTS (old_decl); i; parm = DECL_CHAIN (parm))
i --;
replace_info->old_tree = parm;
+ req_type = TREE_TYPE (parm);
+ if (!useless_type_conversion_p (req_type, TREE_TYPE (replace_info->new_tree)))
+ {
+ if (fold_convertible_p (req_type, replace_info->new_tree))
+ replace_info->new_tree = fold_build1 (NOP_EXPR, req_type, replace_info->new_tree);
+ else if (TYPE_SIZE (req_type) == TYPE_SIZE (TREE_TYPE (replace_info->new_tree)))
+ replace_info->new_tree = fold_build1 (VIEW_CONVERT_EXPR, req_type, replace_info->new_tree);
+ else
+ {
+ if (dump_file)
+ {
+ fprintf (dump_file, " const ");
+ print_generic_expr (dump_file, replace_info->new_tree, 0);
+ fprintf (dump_file, " can't be converted to param ");
+ print_generic_expr (dump_file, parm, 0);
+ fprintf (dump_file, "\n");
+ }
+ replace_info->old_tree = NULL;
+ }
+ }
+ }
+ else
+ gcc_assert (TREE_CODE (replace_info->old_tree) == PARM_DECL);
+ if (replace_info->old_tree)
+ {
+ init = setup_one_parameter (&id, replace_info->old_tree,
+ replace_info->new_tree, id.src_fn,
+ NULL,
+ &vars);
+ if (init)
+ init_stmts.safe_push (init);
}
}
}
/* Copy the function's arguments. */
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Do not use PARM_DECLs in ipa-cp and ipa-prop
2013-08-01 13:11 Do not use PARM_DECLs in ipa-cp and ipa-prop Jan Hubicka
@ 2013-08-01 13:56 ` Richard Biener
2013-08-01 15:16 ` Jan Hubicka
2013-08-01 15:37 ` Martin Jambor
2013-08-01 14:18 ` Paolo Carlini
2013-08-01 15:36 ` Martin Jambor
2 siblings, 2 replies; 8+ messages in thread
From: Richard Biener @ 2013-08-01 13:56 UTC (permalink / raw)
To: Jan Hubicka, gcc-patches, mjambor
Jan Hubicka <hubicka@ucw.cz> wrote:
>Hi,
>this is preparation work to move DECL_ARGUMENTS and DECL_RESULT into
>function
>sections during WPA. Even with some work to release unused ones, there
>are 4M
>of PARM_DECLs and 2M of RESULT_DECLs streamed during LTO (for 6M of
>function_decls) making them one of the most common nodes.
>
>This patch makes ipa-cp and ipa-prop to not use DECL_ARGUMENTS during
>WPA
>stage. this only needed to tamn debug info, move logic doing casts
>from
>get_replacement_map to tree_function_versioning and stream move_cost
>that is
>computed form parm type.
>
>Martin, does this patch look OK?
What about uses in jump functions, like &parm? Are those sufficiently non-treeish already?
Richard.
>Honza
>
> * ipa-cp.c (gather_context_independent_values): Use
>ipa_get_param_move_cost.
> (get_replacement_map): Remove PARAM; move parameter folding into
>tree-inline.c
> (create_specialized_node): Update.
> * ipa-prop.c (ipa_populate_param_decls): Do not look for origins;
> assert that we have gimple body; update move_cost.
> (count_formal_params): Assert that we have gimple body.
> (ipa_alloc_node_params): Break out from ...
> (ipa_initialize_node_params): ... here.
> (ipa_get_vector_of_formal_parms): ICE when used in WPA.
> (ipa_write_node_info): Stream move costs.
> (ipa_read_node_info): Read move costs.
> (ipa_update_after_lto_read): Do not recompute node params.
> * ipa-prop.h (ipa_param_descriptor): Add move_cost.
> (ipa_get_param): Check we are not in WPA.
> (ipa_get_param_move_cost): New.
> * tree-inline.c (tree_function_versioning): Fold replacement as
>needed.
>Index: ipa-cp.c
>===================================================================
>*** ipa-cp.c (revision 201291)
>--- ipa-cp.c (working copy)
>*************** gather_context_independent_values (struc
>*** 1758,1770 ****
> }
> else if (removable_params_cost
> && !ipa_is_param_used (info, i))
>! *removable_params_cost
>! += estimate_move_cost (TREE_TYPE (ipa_get_param (info, i)));
> }
> else if (removable_params_cost
> && !ipa_is_param_used (info, i))
> *removable_params_cost
>! += estimate_move_cost (TREE_TYPE (ipa_get_param (info, i)));
>
> if (known_aggs)
> {
>--- 1758,1769 ----
> }
> else if (removable_params_cost
> && !ipa_is_param_used (info, i))
>! *removable_params_cost += ipa_get_param_move_cost (info, i);
> }
> else if (removable_params_cost
> && !ipa_is_param_used (info, i))
> *removable_params_cost
>! += ipa_get_param_move_cost (info, i);
>
> if (known_aggs)
> {
>*************** gather_edges_for_value (struct ipcp_valu
>*** 2480,2515 ****
> Return it or NULL if for some reason it cannot be created. */
>
> static struct ipa_replace_map *
>! get_replacement_map (tree value, tree parm, int parm_num)
> {
>- tree req_type = TREE_TYPE (parm);
> struct ipa_replace_map *replace_map;
>
>- if (!useless_type_conversion_p (req_type, TREE_TYPE (value)))
>- {
>- if (fold_convertible_p (req_type, value))
>- value = fold_build1 (NOP_EXPR, req_type, value);
>- else if (TYPE_SIZE (req_type) == TYPE_SIZE (TREE_TYPE (value)))
>- value = fold_build1 (VIEW_CONVERT_EXPR, req_type, value);
>- else
>- {
>- if (dump_file)
>- {
>- fprintf (dump_file, " const ");
>- print_generic_expr (dump_file, value, 0);
>- fprintf (dump_file, " can't be converted to param ");
>- print_generic_expr (dump_file, parm, 0);
>- fprintf (dump_file, "\n");
>- }
>- return NULL;
>- }
>- }
>
> replace_map = ggc_alloc_ipa_replace_map ();
> if (dump_file)
> {
>! fprintf (dump_file, " replacing param ");
>! print_generic_expr (dump_file, parm, 0);
> fprintf (dump_file, " with const ");
> print_generic_expr (dump_file, value, 0);
> fprintf (dump_file, "\n");
>--- 2479,2494 ----
> Return it or NULL if for some reason it cannot be created. */
>
> static struct ipa_replace_map *
>! get_replacement_map (tree value, int parm_num)
> {
> struct ipa_replace_map *replace_map;
>
>
> replace_map = ggc_alloc_ipa_replace_map ();
> if (dump_file)
> {
>! fprintf (dump_file, " replacing param %i", parm_num);
>!
> fprintf (dump_file, " with const ");
> print_generic_expr (dump_file, value, 0);
> fprintf (dump_file, "\n");
>*************** create_specialized_node (struct cgraph_n
>*** 2697,2703 ****
> {
> struct ipa_replace_map *replace_map;
>
>! replace_map = get_replacement_map (t, ipa_get_param (info, i), i);
> if (replace_map)
> vec_safe_push (replace_trees, replace_map);
> }
>--- 2676,2682 ----
> {
> struct ipa_replace_map *replace_map;
>
>! replace_map = get_replacement_map (t, i);
> if (replace_map)
> vec_safe_push (replace_trees, replace_map);
> }
>Index: ipa-prop.c
>===================================================================
>*** ipa-prop.c (revision 201291)
>--- ipa-prop.c (working copy)
>*************** ipa_populate_param_decls (struct cgraph_
>*** 130,145 ****
> tree parm;
> int param_num;
>
>- /* We do not copy DECL_ARGUMENTS to virtual clones. */
>- while (node->clone_of)
>- node = node->clone_of;
>-
> fndecl = node->symbol.decl;
> fnargs = DECL_ARGUMENTS (fndecl);
> param_num = 0;
> for (parm = fnargs; parm; parm = DECL_CHAIN (parm))
> {
> descriptors[param_num].decl = parm;
> param_num++;
> }
> }
>--- 130,143 ----
> tree parm;
> int param_num;
>
> fndecl = node->symbol.decl;
>+ gcc_assert (gimple_has_body_p (fndecl));
> fnargs = DECL_ARGUMENTS (fndecl);
> param_num = 0;
> for (parm = fnargs; parm; parm = DECL_CHAIN (parm))
> {
> descriptors[param_num].decl = parm;
>+ descriptors[param_num].move_cost = estimate_move_cost
>(TREE_TYPE (parm));
> param_num++;
> }
> }
>*************** count_formal_params (tree fndecl)
>*** 151,156 ****
>--- 149,155 ----
> {
> tree parm;
> int count = 0;
>+ gcc_assert (gimple_has_body_p (fndecl));
>
> for (parm = DECL_ARGUMENTS (fndecl); parm; parm = DECL_CHAIN (parm))
> count++;
>*************** count_formal_params (tree fndecl)
>*** 158,163 ****
>--- 157,174 ----
> return count;
> }
>
>+ /* Initialize the ipa_node_params structure associated with NODE
>+ to hold PARAM_COUNT parameters. */
>+
>+ void
>+ ipa_alloc_node_params (struct cgraph_node *node, int param_count)
>+ {
>+ struct ipa_node_params *info = IPA_NODE_REF (node);
>+
>+ if (!info->descriptors.exists () && param_count)
>+ info->descriptors.safe_grow_cleared (param_count);
>+ }
>+
>/* Initialize the ipa_node_params structure associated with NODE by
>counting
> the function parameters, creating the descriptors and populating their
> param_decls. */
>*************** ipa_initialize_node_params (struct cgrap
>*** 169,183 ****
>
> if (!info->descriptors.exists ())
> {
>! int param_count;
>! gcc_assert (!node->clone_of);
>!
>! param_count = count_formal_params (node->symbol.decl);
>! if (param_count)
>! {
>! info->descriptors.safe_grow_cleared (param_count);
>! ipa_populate_param_decls (node, info->descriptors);
>! }
> }
> }
>
>--- 180,187 ----
>
> if (!info->descriptors.exists ())
> {
>! ipa_alloc_node_params (node, count_formal_params
>(node->symbol.decl));
>! ipa_populate_param_decls (node, info->descriptors);
> }
> }
>
>*************** ipa_get_vector_of_formal_parms (tree fnd
>*** 3064,3069 ****
>--- 3068,3074 ----
> int count;
> tree parm;
>
>+ gcc_assert (!flag_wpa);
> count = count_formal_params (fndecl);
> args.create (count);
> for (parm = DECL_ARGUMENTS (fndecl); parm; parm = DECL_CHAIN (parm))
>*************** ipa_write_node_info (struct output_block
>*** 3856,3861 ****
>--- 3861,3869 ----
> node_ref = lto_symtab_encoder_encode (encoder, (symtab_node) node);
> streamer_write_uhwi (ob, node_ref);
>
>+ streamer_write_uhwi (ob, ipa_get_param_count (info));
>+ for (j = 0; j < ipa_get_param_count (info); j++)
>+ streamer_write_uhwi (ob, ipa_get_param_move_cost (info, j));
> bp = bitpack_create (ob->main_stream);
> gcc_assert (info->uses_analysis_done
> || ipa_get_param_count (info) == 0);
>*************** ipa_read_node_info (struct lto_input_blo
>*** 3896,3903 ****
> struct cgraph_edge *e;
> struct bitpack_d bp;
>
>! ipa_initialize_node_params (node);
>
> bp = streamer_read_bitpack (ib);
> if (ipa_get_param_count (info) != 0)
> info->uses_analysis_done = true;
>--- 3904,3914 ----
> struct cgraph_edge *e;
> struct bitpack_d bp;
>
>! ipa_alloc_node_params (node, streamer_read_uhwi (ib));
>
>+ for (k = 0; k < ipa_get_param_count (info); k++)
>+ info->descriptors[k].move_cost = streamer_read_uhwi (ib);
>+
> bp = streamer_read_bitpack (ib);
> if (ipa_get_param_count (info) != 0)
> info->uses_analysis_done = true;
>*************** ipa_prop_read_jump_functions (void)
>*** 4049,4061 ****
> void
> ipa_update_after_lto_read (void)
> {
>- struct cgraph_node *node;
>-
> ipa_check_create_node_params ();
> ipa_check_create_edge_args ();
>-
>- FOR_EACH_DEFINED_FUNCTION (node)
>- ipa_initialize_node_params (node);
> }
>
> void
>--- 4060,4067 ----
>Index: ipa-prop.h
>===================================================================
>*** ipa-prop.h (revision 201291)
>--- ipa-prop.h (working copy)
>*************** struct ipa_param_descriptor
>*** 320,325 ****
>--- 320,326 ----
>says how many there are. If any use could not be described by means of
> ipa-prop structures, this is IPA_UNDESCRIBED_USE. */
> int controlled_uses;
>+ unsigned int move_cost : 31;
> /* The parameter is used. */
> unsigned used : 1;
> };
>*************** ipa_get_param_count (struct ipa_node_par
>*** 377,385 ****
>--- 378,396 ----
> static inline tree
> ipa_get_param (struct ipa_node_params *info, int i)
> {
>+ gcc_checking_assert (!flag_wpa);
> return info->descriptors[i].decl;
> }
>
>+ /* Return the move cost of Ith formal parameter of the function
>corresponding
>+ to INFO. */
>+
>+ static inline int
>+ ipa_get_param_move_cost (struct ipa_node_params *info, int i)
>+ {
>+ return info->descriptors[i].move_cost;
>+ }
>+
>/* Set the used flag corresponding to the Ith formal parameter of the
>function
> associated with INFO to VAL. */
>
>Index: tree-inline.c
>===================================================================
>*** tree-inline.c (revision 201291)
>--- tree-inline.c (working copy)
>*************** tree_function_versioning (tree old_decl,
>*** 5146,5162 ****
> {
> int i = replace_info->parm_num;
> tree parm;
> for (parm = DECL_ARGUMENTS (old_decl); i; parm = DECL_CHAIN (parm))
> i --;
> replace_info->old_tree = parm;
> }
>- gcc_assert (TREE_CODE (replace_info->old_tree) == PARM_DECL);
>- init = setup_one_parameter (&id, replace_info->old_tree,
>- replace_info->new_tree, id.src_fn,
>- NULL,
>- &vars);
>- if (init)
>- init_stmts.safe_push (init);
> }
> }
> /* Copy the function's arguments. */
>--- 5150,5192 ----
> {
> int i = replace_info->parm_num;
> tree parm;
>+ tree req_type;
>+
> for (parm = DECL_ARGUMENTS (old_decl); i; parm = DECL_CHAIN (parm))
> i --;
> replace_info->old_tree = parm;
>+ req_type = TREE_TYPE (parm);
>+ if (!useless_type_conversion_p (req_type, TREE_TYPE
>(replace_info->new_tree)))
>+ {
>+ if (fold_convertible_p (req_type, replace_info->new_tree))
>+ replace_info->new_tree = fold_build1 (NOP_EXPR, req_type,
>replace_info->new_tree);
>+ else if (TYPE_SIZE (req_type) == TYPE_SIZE (TREE_TYPE
>(replace_info->new_tree)))
>+ replace_info->new_tree = fold_build1 (VIEW_CONVERT_EXPR,
>req_type, replace_info->new_tree);
>+ else
>+ {
>+ if (dump_file)
>+ {
>+ fprintf (dump_file, " const ");
>+ print_generic_expr (dump_file, replace_info->new_tree, 0);
>+ fprintf (dump_file, " can't be converted to param ");
>+ print_generic_expr (dump_file, parm, 0);
>+ fprintf (dump_file, "\n");
>+ }
>+ replace_info->old_tree = NULL;
>+ }
>+ }
>+ }
>+ else
>+ gcc_assert (TREE_CODE (replace_info->old_tree) == PARM_DECL);
>+ if (replace_info->old_tree)
>+ {
>+ init = setup_one_parameter (&id, replace_info->old_tree,
>+ replace_info->new_tree, id.src_fn,
>+ NULL,
>+ &vars);
>+ if (init)
>+ init_stmts.safe_push (init);
> }
> }
> }
> /* Copy the function's arguments. */
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Do not use PARM_DECLs in ipa-cp and ipa-prop
2013-08-01 13:56 ` Richard Biener
@ 2013-08-01 15:16 ` Jan Hubicka
2013-08-01 15:37 ` Martin Jambor
1 sibling, 0 replies; 8+ messages in thread
From: Jan Hubicka @ 2013-08-01 15:16 UTC (permalink / raw)
To: Richard Biener; +Cc: Jan Hubicka, gcc-patches, mjambor
> Jan Hubicka <hubicka@ucw.cz> wrote:
> >Hi,
> >this is preparation work to move DECL_ARGUMENTS and DECL_RESULT into
> >function
> >sections during WPA. Even with some work to release unused ones, there
> >are 4M
> >of PARM_DECLs and 2M of RESULT_DECLs streamed during LTO (for 6M of
> >function_decls) making them one of the most common nodes.
> >
> >This patch makes ipa-cp and ipa-prop to not use DECL_ARGUMENTS during
> >WPA
> >stage. this only needed to tamn debug info, move logic doing casts
> >from
> >get_replacement_map to tree_function_versioning and stream move_cost
> >that is
> >computed form parm type.
> >
> >Martin, does this patch look OK?
>
> What about uses in jump functions, like &parm? Are those sufficiently non-treeish already?
I do not think those can appear in jump functions - it is not IP invariant.
passthrough and friends are non-treeish.
Honza
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Do not use PARM_DECLs in ipa-cp and ipa-prop
2013-08-01 13:56 ` Richard Biener
2013-08-01 15:16 ` Jan Hubicka
@ 2013-08-01 15:37 ` Martin Jambor
1 sibling, 0 replies; 8+ messages in thread
From: Martin Jambor @ 2013-08-01 15:37 UTC (permalink / raw)
To: Richard Biener; +Cc: Jan Hubicka, gcc-patches
Hi,
On Thu, Aug 01, 2013 at 03:59:01PM +0200, Richard Biener wrote:
> Jan Hubicka <hubicka@ucw.cz> wrote:
> >Hi,
> >this is preparation work to move DECL_ARGUMENTS and DECL_RESULT into
> >function
> >sections during WPA. Even with some work to release unused ones, there
> >are 4M
> >of PARM_DECLs and 2M of RESULT_DECLs streamed during LTO (for 6M of
> >function_decls) making them one of the most common nodes.
> >
> >This patch makes ipa-cp and ipa-prop to not use DECL_ARGUMENTS during
> >WPA
> >stage. this only needed to tamn debug info, move logic doing casts
> >from
> >get_replacement_map to tree_function_versioning and stream move_cost
> >that is
> >computed form parm type.
> >
> >Martin, does this patch look OK?
>
> What about uses in jump functions, like &parm? Are those
> sufficiently non-treeish already?
Yes, they use indices to refer to other parameters and are looked up
by indices themselves.
Martin
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Do not use PARM_DECLs in ipa-cp and ipa-prop
2013-08-01 13:11 Do not use PARM_DECLs in ipa-cp and ipa-prop Jan Hubicka
2013-08-01 13:56 ` Richard Biener
@ 2013-08-01 14:18 ` Paolo Carlini
2013-08-01 15:36 ` Martin Jambor
2 siblings, 0 replies; 8+ messages in thread
From: Paolo Carlini @ 2013-08-01 14:18 UTC (permalink / raw)
To: Jan Hubicka; +Cc: gcc-patches, mjambor
Hi,
On 08/01/2013 03:11 PM, Jan Hubicka wrote:
> + replace_info->new_tree = fold_build1 (NOP_EXPR, req_type, replace_info->new_tree);
the tree-inline.c changes don't seem formatted to 80 columns.
Paolo.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Do not use PARM_DECLs in ipa-cp and ipa-prop
2013-08-01 13:11 Do not use PARM_DECLs in ipa-cp and ipa-prop Jan Hubicka
2013-08-01 13:56 ` Richard Biener
2013-08-01 14:18 ` Paolo Carlini
@ 2013-08-01 15:36 ` Martin Jambor
2013-08-01 15:48 ` Jan Hubicka
2 siblings, 1 reply; 8+ messages in thread
From: Martin Jambor @ 2013-08-01 15:36 UTC (permalink / raw)
To: Jan Hubicka; +Cc: gcc-patches
Hi,
On Thu, Aug 01, 2013 at 03:11:36PM +0200, Jan Hubicka wrote:
> Hi,
> this is preparation work to move DECL_ARGUMENTS and DECL_RESULT into function
> sections during WPA. Even with some work to release unused ones, there are 4M
> of PARM_DECLs and 2M of RESULT_DECLs streamed during LTO (for 6M of
> function_decls) making them one of the most common nodes.
>
> This patch makes ipa-cp and ipa-prop to not use DECL_ARGUMENTS during WPA
> stage. this only needed to tamn debug info, move logic doing casts from
> get_replacement_map to tree_function_versioning and stream move_cost that is
> computed form parm type.
>
> Martin, does this patch look OK?
>
Generally yes, except that I think you did not convert some dumping in
ipa-cp.c, at least in functions estimate_local_effects,
find_more_scalar_values_for_callers_subset and decide_about_value. I
believe that after your change there should not be a single call to
ipa_get_param in file ipa-cp.c.
Thanks,
Martin
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Do not use PARM_DECLs in ipa-cp and ipa-prop
2013-08-01 15:36 ` Martin Jambor
@ 2013-08-01 15:48 ` Jan Hubicka
2013-08-02 9:50 ` Martin Jambor
0 siblings, 1 reply; 8+ messages in thread
From: Jan Hubicka @ 2013-08-01 15:48 UTC (permalink / raw)
To: Jan Hubicka, gcc-patches
> Hi,
>
> On Thu, Aug 01, 2013 at 03:11:36PM +0200, Jan Hubicka wrote:
> > Hi,
> > this is preparation work to move DECL_ARGUMENTS and DECL_RESULT into function
> > sections during WPA. Even with some work to release unused ones, there are 4M
> > of PARM_DECLs and 2M of RESULT_DECLs streamed during LTO (for 6M of
> > function_decls) making them one of the most common nodes.
> >
> > This patch makes ipa-cp and ipa-prop to not use DECL_ARGUMENTS during WPA
> > stage. this only needed to tamn debug info, move logic doing casts from
> > get_replacement_map to tree_function_versioning and stream move_cost that is
> > computed form parm type.
> >
> > Martin, does this patch look OK?
> >
>
> Generally yes, except that I think you did not convert some dumping in
> ipa-cp.c, at least in functions estimate_local_effects,
> find_more_scalar_values_for_callers_subset and decide_about_value. I
> believe that after your change there should not be a single call to
> ipa_get_param in file ipa-cp.c.
Hmm, I was aware of that while making the patch but then forgot. OK, I will
convert these too (and the testsuite) and commit.
(alternative I was thining of having ipa_dump_param helper that will dump
"parm 4" in WPA mode and "parm 4 (parmname)" in non-WPA). Do you think it would
be useful? We probably should comonnize syntax of dumps in between ipa-prop
and ipa-inline-analysis predicates (that currently use op4 syntax and call the
parameters operands). Something to track incrementally anyway.
Honza
>
> Thanks,
>
> Martin
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Do not use PARM_DECLs in ipa-cp and ipa-prop
2013-08-01 15:48 ` Jan Hubicka
@ 2013-08-02 9:50 ` Martin Jambor
0 siblings, 0 replies; 8+ messages in thread
From: Martin Jambor @ 2013-08-02 9:50 UTC (permalink / raw)
To: Jan Hubicka; +Cc: gcc-patches
Hi,
On Thu, Aug 01, 2013 at 05:48:20PM +0200, Jan Hubicka wrote:
> > On Thu, Aug 01, 2013 at 03:11:36PM +0200, Jan Hubicka wrote:
> > > Hi,
> > > this is preparation work to move DECL_ARGUMENTS and DECL_RESULT into function
> > > sections during WPA. Even with some work to release unused ones, there are 4M
> > > of PARM_DECLs and 2M of RESULT_DECLs streamed during LTO (for 6M of
> > > function_decls) making them one of the most common nodes.
> > >
> > > This patch makes ipa-cp and ipa-prop to not use DECL_ARGUMENTS during WPA
> > > stage. this only needed to tamn debug info, move logic doing casts from
> > > get_replacement_map to tree_function_versioning and stream move_cost that is
> > > computed form parm type.
> > >
> > > Martin, does this patch look OK?
> > >
> >
> > Generally yes, except that I think you did not convert some dumping in
> > ipa-cp.c, at least in functions estimate_local_effects,
> > find_more_scalar_values_for_callers_subset and decide_about_value. I
> > believe that after your change there should not be a single call to
> > ipa_get_param in file ipa-cp.c.
>
> Hmm, I was aware of that while making the patch but then forgot.
> OK, I will convert these too (and the testsuite) and commit.
> (alternative I was thining of having ipa_dump_param helper that will
> dump "parm 4" in WPA mode and "parm 4 (parmname)" in non-WPA). Do
> you think it would be useful?
Yes, I think it would be very convenient.
> We probably should comonnize syntax of dumps in between ipa-prop
> and ipa-inline-analysis predicates (that currently use op4 syntax and call the
> parameters operands). Something to track incrementally anyway.
>
Indeed.
Thanks,
Martin
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2013-08-02 9:50 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-08-01 13:11 Do not use PARM_DECLs in ipa-cp and ipa-prop Jan Hubicka
2013-08-01 13:56 ` Richard Biener
2013-08-01 15:16 ` Jan Hubicka
2013-08-01 15:37 ` Martin Jambor
2013-08-01 14:18 ` Paolo Carlini
2013-08-01 15:36 ` Martin Jambor
2013-08-01 15:48 ` Jan Hubicka
2013-08-02 9:50 ` Martin Jambor
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).