diff options
author | Hans-Peter Nilsson <hp@axis.com> | 2005-04-08 23:21:07 +0000 |
---|---|---|
committer | Hans-Peter Nilsson <hp@gcc.gnu.org> | 2005-04-08 23:21:07 +0000 |
commit | 797e15eb88acf4e561caad06f2f9ba15fdab0447 (patch) | |
tree | 1d72b9d686076ceced910af0457b93e924aa7ccf /gcc/flow.c | |
parent | 69ea8c65c97d67aa5ebb740736d2d85a263f85de (diff) | |
download | gcc-797e15eb88acf4e561caad06f2f9ba15fdab0447.tar.gz |
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.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/gcc/flow.c b/gcc/flow.c index bdd72d30f4f..96aa436540e 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 |