alias.c (canon_true_dependence): Special case (mem:blk (scratch)).

* alias.c (canon_true_dependence): Special case (mem:blk (scratch)).

        * gcse.c (free_insn_expr_list_list): New.
        (clear_modify_mem_tables): Use it.  Fix bit set usage.
        (canon_list_insert): Use EXPR_LISTs for expressions.
        (record_last_mem_set_info): Factor BLOCK_NUM (insn).

From-SVN: r52624
This commit is contained in:
Richard Henderson 2002-04-22 11:17:06 -07:00
parent af0d16cdec
commit 0fe854a7e0
3 changed files with 64 additions and 23 deletions

View File

@ -1,3 +1,13 @@
2002-04-22 Richard Henderson <rth@redhat.com>
PR c/6344
* alias.c (canon_true_dependence): Special case (mem:blk (scratch)).
* gcse.c (free_insn_expr_list_list): New.
(clear_modify_mem_tables): Use it. Fix bit set usage.
(canon_list_insert): Use EXPR_LISTs for expressions.
(record_last_mem_set_info): Factor BLOCK_NUM (insn).
2002-04-22 Neil Booth <neil@daikokuya.demon.co.uk>
* cppfiles.c (_cpp_pop_file_buffer): Return void. Move
@ -15,12 +25,12 @@
2002-04-22 Aldy Hernandez <aldyh@redhat.com>
* config/rs6000/altivec.h (vec_xor): Add variant for both args
being vector signed int.
(vec_andc): Same.
(vec_xor): Add variant for both args being vector signed char.
Remove redundant variant.
(vec_andc): Same.
* config/rs6000/altivec.h (vec_xor): Add variant for both args
being vector signed int.
(vec_andc): Same.
(vec_xor): Add variant for both args being vector signed char.
Remove redundant variant.
(vec_andc): Same.
2002-04-21 David S. Miller <davem@redhat.com>

View File

@ -2121,6 +2121,13 @@ canon_true_dependence (mem, mem_mode, mem_addr, x, varies)
if (MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem))
return 1;
/* (mem:BLK (scratch)) is a special mechanism to conflict with everything.
This is used in epilogue deallocation functions. */
if (GET_MODE (x) == BLKmode && GET_CODE (XEXP (x, 0)) == SCRATCH)
return 1;
if (GET_MODE (mem) == BLKmode && GET_CODE (XEXP (mem, 0)) == SCRATCH)
return 1;
if (DIFFERENT_ALIAS_SETS_P (x, mem))
return 0;

View File

@ -697,6 +697,7 @@ static void delete_store PARAMS ((struct ls_expr *,
basic_block));
static void free_store_memory PARAMS ((void));
static void store_motion PARAMS ((void));
static void free_insn_expr_list_list PARAMS ((rtx *));
static void clear_modify_mem_tables PARAMS ((void));
static void free_modify_mem_tables PARAMS ((void));
@ -2387,6 +2388,7 @@ canon_list_insert (dest, unused1, v_insn)
void * v_insn;
{
rtx dest_addr, insn;
int bb;
while (GET_CODE (dest) == SUBREG
|| GET_CODE (dest) == ZERO_EXTRACT
@ -2404,12 +2406,13 @@ canon_list_insert (dest, unused1, v_insn)
dest_addr = get_addr (XEXP (dest, 0));
dest_addr = canon_rtx (dest_addr);
insn = (rtx) v_insn;
bb = BLOCK_NUM (insn);
canon_modify_mem_list[BLOCK_NUM (insn)] =
alloc_INSN_LIST (dest_addr, canon_modify_mem_list[BLOCK_NUM (insn)]);
canon_modify_mem_list[BLOCK_NUM (insn)] =
alloc_INSN_LIST (dest, canon_modify_mem_list[BLOCK_NUM (insn)]);
bitmap_set_bit (canon_modify_mem_list_set, BLOCK_NUM (insn));
canon_modify_mem_list[bb] =
alloc_EXPR_LIST (VOIDmode, dest_addr, canon_modify_mem_list[bb]);
canon_modify_mem_list[bb] =
alloc_EXPR_LIST (VOIDmode, dest, canon_modify_mem_list[bb]);
bitmap_set_bit (canon_modify_mem_list_set, bb);
}
/* Record memory modification information for INSN. We do not actually care
@ -2420,23 +2423,24 @@ static void
record_last_mem_set_info (insn)
rtx insn;
{
int bb = BLOCK_NUM (insn);
/* load_killed_in_block_p will handle the case of calls clobbering
everything. */
modify_mem_list[BLOCK_NUM (insn)] =
alloc_INSN_LIST (insn, modify_mem_list[BLOCK_NUM (insn)]);
bitmap_set_bit (modify_mem_list_set, BLOCK_NUM (insn));
modify_mem_list[bb] = alloc_INSN_LIST (insn, modify_mem_list[bb]);
bitmap_set_bit (modify_mem_list_set, bb);
if (GET_CODE (insn) == CALL_INSN)
{
/* Note that traversals of this loop (other than for free-ing)
will break after encountering a CALL_INSN. So, there's no
need to insert a pair of items, as canon_list_insert does. */
canon_modify_mem_list[BLOCK_NUM (insn)] =
alloc_INSN_LIST (insn, canon_modify_mem_list[BLOCK_NUM (insn)]);
bitmap_set_bit (canon_modify_mem_list_set, BLOCK_NUM (insn));
canon_modify_mem_list[bb] =
alloc_INSN_LIST (insn, canon_modify_mem_list[bb]);
bitmap_set_bit (canon_modify_mem_list_set, bb);
}
else
note_stores (PATTERN (insn), canon_list_insert, (void*) insn );
note_stores (PATTERN (insn), canon_list_insert, (void*) insn);
}
/* Called from compute_hash_table via note_stores to handle one
@ -2712,6 +2716,27 @@ next_set (regno, expr)
return expr;
}
/* Like free_INSN_LIST_list or free_EXPR_LIST_list, except that the node
types may be mixed. */
static void
free_insn_expr_list_list (listp)
rtx *listp;
{
rtx list, next;
for (list = *listp; list ; list = next)
{
next = XEXP (list, 1);
if (GET_CODE (list) == EXPR_LIST)
free_EXPR_LIST_node (list);
else
free_INSN_LIST_node (list);
}
*listp = NULL;
}
/* Clear canon_modify_mem_list and modify_mem_list tables. */
static void
clear_modify_mem_tables ()
@ -2719,14 +2744,13 @@ clear_modify_mem_tables ()
int i;
EXECUTE_IF_SET_IN_BITMAP
(canon_modify_mem_list_set, 0, i,
free_INSN_LIST_list (modify_mem_list + i));
bitmap_clear (canon_modify_mem_list_set);
(modify_mem_list_set, 0, i, free_INSN_LIST_list (modify_mem_list + i));
bitmap_clear (modify_mem_list_set);
EXECUTE_IF_SET_IN_BITMAP
(canon_modify_mem_list_set, 0, i,
free_INSN_LIST_list (canon_modify_mem_list + i));
bitmap_clear (modify_mem_list_set);
free_insn_expr_list_list (canon_modify_mem_list + i));
bitmap_clear (canon_modify_mem_list_set);
}
/* Release memory used by modify_mem_list_set and canon_modify_mem_list_set. */