aboutsummaryrefslogtreecommitdiff
path: root/gcc/flow.c
diff options
context:
space:
mode:
authorHans-Peter Nilsson <hp@axis.com>2005-04-08 23:21:07 +0000
committerHans-Peter Nilsson <hp@gcc.gnu.org>2005-04-08 23:21:07 +0000
commit797e15eb88acf4e561caad06f2f9ba15fdab0447 (patch)
tree1d72b9d686076ceced910af0457b93e924aa7ccf /gcc/flow.c
parent69ea8c65c97d67aa5ebb740736d2d85a263f85de (diff)
downloadgcc-797e15eb88acf4e561caad06f2f9ba15fdab0447.zip
gcc-797e15eb88acf4e561caad06f2f9ba15fdab0447.tar.gz
gcc-797e15eb88acf4e561caad06f2f9ba15fdab0447.tar.bz2
re PR rtl-optimization/20466 (Missed invalidation of known memory contents in flow2...)
PR rtl-optimization/20466 * flow.c (invalidate_mems_from_set): Handle a MEM by checking it for overlap of the address of each list member. (mark_set_1): Call invalidate_mems_from_set for MEMs too. From-SVN: r97870
Diffstat (limited to 'gcc/flow.c')
-rw-r--r--gcc/flow.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/gcc/flow.c b/gcc/flow.c
index bdd72d3..96aa436 100644
--- a/gcc/flow.c
+++ b/gcc/flow.c
@@ -2530,7 +2530,8 @@ invalidate_mems_from_autoinc (rtx *px, void *data)
return 0;
}
-/* EXP is a REG. Remove any dependent entries from pbi->mem_set_list. */
+/* EXP is a REG or MEM. Remove any dependent entries from
+ pbi->mem_set_list. */
static void
invalidate_mems_from_set (struct propagate_block_info *pbi, rtx exp)
@@ -2542,7 +2543,12 @@ invalidate_mems_from_set (struct propagate_block_info *pbi, rtx exp)
while (temp)
{
next = XEXP (temp, 1);
- if (reg_overlap_mentioned_p (exp, XEXP (temp, 0)))
+ if ((REG_P (exp) && reg_overlap_mentioned_p (exp, XEXP (temp, 0)))
+ /* When we get an EXP that is a mem here, we want to check if EXP
+ overlaps the *address* of any of the mems in the list (i.e. not
+ whether the mems actually overlap; that's done elsewhere). */
+ || (MEM_P (exp)
+ && reg_overlap_mentioned_p (exp, XEXP (XEXP (temp, 0), 0))))
{
/* Splice this entry out of the list. */
if (prev)
@@ -2748,11 +2754,12 @@ mark_set_1 (struct propagate_block_info *pbi, enum rtx_code code, rtx reg, rtx c
break;
}
- /* If this set is a MEM, then it kills any aliased writes.
+ /* If this set is a MEM, then it kills any aliased writes and any
+ other MEMs which use it.
If this set is a REG, then it kills any MEMs which use the reg. */
if (optimize && (flags & PROP_SCAN_DEAD_STORES))
{
- if (REG_P (reg))
+ if (REG_P (reg) || MEM_P (reg))
invalidate_mems_from_set (pbi, reg);
/* If the memory reference had embedded side effects (autoincrement