Commit 4fe663b0 by H.J. Lu Committed by H.J. Lu

re PR middle-end/35897 (DSE doesn't support targets with wide registers)

2008-04-11  H.J. Lu  <hongjiu.lu@intel.com>

	PR middle-end/35897
	* dse.c (store_info): Change positions_needed to unsigned
	HOST_WIDE_INT.
	(lowpart_bitmask): New.
	(record_store): Cast to unsigned HOST_WIDE_INT for
	positions_needed.  Assert width <= size of positions_needed *
	CHAR_BIT.  Call lowpart_bitmask to initialize positions_needed.
	(check_mem_read_rtx): Use unsigned HOST_WIDE_INT on mask.  Call
	lowpart_bitmask to set mask.

From-SVN: r134199
parent 9fdd7520
2008-04-11 H.J. Lu <hongjiu.lu@intel.com>
PR middle-end/35897
* dse.c (store_info): Change positions_needed to unsigned
HOST_WIDE_INT.
(lowpart_bitmask): New.
(record_store): Cast to unsigned HOST_WIDE_INT for
positions_needed. Assert width <= size of positions_needed *
CHAR_BIT. Call lowpart_bitmask to initialize positions_needed.
(check_mem_read_rtx): Use unsigned HOST_WIDE_INT on mask. Call
lowpart_bitmask to set mask.
2008-04-11 Bernd Schmidt <bernd.schmidt@analog.com> 2008-04-11 Bernd Schmidt <bernd.schmidt@analog.com>
* config/bfin/constraints.md: New file. * config/bfin/constraints.md: New file.
......
...@@ -229,7 +229,7 @@ struct store_info ...@@ -229,7 +229,7 @@ struct store_info
/* An bitmask as wide as the number of bytes in the word that /* An bitmask as wide as the number of bytes in the word that
contains a 1 if the byte may be needed. The store is unused if contains a 1 if the byte may be needed. The store is unused if
all of the bits are 0. */ all of the bits are 0. */
long positions_needed; unsigned HOST_WIDE_INT positions_needed;
/* The next store info for this insn. */ /* The next store info for this insn. */
struct store_info *next; struct store_info *next;
...@@ -240,6 +240,15 @@ struct store_info ...@@ -240,6 +240,15 @@ struct store_info
rtx rhs; rtx rhs;
}; };
/* Return a bitmask with the first N low bits set. */
static unsigned HOST_WIDE_INT
lowpart_bitmask (int n)
{
unsigned HOST_WIDE_INT mask = ~(unsigned HOST_WIDE_INT) 0;
return mask >> (HOST_BITS_PER_WIDE_INT - n);
}
typedef struct store_info *store_info_t; typedef struct store_info *store_info_t;
static alloc_pool cse_store_info_pool; static alloc_pool cse_store_info_pool;
static alloc_pool rtx_store_info_pool; static alloc_pool rtx_store_info_pool;
...@@ -1308,7 +1317,7 @@ record_store (rtx body, bb_info_t bb_info) ...@@ -1308,7 +1317,7 @@ record_store (rtx body, bb_info_t bb_info)
&& (GET_MODE (mem) == entry->mode)) && (GET_MODE (mem) == entry->mode))
{ {
delete = true; delete = true;
s_info->positions_needed = 0; s_info->positions_needed = (unsigned HOST_WIDE_INT) 0;
} }
if (dump_file) if (dump_file)
fprintf (dump_file, " trying spill store in insn=%d alias_set=%d\n", fprintf (dump_file, " trying spill store in insn=%d alias_set=%d\n",
...@@ -1324,7 +1333,8 @@ record_store (rtx body, bb_info_t bb_info) ...@@ -1324,7 +1333,8 @@ record_store (rtx body, bb_info_t bb_info)
(int)s_info->begin, (int)s_info->end); (int)s_info->begin, (int)s_info->end);
for (i = offset; i < offset+width; i++) for (i = offset; i < offset+width; i++)
if (i >= s_info->begin && i < s_info->end) if (i >= s_info->begin && i < s_info->end)
s_info->positions_needed &= ~(1L << (i - s_info->begin)); s_info->positions_needed
&= ~(((unsigned HOST_WIDE_INT) 1) << (i - s_info->begin));
} }
else if (s_info->rhs) else if (s_info->rhs)
/* Need to see if it is possible for this store to overwrite /* Need to see if it is possible for this store to overwrite
...@@ -1340,7 +1350,7 @@ record_store (rtx body, bb_info_t bb_info) ...@@ -1340,7 +1350,7 @@ record_store (rtx body, bb_info_t bb_info)
/* An insn can be deleted if every position of every one of /* An insn can be deleted if every position of every one of
its s_infos is zero. */ its s_infos is zero. */
if (s_info->positions_needed != 0) if (s_info->positions_needed != (unsigned HOST_WIDE_INT) 0)
delete = false; delete = false;
if (delete) if (delete)
...@@ -1360,7 +1370,8 @@ record_store (rtx body, bb_info_t bb_info) ...@@ -1360,7 +1370,8 @@ record_store (rtx body, bb_info_t bb_info)
ptr = next; ptr = next;
} }
gcc_assert ((unsigned) width < sizeof (store_info->positions_needed) * CHAR_BIT); gcc_assert ((unsigned) width
<= sizeof (store_info->positions_needed) * CHAR_BIT);
/* Finish filling in the store_info. */ /* Finish filling in the store_info. */
store_info->next = insn_info->store_rec; store_info->next = insn_info->store_rec;
...@@ -1369,7 +1380,7 @@ record_store (rtx body, bb_info_t bb_info) ...@@ -1369,7 +1380,7 @@ record_store (rtx body, bb_info_t bb_info)
store_info->alias_set = spill_alias_set; store_info->alias_set = spill_alias_set;
store_info->mem_addr = get_addr (XEXP (mem, 0)); store_info->mem_addr = get_addr (XEXP (mem, 0));
store_info->cse_base = base; store_info->cse_base = base;
store_info->positions_needed = (1L << width) - 1; store_info->positions_needed = lowpart_bitmask (width);
store_info->group_id = group_id; store_info->group_id = group_id;
store_info->begin = offset; store_info->begin = offset;
store_info->end = offset + width; store_info->end = offset + width;
...@@ -1801,7 +1812,9 @@ check_mem_read_rtx (rtx *loc, void *data) ...@@ -1801,7 +1812,9 @@ check_mem_read_rtx (rtx *loc, void *data)
&& (offset >= store_info->begin) && (offset >= store_info->begin)
&& (offset + width <= store_info->end)) && (offset + width <= store_info->end))
{ {
int mask = ((1L << width) - 1) << (offset - store_info->begin); unsigned HOST_WIDE_INT mask
= (lowpart_bitmask (width)
<< (offset - store_info->begin));
if ((store_info->positions_needed & mask) == mask if ((store_info->positions_needed & mask) == mask
&& replace_read (store_info, i_ptr, && replace_read (store_info, i_ptr,
...@@ -1868,7 +1881,9 @@ check_mem_read_rtx (rtx *loc, void *data) ...@@ -1868,7 +1881,9 @@ check_mem_read_rtx (rtx *loc, void *data)
&& (offset >= store_info->begin) && (offset >= store_info->begin)
&& (offset + width <= store_info->end)) && (offset + width <= store_info->end))
{ {
int mask = ((1L << width) - 1) << (offset - store_info->begin); unsigned HOST_WIDE_INT mask
= (lowpart_bitmask (width)
<< (offset - store_info->begin));
if ((store_info->positions_needed & mask) == mask if ((store_info->positions_needed & mask) == mask
&& replace_read (store_info, i_ptr, && replace_read (store_info, i_ptr,
......
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