Message ID | ZewfI3MMlf/SF2/e@tucnak |
---|---|
State | New |
Headers | show |
Series | fwprop: Restore previous behavior for forward propagation of RTL with MEMs [PR114284] | expand |
> Am 09.03.2024 um 09:36 schrieb Jakub Jelinek <jakub@redhat.com>: > > Hi! > > Before the recent PR111267 r14-8319 fwprop changes, fwprop would never try > to propagate what was not considered PROFITABLE, where the profitable part > actually was partly about profitability, partly about very good reasons > not to actually propagate and partly for cases where propagation is > completely incorrect. > In particular, classify_result has: > /* Allow (subreg (mem)) -> (mem) simplifications with the following > exceptions: > 1) Propagating (mem)s into multiple uses is not profitable. > 2) Propagating (mem)s across EBBs may not be profitable if the source EBB > runs less frequently. > 3) Propagating (mem)s into paradoxical (subreg)s is not profitable. > 4) Creating new (mem/v)s is not correct, since DCE will not remove the old > ones. */ > if (single_use_p > && single_ebb_p > && SUBREG_P (old_rtx) > && !paradoxical_subreg_p (old_rtx) > && MEM_P (new_rtx) > && !MEM_VOLATILE_P (new_rtx)) > return PROFITABLE; > and didn't mark any other MEM_P (new_rtx) or rtxes which contain > a MEM in its subrtxes as PROFITABLE. Now, since r14-8319 profitable_p > method has been renamed to likely_profitable_p and has just a minor role. > Now, rule 4) above is something that isn't about profitability, but about > correct behavior, if you propagate mem/v, the code is miscompiled. > This particular case has been fixed elsewhere by Haochen in r14-9379. > But I think even the 1) and 2) and maybe 3) are a strong don't do it, > don't rely solely on rtx costs, increasing the number of loads of the same > memory, even when cached, is undesirable, canceling load hoisting can > be undesirable as well. > > So, the following patch restores previous behavior of src contains any MEMs, > in that case likely_profitable_p () is taken as the old profitable_p () > as a requirement rather than just a hint. For propagation of something > which doesn't load from memory this keeps the r14-8319 behavior. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? Ok Richard > 2024-03-09 Jakub Jelinek <jakub@redhat.com> > > PR target/114284 > * fwprop.cc (try_fwprop_subst_pattern): Don't propagate > src containing MEMs unless prop.likely_profitable_p (). > > --- gcc/fwprop.cc.jj 2024-03-08 09:07:29.371626376 +0100 > +++ gcc/fwprop.cc 2024-03-08 16:18:16.125853619 +0100 > @@ -451,6 +451,7 @@ try_fwprop_subst_pattern (obstack_waterm > > if (!prop.likely_profitable_p () > && (prop.changed_mem_p () > + || contains_mem_rtx_p (src) > || use_insn->is_asm () > || !single_set (use_rtl))) > { > > Jakub >
--- gcc/fwprop.cc.jj 2024-03-08 09:07:29.371626376 +0100 +++ gcc/fwprop.cc 2024-03-08 16:18:16.125853619 +0100 @@ -451,6 +451,7 @@ try_fwprop_subst_pattern (obstack_waterm if (!prop.likely_profitable_p () && (prop.changed_mem_p () + || contains_mem_rtx_p (src) || use_insn->is_asm () || !single_set (use_rtl))) {