Fix segfault with -O2 -fnon-call-exceptions -ftracer

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.
This commit is contained in:
Eric Botcazou 2020-04-23 22:25:04 +02:00
parent 431ee35815
commit cb76fcd7fb
4 changed files with 43 additions and 0 deletions

View 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):

View 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;

View 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

View File

@ -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);
}