From f9e9b5741d681c672d96e3e349f8c2c88bf200cd Mon Sep 17 00:00:00 2001 From: jakub Date: Fri, 4 Mar 2011 23:07:20 +0000 Subject: [PATCH] PR tree-optimization/47967 * ipa-cp.c (build_const_val): Return NULL instead of creating VIEW_CONVERT_EXPR for mismatching sizes. (ipcp_create_replace_map): Return NULL if build_const_val failed. (ipcp_insert_stage): If ipcp_create_replace_map returns NULL, give up on versioning. * gcc.c-torture/compile/pr47967.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@170689 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 9 +++++ gcc/ipa-cp.c | 51 +++++++++++++++++++-------- gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/gcc.c-torture/compile/pr47967.c | 17 +++++++++ 4 files changed, 68 insertions(+), 14 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr47967.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9cb86c6..c9c1540 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2011-03-05 Jakub Jelinek + + PR tree-optimization/47967 + * ipa-cp.c (build_const_val): Return NULL instead of creating + VIEW_CONVERT_EXPR for mismatching sizes. + (ipcp_create_replace_map): Return NULL if build_const_val failed. + (ipcp_insert_stage): If ipcp_create_replace_map returns NULL, + give up on versioning. + 2011-03-05 Alan Modra PR target/47986 diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c index 0ef640b..db0941c 100644 --- a/gcc/ipa-cp.c +++ b/gcc/ipa-cp.c @@ -1,5 +1,5 @@ /* Interprocedural constant propagation - Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 + Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. Contributed by Razya Ladelsky @@ -587,8 +587,9 @@ ipcp_initialize_node_lattices (struct cgraph_node *node) } } -/* build INTEGER_CST tree with type TREE_TYPE and value according to LAT. - Return the tree. */ +/* Build a constant tree with type TREE_TYPE and value according to LAT. + Return the tree, or, if it is not possible to convert such value + to TREE_TYPE, NULL. */ static tree build_const_val (struct ipcp_lattice *lat, tree tree_type) { @@ -601,8 +602,10 @@ build_const_val (struct ipcp_lattice *lat, tree tree_type) { if (fold_convertible_p (tree_type, val)) return fold_build1 (NOP_EXPR, tree_type, val); - else + else if (TYPE_SIZE (tree_type) == TYPE_SIZE (TREE_TYPE (val))) return fold_build1 (VIEW_CONVERT_EXPR, tree_type, val); + else + return NULL; } return val; } @@ -976,8 +979,20 @@ ipcp_create_replace_map (tree parm_tree, struct ipcp_lattice *lat) struct ipa_replace_map *replace_map; tree const_val; - replace_map = ggc_alloc_ipa_replace_map (); const_val = build_const_val (lat, TREE_TYPE (parm_tree)); + if (const_val == NULL_TREE) + { + if (dump_file) + { + fprintf (dump_file, " const "); + print_generic_expr (dump_file, lat->constant, 0); + fprintf (dump_file, " can't be converted to param "); + print_generic_expr (dump_file, parm_tree, 0); + fprintf (dump_file, "\n"); + } + return NULL; + } + replace_map = ggc_alloc_ipa_replace_map (); if (dump_file) { fprintf (dump_file, " replacing param "); @@ -1378,15 +1393,6 @@ ipcp_insert_stage (void) continue; } - new_size += growth; - - /* Look if original function becomes dead after cloning. */ - for (cs = node->callers; cs != NULL; cs = cs->next_caller) - if (cs->caller == node || ipcp_need_redirect_p (cs)) - break; - if (!cs && cgraph_will_be_removed_from_program_if_no_direct_calls (node)) - bitmap_set_bit (dead_nodes, node->uid); - info = IPA_NODE_REF (node); count = ipa_get_param_count (info); @@ -1413,11 +1419,28 @@ ipcp_insert_stage (void) { replace_param = ipcp_create_replace_map (parm_tree, lat); + if (replace_param == NULL) + break; VEC_safe_push (ipa_replace_map_p, gc, replace_trees, replace_param); if (args_to_skip) bitmap_set_bit (args_to_skip, i); } } + if (i < count) + { + if (dump_file) + fprintf (dump_file, "Not versioning, some parameters couldn't be replaced"); + continue; + } + + new_size += growth; + + /* Look if original function becomes dead after cloning. */ + for (cs = node->callers; cs != NULL; cs = cs->next_caller) + if (cs->caller == node || ipcp_need_redirect_p (cs)) + break; + if (!cs && cgraph_will_be_removed_from_program_if_no_direct_calls (node)) + bitmap_set_bit (dead_nodes, node->uid); /* Compute how many callers node has. */ node_callers = 0; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 06b9e1d..055e9ac 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-03-05 Jakub Jelinek + + PR tree-optimization/47967 + * gcc.c-torture/compile/pr47967.c: New test. + 2011-03-04 Nicola Pero * objc.dg/property/property-encoding-1.m: Tidied up testcase. diff --git a/gcc/testsuite/gcc.c-torture/compile/pr47967.c b/gcc/testsuite/gcc.c-torture/compile/pr47967.c new file mode 100644 index 0000000..cc2c213 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr47967.c @@ -0,0 +1,17 @@ +/* PR tree-optimization/47967 */ + +extern void abort (void); +static void bar (); + +void +foo () +{ + bar (1); +} + +static void +bar (double i) +{ + if (i) + abort (); +} -- 2.7.4