[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:
parent
83834c0942
commit
4708731cce
@ -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
|
||||||
|
@ -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. */
|
||||||
|
Loading…
Reference in New Issue
Block a user