diff options
| author | hp <hp@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-04-08 23:21:07 +0000 |
|---|---|---|
| committer | hp <hp@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-04-08 23:21:07 +0000 |
| commit | 988f49167193cf59485a83697c4be0e6352f5ee1 (patch) | |
| tree | 1d72b9d686076ceced910af0457b93e924aa7ccf /gcc/flow.c | |
| parent | 5a477d9b1ac897eec50e20c16319ee8869203d13 (diff) | |
| download | ppe42-gcc-988f49167193cf59485a83697c4be0e6352f5ee1.tar.gz ppe42-gcc-988f49167193cf59485a83697c4be0e6352f5ee1.zip | |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@97870 138bc75d-0d04-0410-961f-82ee72b054a4
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 |

