aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2012-01-08 17:39:00 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2012-01-08 16:39:00 +0000
commitd028561e3ccb2dfebd893927a9838f7cf6648a87 (patch)
tree87f7f468983db9f01d7513e26c69f14d1da260e9 /gcc
parent3e31d3ba2c9161817831df25bbfa3031aeeaffb2 (diff)
downloadgcc-d028561e3ccb2dfebd893927a9838f7cf6648a87.zip
gcc-d028561e3ccb2dfebd893927a9838f7cf6648a87.tar.gz
gcc-d028561e3ccb2dfebd893927a9838f7cf6648a87.tar.bz2
re PR tree-optimization/51680 (g++ 4.7 fails to inline trivial template stuff)
PR tree-optimize/51680 * ipa-inline-analyss.c (evaluate_properties_for_edge): Fix conditoin on when known_vals needs to be computed; cleanup. From-SVN: r182995
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/ipa-inline-analysis.c28
2 files changed, 18 insertions, 16 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a2648d8..01e160c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2012-01-08 Jan Hubicka <jh@suse.cz>
+ PR tree-optimize/51680
+ * ipa-inline-analyss.c (evaluate_properties_for_edge): Fix conditoin on when
+ known_vals needs to be computed; cleanup.
+
+2012-01-08 Jan Hubicka <jh@suse.cz>
+
PR tree-optimize/51694
* ipa-cp.c (ipa_get_indirect_edge_target): Add bounds checks.
diff --git a/gcc/ipa-inline-analysis.c b/gcc/ipa-inline-analysis.c
index 5778e68..4026f4e 100644
--- a/gcc/ipa-inline-analysis.c
+++ b/gcc/ipa-inline-analysis.c
@@ -718,7 +718,7 @@ evaluate_properties_for_edge (struct cgraph_edge *e, bool inline_p,
{
struct cgraph_node *callee = cgraph_function_or_thunk_node (e->callee, NULL);
struct inline_summary *info = inline_summary (callee);
- int i;
+ VEC (tree, heap) *known_vals = NULL;
if (clause_ptr)
*clause_ptr = inline_p ? 0 : 1 << predicate_not_inlined_condition;
@@ -728,13 +728,13 @@ evaluate_properties_for_edge (struct cgraph_edge *e, bool inline_p,
*known_binfos_ptr = NULL;
if (ipa_node_params_vector
+ && !e->call_stmt_cannot_inline_p
&& ((clause_ptr && info->conds) || known_vals_ptr || known_binfos_ptr))
{
struct ipa_node_params *parms_info;
struct ipa_edge_args *args = IPA_EDGE_REF (e);
struct inline_edge_summary *es = inline_edge_summary (e);
int i, count = ipa_get_cs_argument_count (args);
- VEC (tree, heap) *known_vals = NULL;
if (e->caller->global.inlined_to)
parms_info = IPA_NODE_REF (e->caller->global.inlined_to);
@@ -752,9 +752,9 @@ evaluate_properties_for_edge (struct cgraph_edge *e, bool inline_p,
ipa_get_ith_jump_func (args, i));
if (cst)
{
- if (info->conds && TREE_CODE (cst) != TREE_BINFO)
+ if (known_vals && TREE_CODE (cst) != TREE_BINFO)
VEC_replace (tree, known_vals, i, cst);
- else if (known_binfos_ptr != NULL)
+ else if (known_binfos_ptr != NULL && TREE_CODE (cst) == TREE_BINFO)
VEC_replace (tree, *known_binfos_ptr, i, cst);
}
else if (inline_p
@@ -763,20 +763,16 @@ evaluate_properties_for_edge (struct cgraph_edge *e, bool inline_p,
i)->change_prob)
VEC_replace (tree, known_vals, i, error_mark_node);
}
-
- if (clause_ptr && info->conds)
- *clause_ptr = evaluate_conditions_for_known_args (callee, inline_p,
- known_vals);
-
- if (known_vals_ptr)
- *known_vals_ptr = known_vals;
- else
- VEC_free (tree, heap, known_vals);
}
- if (clause_ptr && !info->conds)
- for (i = 0; i < (int)VEC_length (condition, info->conds); i++)
- *clause_ptr |= 1 << (i + predicate_first_dynamic_condition);
+ if (clause_ptr)
+ *clause_ptr = evaluate_conditions_for_known_args (callee, inline_p,
+ known_vals);
+
+ if (known_vals_ptr)
+ *known_vals_ptr = known_vals;
+ else
+ VEC_free (tree, heap, known_vals);
}