mirror of git://gcc.gnu.org/git/gcc.git
re PR ipa/65087 (r220742 causes: ICE: in ipcp_verify_propagated_values, at ipa-cp.c:1057)
Fix PR ipa/65087. PR ipa/65087 * ipa-icf.c (sem_item_optimizer::execute): Change function return value to boolean. (sem_item_optimizer::merge_classes): Likewise. (ipa_icf_driver): Return TODO_remove_functions in case there's a merge operation processed. * ipa-icf.h: Change function return value to boolean. Co-Authored-By: Martin Jambor <mjambor@suse.cz> From-SVN: r221133
This commit is contained in:
parent
0eef284e88
commit
bd31fe14d2
|
|
@ -1,3 +1,14 @@
|
||||||
|
2015-03-03 Martin Liska <mliska@suse.cz>
|
||||||
|
Martin Jambor <mjambor@suse.cz>
|
||||||
|
|
||||||
|
PR ipa/65087
|
||||||
|
* ipa-icf.c (sem_item_optimizer::execute): Change function
|
||||||
|
return value to boolean.
|
||||||
|
(sem_item_optimizer::merge_classes): Likewise.
|
||||||
|
(ipa_icf_driver): Return TODO_remove_functions in case there's
|
||||||
|
a merge operation processed.
|
||||||
|
* ipa-icf.h: Change function return value to boolean.
|
||||||
|
|
||||||
2015-03-02 Michael Meissner <meissner@linux.vnet.ibm.com>
|
2015-03-02 Michael Meissner <meissner@linux.vnet.ibm.com>
|
||||||
|
|
||||||
PR 65138/target
|
PR 65138/target
|
||||||
|
|
|
||||||
|
|
@ -2167,9 +2167,11 @@ sem_item_optimizer::filter_removed_items (void)
|
||||||
m_items.safe_push (filtered[i]);
|
m_items.safe_push (filtered[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Optimizer entry point. */
|
/* Optimizer entry point which returns true in case it processes
|
||||||
|
a merge operation. True is returned if there's a merge operation
|
||||||
|
processed. */
|
||||||
|
|
||||||
void
|
bool
|
||||||
sem_item_optimizer::execute (void)
|
sem_item_optimizer::execute (void)
|
||||||
{
|
{
|
||||||
filter_removed_items ();
|
filter_removed_items ();
|
||||||
|
|
@ -2214,10 +2216,12 @@ sem_item_optimizer::execute (void)
|
||||||
process_cong_reduction ();
|
process_cong_reduction ();
|
||||||
dump_cong_classes ();
|
dump_cong_classes ();
|
||||||
verify_classes ();
|
verify_classes ();
|
||||||
merge_classes (prev_class_count);
|
bool merged_p = merge_classes (prev_class_count);
|
||||||
|
|
||||||
if (dump_file && (dump_flags & TDF_DETAILS))
|
if (dump_file && (dump_flags & TDF_DETAILS))
|
||||||
symtab_node::dump_table (dump_file);
|
symtab_node::dump_table (dump_file);
|
||||||
|
|
||||||
|
return merged_p;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Function responsible for visiting all potential functions and
|
/* Function responsible for visiting all potential functions and
|
||||||
|
|
@ -2870,9 +2874,10 @@ sem_item_optimizer::dump_cong_classes (void)
|
||||||
|
|
||||||
/* After reduction is done, we can declare all items in a group
|
/* After reduction is done, we can declare all items in a group
|
||||||
to be equal. PREV_CLASS_COUNT is start number of classes
|
to be equal. PREV_CLASS_COUNT is start number of classes
|
||||||
before reduction. */
|
before reduction. True is returned if there's a merge operation
|
||||||
|
processed. */
|
||||||
|
|
||||||
void
|
bool
|
||||||
sem_item_optimizer::merge_classes (unsigned int prev_class_count)
|
sem_item_optimizer::merge_classes (unsigned int prev_class_count)
|
||||||
{
|
{
|
||||||
unsigned int item_count = m_items.length ();
|
unsigned int item_count = m_items.length ();
|
||||||
|
|
@ -2882,6 +2887,8 @@ sem_item_optimizer::merge_classes (unsigned int prev_class_count)
|
||||||
unsigned int non_singular_classes_count = 0;
|
unsigned int non_singular_classes_count = 0;
|
||||||
unsigned int non_singular_classes_sum = 0;
|
unsigned int non_singular_classes_sum = 0;
|
||||||
|
|
||||||
|
bool merged_p = false;
|
||||||
|
|
||||||
for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
|
for (hash_table<congruence_class_group_hash>::iterator it = m_classes.begin ();
|
||||||
it != m_classes.end (); ++it)
|
it != m_classes.end (); ++it)
|
||||||
for (unsigned int i = 0; i < (*it)->classes.length (); i++)
|
for (unsigned int i = 0; i < (*it)->classes.length (); i++)
|
||||||
|
|
@ -2952,9 +2959,12 @@ sem_item_optimizer::merge_classes (unsigned int prev_class_count)
|
||||||
alias->dump_to_file (dump_file);
|
alias->dump_to_file (dump_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
source->merge (alias);
|
if (source->merge (alias))
|
||||||
|
merged_p = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return merged_p;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Dump function prints all class members to a FILE with an INDENT. */
|
/* Dump function prints all class members to a FILE with an INDENT. */
|
||||||
|
|
@ -3031,12 +3041,12 @@ ipa_icf_driver (void)
|
||||||
{
|
{
|
||||||
gcc_assert (optimizer);
|
gcc_assert (optimizer);
|
||||||
|
|
||||||
optimizer->execute ();
|
bool merged_p = optimizer->execute ();
|
||||||
|
|
||||||
delete optimizer;
|
delete optimizer;
|
||||||
optimizer = NULL;
|
optimizer = NULL;
|
||||||
|
|
||||||
return 0;
|
return merged_p ? TODO_remove_functions : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
const pass_data pass_data_ipa_icf =
|
const pass_data pass_data_ipa_icf =
|
||||||
|
|
|
||||||
|
|
@ -470,8 +470,10 @@ public:
|
||||||
read-only variables that can be merged. */
|
read-only variables that can be merged. */
|
||||||
void parse_funcs_and_vars (void);
|
void parse_funcs_and_vars (void);
|
||||||
|
|
||||||
/* Optimizer entry point. */
|
/* Optimizer entry point which returns true in case it processes
|
||||||
void execute (void);
|
a merge operation. True is returned if there's a merge operation
|
||||||
|
processed. */
|
||||||
|
bool execute (void);
|
||||||
|
|
||||||
/* Dump function. */
|
/* Dump function. */
|
||||||
void dump (void);
|
void dump (void);
|
||||||
|
|
@ -545,8 +547,9 @@ private:
|
||||||
|
|
||||||
/* After reduction is done, we can declare all items in a group
|
/* After reduction is done, we can declare all items in a group
|
||||||
to be equal. PREV_CLASS_COUNT is start number of classes
|
to be equal. PREV_CLASS_COUNT is start number of classes
|
||||||
before reduction. */
|
before reduction. True is returned if there's a merge operation
|
||||||
void merge_classes (unsigned int prev_class_count);
|
processed. */
|
||||||
|
bool merge_classes (unsigned int prev_class_count);
|
||||||
|
|
||||||
/* Adds a newly created congruence class CLS to worklist. */
|
/* Adds a newly created congruence class CLS to worklist. */
|
||||||
void worklist_push (congruence_class *cls);
|
void worklist_push (congruence_class *cls);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue