[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
This commit is contained in:
Alexandre Oliva 2016-01-11 10:40:12 +00:00 committed by Alexandre Oliva
parent 83834c0942
commit 4708731cce
2 changed files with 111 additions and 10 deletions

View File

@ -1,3 +1,11 @@
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

View File

@ -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)
{ {
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)
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. */