re PR tree-optimization/48271 (ICE: SIGSEGV in tree_ssa_dominator_optimize (tree-ssa-dom.c:2964) with -O -ftree-vrp -fno-guess-branch-probability -fnon-call-exceptions)

2011-03-24  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/48271
	* tree-ssa-dom.c (tree_ssa_dominator_optimize): Only cleanup
	blocks that still exist.

	* g++.dg/torture/pr48271.C: New testcase.

From-SVN: r171395
This commit is contained in:
Richard Guenther 2011-03-24 14:43:16 +00:00 committed by Richard Biener
parent dbaa912cc8
commit a881aaa769
4 changed files with 134 additions and 2 deletions

View File

@ -1,3 +1,9 @@
2011-03-24 Richard Guenther <rguenther@suse.de>
PR tree-optimization/48271
* tree-ssa-dom.c (tree_ssa_dominator_optimize): Only cleanup
blocks that still exist.
2011-03-24 Richard Guenther <rguenther@suse.de>
PR tree-optimization/48270

View File

@ -1,3 +1,8 @@
2011-03-24 Richard Guenther <rguenther@suse.de>
PR tree-optimization/48271
* g++.dg/torture/pr48271.C: New testcase.
2011-03-24 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/array15.ad[sb]: New test.

View File

@ -0,0 +1,119 @@
// { dg-do compile }
// { dg-options "-ftree-vrp -fno-guess-branch-probability -fnon-call-exceptions" }
void *xalloc ();
void xfree (void *);
void error ();
static inline void *
MallocT ()
{
void *p = xalloc ();
if (!p)
error ();
return p;
}
struct ByteBlob
{
int *header;
ByteBlob();
~ByteBlob ()
{
Free ();
}
int RawFree (int * p)
{
if (!p)
error ();
xfree (p);
}
int *LengthRef ();
void Free ()
{
if (*header)
RawFree (header);
}
int Append (int num_ints)
{
if (*header)
MallocT ();
*LengthRef () += num_ints;
}
};
struct CBlobT:ByteBlob
{
~CBlobT ()
{
Free ();
}
};
template < class T > struct FixedSizeArray
{
int HeaderSize;
T *data;
FixedSizeArray ();
int RefCnt ()
{
return *(int *) MallocT ();
}
~FixedSizeArray ()
{
if (RefCnt ())
for (T * pItem = data + Length (); pItem != data; pItem--)
T ();
}
int Length ();
};
class SmallArray
{
typedef FixedSizeArray < int > SubArray;
typedef FixedSizeArray < SubArray > SuperArray;
SuperArray data;
};
struct CHashTableT
{
int *m_slots;
~CHashTableT ()
{
delete m_slots;
}
};
struct CYapfBaseT
{
int *PfGetSettings ();
SmallArray m_arr;
CHashTableT m_closed;
CYapfBaseT ()
{
MallocT ();
}
};
struct CYapfCostRailT:CYapfBaseT
{
CBlobT m_sig_look_ahead_costs;
CYapfCostRailT ()
{
m_sig_look_ahead_costs.Append (*Yapf ()->PfGetSettings ());
Yapf ()->PfGetSettings ();
}
CYapfBaseT *Yapf ();
};
void stCheckReverseTrain ()
{
CYapfCostRailT pf1;
}

View File

@ -701,7 +701,8 @@ tree_ssa_dominator_optimize (void)
gimple_stmt_iterator gsi;
basic_block bb;
FOR_EACH_BB (bb)
{for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
{
for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
update_stmt_if_modified (gsi_stmt (gsi));
}
}
@ -734,7 +735,8 @@ tree_ssa_dominator_optimize (void)
EXECUTE_IF_SET_IN_BITMAP (need_eh_cleanup, 0, i, bi)
{
basic_block bb = BASIC_BLOCK (i);
if (single_succ_p (bb) == 1
if (bb
&& single_succ_p (bb)
&& (single_succ_edge (bb)->flags & EDGE_EH) == 0)
{
bitmap_clear_bit (need_eh_cleanup, i);