Commit bd31fe14 by Martin Liska Committed by Martin Liska

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
parent 0eef284e
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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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: ...@@ -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: ...@@ -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);
......
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