From: Hans-Peter Nilsson Date: Fri, 8 Apr 2005 23:21:07 +0000 (+0000) Subject: re PR rtl-optimization/20466 (Missed invalidation of known memory contents in flow2...) X-Git-Tag: misc/cutover-cvs2svn~4237 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=797e15eb88acf4e561caad06f2f9ba15fdab0447;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 470e2215def8..73ec69f286d1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2005-04-09 Hans-Peter Nilsson + + 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. + 2005-04-08 Mike Stump * config/darwin.c (indirect_data): Fix typo in strncmp logic. diff --git a/gcc/flow.c b/gcc/flow.c index bdd72d30f4ff..96aa436540e5 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