rtl-optimization/93946 - fix TBAA for redundant store removal in CSE
authorRichard Biener <rguenther@suse.de>
Wed, 8 Apr 2020 12:04:35 +0000 (14:04 +0200)
committerRichard Biener <rguenther@suse.de>
Wed, 8 Apr 2020 17:27:59 +0000 (19:27 +0200)
It turns out RTL CSE tries to remove redundant stores but fails to
do the usual validity check what such a change is TBAA neutral to
later loads.

This now triggers with the PR93946 testcases on nios2.

2020-04-08  Richard Biener  <rguenther@suse.de>

PR rtl-optimization/93946
* cse.c (cse_insn): Record the tabled expression in
src_related.  Verify a redundant store removal is valid.

gcc/ChangeLog
gcc/cse.c

index ffa8930556dd11ea68eb3e675aaf105e025877ff..025a4a679378c371f96f062f0bb99aad38d9fcff 100644 (file)
@@ -1,3 +1,9 @@
+2020-04-08  Richard Biener  <rguenther@suse.de>
+
+       PR rtl-optimization/93946
+       * cse.c (cse_insn): Record the tabled expression in
+       src_related.  Verify a redundant store removal is valid.
+
 2020-04-08  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR target/94417
index 3e8724b3fedb0f1ce9326952e31b3a7b5f6e7030..f07bbdbebadab8a0d4fad70e6b6a4b8cd9853984 100644 (file)
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -5074,7 +5074,7 @@ cse_insn (rtx_insn *insn)
             to prefer it.  Copy it to src_related.  The code below will
             then give it a negative cost.  */
          if (GET_CODE (dest) == code && rtx_equal_p (p->exp, dest))
-           src_related = dest;
+           src_related = p->exp;
        }
 
       /* Find the cheapest valid equivalent, trying all the available
@@ -5332,7 +5332,16 @@ cse_insn (rtx_insn *insn)
                   && rtx_equal_p (trial, dest)
                   && !side_effects_p (dest)
                   && (cfun->can_delete_dead_exceptions
-                      || insn_nothrow_p (insn)))
+                      || insn_nothrow_p (insn))
+                  /* We can only remove the later store if the earlier aliases
+                     at least all accesses the later one.  */
+                  && (!MEM_P (trial)
+                      || ((MEM_ALIAS_SET (dest) == MEM_ALIAS_SET (trial)
+                           || alias_set_subset_of (MEM_ALIAS_SET (dest),
+                                                   MEM_ALIAS_SET (trial)))
+                           && (!MEM_EXPR (trial)
+                               || refs_same_for_tbaa_p (MEM_EXPR (trial),
+                                                        MEM_EXPR (dest))))))
            {
              SET_SRC (sets[i].rtl) = trial;
              noop_insn = true;