Fix segfault with -O2 -fnon-call-exceptions -ftracer
authorEric Botcazou <ebotcazou@gcc.gnu.org>
Thu, 23 Apr 2020 20:25:04 +0000 (22:25 +0200)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Thu, 23 Apr 2020 20:28:02 +0000 (22:28 +0200)
The GIMPLE SSA store merging pass blows up when it is rewriting the
stores because it didn't realize that they don't belong to the same
EH region.  Fixed by refusing to merge them.

PR tree-optimization/94717
* gimple-ssa-store-merging.c (try_coalesce_bswap): Return false if
one of the stores doesn't have the same landing pad number as the
first.
(coalesce_immediate_stores): Do not try to coalesce the store using
bswap if it doesn't have the same landing pad number as the first.

gcc/ChangeLog
gcc/gimple-ssa-store-merging.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/opt/store-merging-4.C [new file with mode: 0644]

index e58d040e04de7bdc783aa04e93ccd050b760aef1..e8d397a37137f7e44f7c7d7e232804aee5152a99 100644 (file)
@@ -1,3 +1,11 @@
+2019-04-23  Eric Botcazou  <ebotcazou@adacore.com>
+
+       PR tree-optimization/94717
+       * gimple-ssa-store-merging.c (try_coalesce_bswap): Return false if one
+       of the stores doesn't have the same landing pad number as the first.
+       (coalesce_immediate_stores): Do not try to coalesce the store using
+       bswap if it doesn't have the same landing pad number as the first.
+
 2020-04-23  Bill Schmidt  <wschmidt@linux.ibm.com>
 
        * gcc/doc/extend.texi (PowerPC AltiVec/VSX Built-in Functions):
index a6687cd9c98e2f66ce390a37090c7b09a6f4d5ea..25753517cc67d9fbb0c36c373d3da2f50c9f4170 100644 (file)
@@ -2435,6 +2435,7 @@ imm_store_chain_info::try_coalesce_bswap (merged_store_group *merged_store,
   for (unsigned int i = first + 1; i < len; ++i)
     {
       if (m_store_info[i]->bitpos != m_store_info[first]->bitpos + width
+         || m_store_info[i]->lp_nr != merged_store->lp_nr
          || m_store_info[i]->ins_stmt == NULL)
        return false;
       width += m_store_info[i]->bitsize;
@@ -2682,6 +2683,7 @@ imm_store_chain_info::coalesce_immediate_stores ()
       if (info->bitpos == merged_store->start + merged_store->width
          && merged_store->stores.length () == 1
          && merged_store->stores[0]->ins_stmt != NULL
+         && info->lp_nr == merged_store->lp_nr
          && info->ins_stmt != NULL)
        {
          unsigned int try_size;
index 249a1520581f134dff85fccc6f67e9d77f764b08..f9ab061922e5729061b252a843f03b428af0004c 100644 (file)
@@ -1,3 +1,7 @@
+2019-04-23  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * g++.dg/opt/store-merging-4.C: New test.
+
 2020-04-23 Iain Sandoe <iain@sandoe.co.uk>
 
        PR c++/94288
diff --git a/gcc/testsuite/g++.dg/opt/store-merging-4.C b/gcc/testsuite/g++.dg/opt/store-merging-4.C
new file mode 100644 (file)
index 0000000..8a51dcd
--- /dev/null
@@ -0,0 +1,29 @@
+// PR tree-optimization/94717
+// Reported by Zdenek Sojka <zsojka@seznam.cz>
+
+// { dg-do compile }
+// { dg-options "-O2 -fnon-call-exceptions -ftracer" }
+
+int abs (int);
+
+static inline void
+bar (int d)
+{
+  d && abs (d);
+}
+
+struct S
+{
+  int a;
+  int b;
+  int c;
+  S (unsigned a, unsigned b) : a (a), b (b) { }
+};
+
+void
+foo (S *x)
+{
+  bar (x->c);
+  new S (x->a, x->b);
+  bar (0);
+}