var-tracking: Mark as sp based more VALUEs [PR92264]
authorJakub Jelinek <jakub@redhat.com>
Thu, 26 Mar 2020 08:15:39 +0000 (09:15 +0100)
committerJakub Jelinek <jakub@redhat.com>
Thu, 26 Mar 2020 08:15:39 +0000 (09:15 +0100)
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.

2020-03-26  Jakub Jelinek  <jakub@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/ChangeLog
gcc/var-tracking.c

index 9f7927d748f203cdc0bccac44926e33b2e5a5609..180c92f76f719c25e19008c94e62ea9757fbd7c9 100644 (file)
@@ -1,3 +1,10 @@
+2020-03-26  Jakub Jelinek  <jakub@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.
+
 2020-03-26  Felix Yang  <felix.yang@huawei.com>
 
        PR tree-optimization/94269
index 9984565cd5f1c488798d4406937df1b92bf18def..a9ca16b0f04d4330f74d65dbbe0b46f363b8887f 100644 (file)
@@ -6112,7 +6112,8 @@ add_stores (rtx loc, const_rtx expr, void *cuip)
     }
 
   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);