Hi! With this simple patch, on i686-linux and x86_64-linux with -m32 (no change for -m64), the find_base_term visited_vals.length () > 100 find_base_term statistics changed (fbt is before this patch, fbt2 with this patch): for k in '' '1$'; do for i in 32 64; do for j in fbt fbt2; do \ echo -n "$j $i $k "; LC_ALL=C grep ^$i.*"$k" $j | wc -l; done; done; done fbt 32 5313355 fbt2 32 4229854 fbt 64 217523 fbt2 64 217523 fbt 32 1$ 1296 fbt2 32 1$ 407 fbt 64 1$ 0 fbt2 64 1$ 0 For frame_pointer_needed functions, we need to wait until we see the fp_setter insn in the prologue at which point we disassociate the fp based VALUEs from sp based VALUEs, but for !frame_pointer_needed functions, we IMHO don't need to wait anything. For ACCUMULATE_OUTGOING_ARGS it isn't IMHO worth doing anything, as there is a single sp adjustment and so there is no risk of many thousands deep VALUE chains, but for !ACCUMULATE_OUTGOING_ARGS the sp keeps changing constantly.
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? Perhaps even better would be if we'd be able already in cselib somehow figure out these sp based VALUEs and be able to constantly reuse them and in loc list for them remember (apart from the registers etc. that hold the VALUE ATM) have just (plus:P (value:P sp0) (const_int NNN)) where sp0 would be a VALUE of stack pointer at the start of !frame_pointer_needed functions and for frame_pointer_needed functions say sp VALUE at the point of fp_setter insn. Then if we have sp -= 4 sp -= 4 sp -= 4 sp += 8 sp -= 4 sp += 8 sp -= 4 sp -= 4 sp += 8 we wouldn't need 10 sp based VALUEs, but only one for orig sp, one for orig_sp-4, another one for orig_sp-8, another one for orig_sp-12 and that's it. 2020-03-19 Jakub Jelinek <ja...@redhat.com> PR rtl-optimization/92264 * var-tracking.c (add_stores): Call cselib_set_value_sp_based even for sp based values in !frame_pointer_needed && !ACCUMULATE_OUTGOING_ARGS functions. --- gcc/var-tracking.c.jj 2020-01-12 11:54:38.532381439 +0100 +++ gcc/var-tracking.c 2020-03-19 15:49:19.457340470 +0100 @@ -6112,7 +6112,8 @@ add_stores (rtx loc, const_rtx expr, voi } if (loc == stack_pointer_rtx - && maybe_ne (hard_frame_pointer_adjustment, -1) + && (maybe_ne (hard_frame_pointer_adjustment, -1) + || (!frame_pointer_needed && !ACCUMULATE_OUTGOING_ARGS)) && preserve) cselib_set_value_sp_based (v); Jakub