Commit 4708731c by Alexandre Oliva Committed by Alexandre Oliva

[PR69123] make dataflow_set_different details more verbose

for  gcc/ChangeLog

	PR bootstrap/69123
	* var-tracking.c (dump_onepart_variable_differences): New.
	(dataflow_set_different): If a detailed dump is requested,
	delay early returns and dump differences between onepart
	variables present before and after, and added variables.

From-SVN: r232217
parent 83834c09
2016-01-11 Alexandre Oliva <aoliva@redhat.com>
PR bootstrap/69123
* var-tracking.c (dump_onepart_variable_differences): New.
(dataflow_set_different): If a detailed dump is requested,
delay early returns and dump differences between onepart
variables present before and after, and added variables.
2016-01-11 Ilya Enkovich <enkovich.gnu@gmail.com> 2016-01-11 Ilya Enkovich <enkovich.gnu@gmail.com>
PR target/69010 PR target/69010
......
...@@ -4921,6 +4921,63 @@ onepart_variable_different_p (variable *var1, variable *var2) ...@@ -4921,6 +4921,63 @@ onepart_variable_different_p (variable *var1, variable *var2)
return lc1 != lc2; return lc1 != lc2;
} }
/* Return true if one-part variables VAR1 and VAR2 are different.
They must be in canonical order. */
static void
dump_onepart_variable_differences (variable *var1, variable *var2)
{
location_chain *lc1, *lc2;
gcc_assert (var1 != var2);
gcc_assert (dump_file);
gcc_assert (dv_as_opaque (var1->dv) == dv_as_opaque (var2->dv));
gcc_assert (var1->n_var_parts == 1
&& var2->n_var_parts == 1);
lc1 = var1->var_part[0].loc_chain;
lc2 = var2->var_part[0].loc_chain;
gcc_assert (lc1 && lc2);
while (lc1 && lc2)
{
switch (loc_cmp (lc1->loc, lc2->loc))
{
case -1:
fprintf (dump_file, "removed: ");
print_rtl_single (dump_file, lc1->loc);
lc1 = lc1->next;
continue;
case 0:
break;
case 1:
fprintf (dump_file, "added: ");
print_rtl_single (dump_file, lc2->loc);
lc2 = lc2->next;
continue;
default:
gcc_unreachable ();
}
lc1 = lc1->next;
lc2 = lc2->next;
}
while (lc1)
{
fprintf (dump_file, "removed: ");
print_rtl_single (dump_file, lc1->loc);
lc1 = lc1->next;
}
while (lc2)
{
fprintf (dump_file, "added: ");
print_rtl_single (dump_file, lc2->loc);
lc2 = lc2->next;
}
}
/* Return true if variables VAR1 and VAR2 are different. */ /* Return true if variables VAR1 and VAR2 are different. */
static bool static bool
...@@ -4964,19 +5021,32 @@ dataflow_set_different (dataflow_set *old_set, dataflow_set *new_set) ...@@ -4964,19 +5021,32 @@ dataflow_set_different (dataflow_set *old_set, dataflow_set *new_set)
{ {
variable_iterator_type hi; variable_iterator_type hi;
variable *var1; variable *var1;
bool diffound = false;
bool details = (dump_file && (dump_flags & TDF_DETAILS));
#define RETRUE \
do \
{ \
if (!details) \
return true; \
else \
diffound = true; \
} \
while (0)
if (old_set->vars == new_set->vars) if (old_set->vars == new_set->vars)
return false; return false;
if (shared_hash_htab (old_set->vars)->elements () if (shared_hash_htab (old_set->vars)->elements ()
!= shared_hash_htab (new_set->vars)->elements ()) != shared_hash_htab (new_set->vars)->elements ())
return true; RETRUE;
FOR_EACH_HASH_TABLE_ELEMENT (*shared_hash_htab (old_set->vars), FOR_EACH_HASH_TABLE_ELEMENT (*shared_hash_htab (old_set->vars),
var1, variable, hi) var1, variable, hi)
{ {
variable_table_type *htab = shared_hash_htab (new_set->vars); variable_table_type *htab = shared_hash_htab (new_set->vars);
variable *var2 = htab->find_with_hash (var1->dv, dv_htab_hash (var1->dv)); variable *var2 = htab->find_with_hash (var1->dv, dv_htab_hash (var1->dv));
if (!var2) if (!var2)
{ {
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
...@@ -4984,26 +5054,49 @@ dataflow_set_different (dataflow_set *old_set, dataflow_set *new_set) ...@@ -4984,26 +5054,49 @@ dataflow_set_different (dataflow_set *old_set, dataflow_set *new_set)
fprintf (dump_file, "dataflow difference found: removal of:\n"); fprintf (dump_file, "dataflow difference found: removal of:\n");
dump_var (var1); dump_var (var1);
} }
return true; RETRUE;
} }
else if (variable_different_p (var1, var2))
if (variable_different_p (var1, var2))
{ {
if (dump_file && (dump_flags & TDF_DETAILS)) if (details)
{ {
fprintf (dump_file, "dataflow difference found: " fprintf (dump_file, "dataflow difference found: "
"old and new follow:\n"); "old and new follow:\n");
dump_var (var1); dump_var (var1);
if (dv_onepart_p (var1->dv))
dump_onepart_variable_differences (var1, var2);
dump_var (var2); dump_var (var2);
} }
return true; RETRUE;
} }
} }
/* No need to traverse the second hashtab, if both have the same number /* There's no need to traverse the second hashtab unless we want to
of elements and the second one had all entries found in the first one, print the details. If both have the same number of elements and
then it can't have any extra entries. */ the second one had all entries found in the first one, then the
return false; second can't have any extra entries. */
if (!details)
return diffound;
FOR_EACH_HASH_TABLE_ELEMENT (*shared_hash_htab (new_set->vars),
var1, variable, hi)
{
variable_table_type *htab = shared_hash_htab (old_set->vars);
variable *var2 = htab->find_with_hash (var1->dv, dv_htab_hash (var1->dv));
if (!var2)
{
if (details)
{
fprintf (dump_file, "dataflow difference found: addition of:\n");
dump_var (var1);
}
RETRUE;
}
}
#undef RETRUE
return diffound;
} }
/* Free the contents of dataflow set SET. */ /* Free the contents of dataflow set SET. */
......
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