Commit cc58ceee by Jakub Jelinek Committed by Jakub Jelinek

re PR tree-optimization/47967 (ICE: verify_stmts failed: conversion of register…

re PR tree-optimization/47967 (ICE: verify_stmts failed: conversion of register to a different size with -fipa-cp on undefined code)

	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.

From-SVN: r170689
parent ea868305
2011-03-05 Jakub Jelinek <jakub@redhat.com>
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 <amodra@gmail.com> 2011-03-05 Alan Modra <amodra@gmail.com>
PR target/47986 PR target/47986
......
/* Interprocedural constant propagation /* Interprocedural constant propagation
Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011
Free Software Foundation, Inc. Free Software Foundation, Inc.
Contributed by Razya Ladelsky <RAZYA@il.ibm.com> Contributed by Razya Ladelsky <RAZYA@il.ibm.com>
...@@ -587,8 +587,9 @@ ipcp_initialize_node_lattices (struct cgraph_node *node) ...@@ -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. /* Build a constant tree with type TREE_TYPE and value according to LAT.
Return the tree. */ Return the tree, or, if it is not possible to convert such value
to TREE_TYPE, NULL. */
static tree static tree
build_const_val (struct ipcp_lattice *lat, tree tree_type) build_const_val (struct ipcp_lattice *lat, tree tree_type)
{ {
...@@ -601,8 +602,10 @@ 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)) if (fold_convertible_p (tree_type, val))
return fold_build1 (NOP_EXPR, 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); return fold_build1 (VIEW_CONVERT_EXPR, tree_type, val);
else
return NULL;
} }
return val; return val;
} }
...@@ -976,8 +979,20 @@ ipcp_create_replace_map (tree parm_tree, struct ipcp_lattice *lat) ...@@ -976,8 +979,20 @@ ipcp_create_replace_map (tree parm_tree, struct ipcp_lattice *lat)
struct ipa_replace_map *replace_map; struct ipa_replace_map *replace_map;
tree const_val; tree const_val;
replace_map = ggc_alloc_ipa_replace_map ();
const_val = build_const_val (lat, TREE_TYPE (parm_tree)); 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) if (dump_file)
{ {
fprintf (dump_file, " replacing param "); fprintf (dump_file, " replacing param ");
...@@ -1378,15 +1393,6 @@ ipcp_insert_stage (void) ...@@ -1378,15 +1393,6 @@ ipcp_insert_stage (void)
continue; 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); info = IPA_NODE_REF (node);
count = ipa_get_param_count (info); count = ipa_get_param_count (info);
...@@ -1413,11 +1419,28 @@ ipcp_insert_stage (void) ...@@ -1413,11 +1419,28 @@ ipcp_insert_stage (void)
{ {
replace_param = replace_param =
ipcp_create_replace_map (parm_tree, lat); ipcp_create_replace_map (parm_tree, lat);
if (replace_param == NULL)
break;
VEC_safe_push (ipa_replace_map_p, gc, replace_trees, replace_param); VEC_safe_push (ipa_replace_map_p, gc, replace_trees, replace_param);
if (args_to_skip) if (args_to_skip)
bitmap_set_bit (args_to_skip, i); 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. */ /* Compute how many callers node has. */
node_callers = 0; node_callers = 0;
......
2011-03-05 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/47967
* gcc.c-torture/compile/pr47967.c: New test.
2011-03-04 Nicola Pero <nicola.pero@meta-innovation.com> 2011-03-04 Nicola Pero <nicola.pero@meta-innovation.com>
* objc.dg/property/property-encoding-1.m: Tidied up testcase. * objc.dg/property/property-encoding-1.m: Tidied up testcase.
......
/* PR tree-optimization/47967 */
extern void abort (void);
static void bar ();
void
foo ()
{
bar (1);
}
static void
bar (double i)
{
if (i)
abort ();
}
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