* [PATCH] Make bitmap_set_bit and bitmap_clear_bit return if the bit changed
@ 2008-07-01 16:10 Richard Guenther
2008-07-02 2:31 ` Ian Lance Taylor
0 siblings, 1 reply; 3+ messages in thread
From: Richard Guenther @ 2008-07-01 16:10 UTC (permalink / raw)
To: gcc-patches
This lets us simplify some code and apply the do-not-write if nothing
will change optimization in the general code.
Bootstrap & regtest running, any objections to that change?
Thanks,
Richard.
2008-07-01 Richard Guenther <rguenther@suse.de>
* bitmap.h (bitmap_set_bit): Return bool.
(bitmap_clear_bit): Likewise.
* bitmap.c (bitmap_set_bit): Return if the bit changed. Only
write to the bitmap if it would.
(bitmap_clear_bit): Likewise.
* tree-ssa-structalias.c (add_implicit_graph_edge): Use
bitmap_set_bit return value.
(add_pred_graph_edge): Likewise.
(add_graph_edge): Likewise.
(do_sd_constraint): Likewise.
(do_ds_constraint): Likewise.
Index: trunk/gcc/tree-ssa-structalias.c
===================================================================
*** trunk.orig/gcc/tree-ssa-structalias.c 2008-07-01 17:25:27.000000000 +0200
--- trunk/gcc/tree-ssa-structalias.c 2008-07-01 17:26:03.000000000 +0200
*************** add_implicit_graph_edge (constraint_grap
*** 904,914 ****
if (!graph->implicit_preds[to])
graph->implicit_preds[to] = BITMAP_ALLOC (&predbitmap_obstack);
! if (!bitmap_bit_p (graph->implicit_preds[to], from))
! {
! stats.num_implicit_edges++;
! bitmap_set_bit (graph->implicit_preds[to], from);
! }
}
/* Add a predecessor graph edge to GRAPH, going from TO to FROM if
--- 904,911 ----
if (!graph->implicit_preds[to])
graph->implicit_preds[to] = BITMAP_ALLOC (&predbitmap_obstack);
! if (bitmap_set_bit (graph->implicit_preds[to], from))
! stats.num_implicit_edges++;
}
/* Add a predecessor graph edge to GRAPH, going from TO to FROM if
*************** add_pred_graph_edge (constraint_graph_t
*** 921,928 ****
{
if (!graph->preds[to])
graph->preds[to] = BITMAP_ALLOC (&predbitmap_obstack);
! if (!bitmap_bit_p (graph->preds[to], from))
! bitmap_set_bit (graph->preds[to], from);
}
/* Add a graph edge to GRAPH, going from FROM to TO if
--- 918,924 ----
{
if (!graph->preds[to])
graph->preds[to] = BITMAP_ALLOC (&predbitmap_obstack);
! bitmap_set_bit (graph->preds[to], from);
}
/* Add a graph edge to GRAPH, going from FROM to TO if
*************** add_graph_edge (constraint_graph_t graph
*** 943,954 ****
if (!graph->succs[from])
graph->succs[from] = BITMAP_ALLOC (&pta_obstack);
! if (!bitmap_bit_p (graph->succs[from], to))
{
r = true;
if (to < FIRST_REF_NODE && from < FIRST_REF_NODE)
stats.num_edges++;
- bitmap_set_bit (graph->succs[from], to);
}
return r;
}
--- 939,949 ----
if (!graph->succs[from])
graph->succs[from] = BITMAP_ALLOC (&pta_obstack);
! if (bitmap_set_bit (graph->succs[from], to))
{
r = true;
if (to < FIRST_REF_NODE && from < FIRST_REF_NODE)
stats.num_edges++;
}
return r;
}
*************** do_sd_constraint (constraint_graph_t gra
*** 1407,1415 ****
if (bitmap_bit_p (delta, anything_id))
{
! flag = !bitmap_bit_p (sol, anything_id);
! if (flag)
! bitmap_set_bit (sol, anything_id);
goto done;
}
--- 1402,1408 ----
if (bitmap_bit_p (delta, anything_id))
{
! flag |= bitmap_set_bit (sol, anything_id);
goto done;
}
*************** do_sd_constraint (constraint_graph_t gra
*** 1436,1448 ****
/* Merging the solution from ESCAPED needlessly increases
the set. Use ESCAPED as representative instead.
Same for CALLUSED. */
! else if ((get_varinfo (t)->id == escaped_id
! || get_varinfo (t)->id == callused_id)
! && !bitmap_bit_p (sol, get_varinfo (t)->id))
! {
! bitmap_set_bit (sol, get_varinfo (t)->id);
! flag = true;
! }
else if (add_graph_edge (graph, lhs, t))
flag |= bitmap_ior_into (sol, get_varinfo (t)->solution);
}
--- 1429,1437 ----
/* Merging the solution from ESCAPED needlessly increases
the set. Use ESCAPED as representative instead.
Same for CALLUSED. */
! else if (get_varinfo (t)->id == escaped_id
! || get_varinfo (t)->id == callused_id)
! flag |= bitmap_set_bit (sol, get_varinfo (t)->id);
else if (add_graph_edge (graph, lhs, t))
flag |= bitmap_ior_into (sol, get_varinfo (t)->solution);
}
*************** do_ds_constraint (constraint_t c, bitmap
*** 1486,1499 ****
continue;
t = find (v->id);
! if (!bitmap_bit_p (get_varinfo (t)->solution, anything_id))
{
! bitmap_set_bit (get_varinfo (t)->solution, anything_id);
! if (!TEST_BIT (changed, t))
! {
! SET_BIT (changed, t);
! changed_count++;
! }
}
}
return;
--- 1475,1485 ----
continue;
t = find (v->id);
! if (bitmap_set_bit (get_varinfo (t)->solution, anything_id)
! && !TEST_BIT (changed, t))
{
! SET_BIT (changed, t);
! changed_count++;
}
}
return;
Index: trunk/gcc/bitmap.c
===================================================================
*** trunk.orig/gcc/bitmap.c 2008-07-01 17:25:27.000000000 +0200
--- trunk/gcc/bitmap.c 2008-07-01 17:25:39.000000000 +0200
*************** bitmap_find_bit (bitmap head, unsigned i
*** 595,603 ****
return element;
}
! /* Clear a single bit in a bitmap. */
! void
bitmap_clear_bit (bitmap head, int bit)
{
bitmap_element *const ptr = bitmap_find_bit (head, bit);
--- 595,603 ----
return element;
}
! /* Clear a single bit in a bitmap. Return true if the bit changed. */
! bool
bitmap_clear_bit (bitmap head, int bit)
{
bitmap_element *const ptr = bitmap_find_bit (head, bit);
*************** bitmap_clear_bit (bitmap head, int bit)
*** 606,622 ****
{
unsigned bit_num = bit % BITMAP_WORD_BITS;
unsigned word_num = bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
! ptr->bits[word_num] &= ~ (((BITMAP_WORD) 1) << bit_num);
/* If we cleared the entire word, free up the element. */
if (bitmap_element_zerop (ptr))
bitmap_element_free (head, ptr);
}
}
! /* Set a single bit in a bitmap. */
! void
bitmap_set_bit (bitmap head, int bit)
{
bitmap_element *ptr = bitmap_find_bit (head, bit);
--- 606,629 ----
{
unsigned bit_num = bit % BITMAP_WORD_BITS;
unsigned word_num = bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
! BITMAP_WORD bit_val = ((BITMAP_WORD) 1) << bit_num;
! bool res = (ptr->bits[word_num] & bit_val) != 0;
! if (res)
! ptr->bits[word_num] &= ~bit_val;
/* If we cleared the entire word, free up the element. */
if (bitmap_element_zerop (ptr))
bitmap_element_free (head, ptr);
+
+ return res;
}
+
+ return false;
}
! /* Set a single bit in a bitmap. Return true if the bit changed. */
! bool
bitmap_set_bit (bitmap head, int bit)
{
bitmap_element *ptr = bitmap_find_bit (head, bit);
*************** bitmap_set_bit (bitmap head, int bit)
*** 630,638 ****
ptr->indx = bit / BITMAP_ELEMENT_ALL_BITS;
ptr->bits[word_num] = bit_val;
bitmap_element_link (head, ptr);
}
else
! ptr->bits[word_num] |= bit_val;
}
/* Return whether a bit is set within a bitmap. */
--- 637,651 ----
ptr->indx = bit / BITMAP_ELEMENT_ALL_BITS;
ptr->bits[word_num] = bit_val;
bitmap_element_link (head, ptr);
+ return true;
}
else
! {
! bool res = (ptr->bits[word_num] & bit_val) == 0;
! if (res)
! ptr->bits[word_num] |= bit_val;
! return res;
! }
}
/* Return whether a bit is set within a bitmap. */
Index: trunk/gcc/bitmap.h
===================================================================
*** trunk.orig/gcc/bitmap.h 2008-07-01 17:25:27.000000000 +0200
--- trunk/gcc/bitmap.h 2008-07-01 17:25:39.000000000 +0200
*************** extern bool bitmap_ior_and_compl (bitmap
*** 136,146 ****
/* A |= (B & ~C). Return true if A changes. */
extern bool bitmap_ior_and_compl_into (bitmap DST, const_bitmap B, const_bitmap C);
! /* Clear a single register in a register set. */
! extern void bitmap_clear_bit (bitmap, int);
! /* Set a single register in a register set. */
! extern void bitmap_set_bit (bitmap, int);
/* Return true if a register is set in a register set. */
extern int bitmap_bit_p (bitmap, int);
--- 136,146 ----
/* A |= (B & ~C). Return true if A changes. */
extern bool bitmap_ior_and_compl_into (bitmap DST, const_bitmap B, const_bitmap C);
! /* Clear a single bit in a bitmap. Return true if the bit changed. */
! extern bool bitmap_clear_bit (bitmap, int);
! /* Set a single bit in a bitmap. Return true if the bit changed. */
! extern bool bitmap_set_bit (bitmap, int);
/* Return true if a register is set in a register set. */
extern int bitmap_bit_p (bitmap, int);
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] Make bitmap_set_bit and bitmap_clear_bit return if the bit changed
2008-07-01 16:10 [PATCH] Make bitmap_set_bit and bitmap_clear_bit return if the bit changed Richard Guenther
@ 2008-07-02 2:31 ` Ian Lance Taylor
2008-07-02 2:58 ` Daniel Berlin
0 siblings, 1 reply; 3+ messages in thread
From: Ian Lance Taylor @ 2008-07-02 2:31 UTC (permalink / raw)
To: Richard Guenther; +Cc: gcc-patches
Richard Guenther <rguenther@suse.de> writes:
> This lets us simplify some code and apply the do-not-write if nothing
> will change optimization in the general code.
>
> Bootstrap & regtest running, any objections to that change?
Looks good to me.
Ian
> 2008-07-01 Richard Guenther <rguenther@suse.de>
>
> * bitmap.h (bitmap_set_bit): Return bool.
> (bitmap_clear_bit): Likewise.
> * bitmap.c (bitmap_set_bit): Return if the bit changed. Only
> write to the bitmap if it would.
> (bitmap_clear_bit): Likewise.
> * tree-ssa-structalias.c (add_implicit_graph_edge): Use
> bitmap_set_bit return value.
> (add_pred_graph_edge): Likewise.
> (add_graph_edge): Likewise.
> (do_sd_constraint): Likewise.
> (do_ds_constraint): Likewise.
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] Make bitmap_set_bit and bitmap_clear_bit return if the bit changed
2008-07-02 2:31 ` Ian Lance Taylor
@ 2008-07-02 2:58 ` Daniel Berlin
0 siblings, 0 replies; 3+ messages in thread
From: Daniel Berlin @ 2008-07-02 2:58 UTC (permalink / raw)
To: Ian Lance Taylor; +Cc: Richard Guenther, gcc-patches
Me too.
As you've discovered, we've actually needed this idiom before.
On Tue, Jul 1, 2008 at 9:26 PM, Ian Lance Taylor <iant@google.com> wrote:
> Richard Guenther <rguenther@suse.de> writes:
>
>> This lets us simplify some code and apply the do-not-write if nothing
>> will change optimization in the general code.
>>
>> Bootstrap & regtest running, any objections to that change?
>
> Looks good to me.
>
> Ian
>
>> 2008-07-01 Richard Guenther <rguenther@suse.de>
>>
>> * bitmap.h (bitmap_set_bit): Return bool.
>> (bitmap_clear_bit): Likewise.
>> * bitmap.c (bitmap_set_bit): Return if the bit changed. Only
>> write to the bitmap if it would.
>> (bitmap_clear_bit): Likewise.
>> * tree-ssa-structalias.c (add_implicit_graph_edge): Use
>> bitmap_set_bit return value.
>> (add_pred_graph_edge): Likewise.
>> (add_graph_edge): Likewise.
>> (do_sd_constraint): Likewise.
>> (do_ds_constraint): Likewise.
>
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2008-07-02 2:31 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-07-01 16:10 [PATCH] Make bitmap_set_bit and bitmap_clear_bit return if the bit changed Richard Guenther
2008-07-02 2:31 ` Ian Lance Taylor
2008-07-02 2:58 ` Daniel Berlin
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).