Commit 62761a0f by Richard Biener Committed by Richard Biener

tree-cfg.c (struct locus_discrim_map): Store line, not location.

2018-06-05  Richard Biener  <rguenther@suse.de>

	* tree-cfg.c (struct locus_discrim_map): Store line, not location.
	(locus_discrim_hasher::hash): Adjust.
	(locus_discrim_hasher::equal): Likewise.
	(next_discriminator_for_locus): Work on line directly.
	(same_line_p): Pass in expanded locus1 as well.
	(assign_discriminators): Avoid redundant location expansions.

From-SVN: r261194
parent fa385ff4
2018-06-05 Richard Biener <rguenther@suse.de> 2018-06-05 Richard Biener <rguenther@suse.de>
* tree-cfg.c (struct locus_discrim_map): Store line, not location.
(locus_discrim_hasher::hash): Adjust.
(locus_discrim_hasher::equal): Likewise.
(next_discriminator_for_locus): Work on line directly.
(same_line_p): Pass in expanded locus1 as well.
(assign_discriminators): Avoid redundant location expansions.
2018-06-05 Richard Biener <rguenther@suse.de>
PR tree-optimization/86046 PR tree-optimization/86046
* tree-ssa.c (maybe_optimize_var): Clear DECL_GIMPLE_REG_P * tree-ssa.c (maybe_optimize_var): Clear DECL_GIMPLE_REG_P
if required after clearing TREE_ADDRESSABLE. if required after clearing TREE_ADDRESSABLE.
......
...@@ -110,7 +110,7 @@ struct replace_decls_d ...@@ -110,7 +110,7 @@ struct replace_decls_d
/* Hash table to store last discriminator assigned for each locus. */ /* Hash table to store last discriminator assigned for each locus. */
struct locus_discrim_map struct locus_discrim_map
{ {
location_t locus; int location_line;
int discriminator; int discriminator;
}; };
...@@ -129,7 +129,7 @@ struct locus_discrim_hasher : free_ptr_hash <locus_discrim_map> ...@@ -129,7 +129,7 @@ struct locus_discrim_hasher : free_ptr_hash <locus_discrim_map>
inline hashval_t inline hashval_t
locus_discrim_hasher::hash (const locus_discrim_map *item) locus_discrim_hasher::hash (const locus_discrim_map *item)
{ {
return LOCATION_LINE (item->locus); return item->location_line;
} }
/* Equality function for the locus-to-discriminator map. A and B /* Equality function for the locus-to-discriminator map. A and B
...@@ -139,7 +139,7 @@ inline bool ...@@ -139,7 +139,7 @@ inline bool
locus_discrim_hasher::equal (const locus_discrim_map *a, locus_discrim_hasher::equal (const locus_discrim_map *a,
const locus_discrim_map *b) const locus_discrim_map *b)
{ {
return LOCATION_LINE (a->locus) == LOCATION_LINE (b->locus); return a->location_line == b->location_line;
} }
static hash_table<locus_discrim_hasher> *discriminator_per_locus; static hash_table<locus_discrim_hasher> *discriminator_per_locus;
...@@ -1168,21 +1168,20 @@ gimple_find_sub_bbs (gimple_seq seq, gimple_stmt_iterator *gsi) ...@@ -1168,21 +1168,20 @@ gimple_find_sub_bbs (gimple_seq seq, gimple_stmt_iterator *gsi)
profiling. */ profiling. */
static int static int
next_discriminator_for_locus (location_t locus) next_discriminator_for_locus (int line)
{ {
struct locus_discrim_map item; struct locus_discrim_map item;
struct locus_discrim_map **slot; struct locus_discrim_map **slot;
item.locus = locus; item.location_line = line;
item.discriminator = 0; item.discriminator = 0;
slot = discriminator_per_locus->find_slot_with_hash ( slot = discriminator_per_locus->find_slot_with_hash (&item, line, INSERT);
&item, LOCATION_LINE (locus), INSERT);
gcc_assert (slot); gcc_assert (slot);
if (*slot == HTAB_EMPTY_ENTRY) if (*slot == HTAB_EMPTY_ENTRY)
{ {
*slot = XNEW (struct locus_discrim_map); *slot = XNEW (struct locus_discrim_map);
gcc_assert (*slot); gcc_assert (*slot);
(*slot)->locus = locus; (*slot)->location_line = line;
(*slot)->discriminator = 0; (*slot)->discriminator = 0;
} }
(*slot)->discriminator++; (*slot)->discriminator++;
...@@ -1192,23 +1191,22 @@ next_discriminator_for_locus (location_t locus) ...@@ -1192,23 +1191,22 @@ next_discriminator_for_locus (location_t locus)
/* Return TRUE if LOCUS1 and LOCUS2 refer to the same source line. */ /* Return TRUE if LOCUS1 and LOCUS2 refer to the same source line. */
static bool static bool
same_line_p (location_t locus1, location_t locus2) same_line_p (location_t locus1, expanded_location *from, location_t locus2)
{ {
expanded_location from, to; expanded_location to;
if (locus1 == locus2) if (locus1 == locus2)
return true; return true;
from = expand_location (locus1);
to = expand_location (locus2); to = expand_location (locus2);
if (from.line != to.line) if (from->line != to.line)
return false; return false;
if (from.file == to.file) if (from->file == to.file)
return true; return true;
return (from.file != NULL return (from->file != NULL
&& to.file != NULL && to.file != NULL
&& filename_cmp (from.file, to.file) == 0); && filename_cmp (from->file, to.file) == 0);
} }
/* Assign discriminators to each basic block. */ /* Assign discriminators to each basic block. */
...@@ -1228,17 +1226,23 @@ assign_discriminators (void) ...@@ -1228,17 +1226,23 @@ assign_discriminators (void)
if (locus == UNKNOWN_LOCATION) if (locus == UNKNOWN_LOCATION)
continue; continue;
expanded_location locus_e = expand_location (locus);
FOR_EACH_EDGE (e, ei, bb->succs) FOR_EACH_EDGE (e, ei, bb->succs)
{ {
gimple *first = first_non_label_stmt (e->dest); gimple *first = first_non_label_stmt (e->dest);
gimple *last = last_stmt (e->dest); gimple *last = last_stmt (e->dest);
if ((first && same_line_p (locus, gimple_location (first))) if ((first && same_line_p (locus, &locus_e,
|| (last && same_line_p (locus, gimple_location (last)))) gimple_location (first)))
|| (last && same_line_p (locus, &locus_e,
gimple_location (last))))
{ {
if (e->dest->discriminator != 0 && bb->discriminator == 0) if (e->dest->discriminator != 0 && bb->discriminator == 0)
bb->discriminator = next_discriminator_for_locus (locus); bb->discriminator
= next_discriminator_for_locus (locus_e.line);
else else
e->dest->discriminator = next_discriminator_for_locus (locus); e->dest->discriminator
= next_discriminator_for_locus (locus_e.line);
} }
} }
} }
......
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