re PR tree-optimization/68625 (Segmentation fault in useless_type_conversion_p)

2015-12-02  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/68625
	* tree-cfgcleanup.c (cleanup_tree_cfg_bb): Do not call
	cleanup_control_flow_bb.
	(cleanup_tree_cfg_1): First perform cleanup_control_flow_bb
	on all BBs, then cleanup_tree_cfg_bb and finally iterate
	over the worklist doing both.

	* gcc.dg/torture/pr68625.c: New testcase.

From-SVN: r231162
This commit is contained in:
Richard Biener 2015-12-02 09:47:43 +00:00 committed by Richard Biener
parent d95ab70a3c
commit 3810ff24db
4 changed files with 86 additions and 4 deletions

View File

@ -1,3 +1,12 @@
2015-12-02 Richard Biener <rguenther@suse.de>
PR tree-optimization/68625
* tree-cfgcleanup.c (cleanup_tree_cfg_bb): Do not call
cleanup_control_flow_bb.
(cleanup_tree_cfg_1): First perform cleanup_control_flow_bb
on all BBs, then cleanup_tree_cfg_bb and finally iterate
over the worklist doing both.
2015-12-02 Richard Sandiford <richard.sandiford@arm.com> 2015-12-02 Richard Sandiford <richard.sandiford@arm.com>
PR tree-optimization/68432 PR tree-optimization/68432

View File

@ -1,3 +1,8 @@
2015-12-02 Richard Biener <rguenther@suse.de>
PR tree-optimization/68625
* gcc.dg/torture/pr68625.c: New testcase.
2015-12-02 Richard Sandiford <richard.sandiford@arm.com> 2015-12-02 Richard Sandiford <richard.sandiford@arm.com>
* gcc.target/i386/pr68432-1.c: New test. * gcc.target/i386/pr68432-1.c: New test.

View File

@ -0,0 +1,51 @@
/* { dg-do compile } */
/* { dg-additional-options "-w" } */
int **dp;
int sg;
void
z9(void)
{
int pz, oi, vz, yp, zi, hd, pw, gr, w9 = 0, j0 = -1, rb = &w9;
int *lr;
while (w9 < 1) {
lr++;
*lr = 1;
if (*lr < 1)
for (;;)
if (pz && *lr) {
ee:
**dp = 0;
}
pz = zi = vz;
if (j0 ^ (vz > 0))
continue;
**dp = 1;
while (**dp)
if (++oi) {
int mq = dp;
j0 = 1;
while (pw < 1) {
if (++rb && mq)
xq:
hd = sg;
++pw;
}
sg = 0;
while (!sg) {
goto ee;
while (++yp && gr++) {
int i9, xa;
while (++i9 && ++xa)
fb:
;
}
}
}
}
++vz;
if (zi > hd)
goto xq;
goto fb;
}

View File

@ -614,8 +614,6 @@ fixup_noreturn_call (gimple *stmt)
static bool static bool
cleanup_tree_cfg_bb (basic_block bb) cleanup_tree_cfg_bb (basic_block bb)
{ {
bool retval = cleanup_control_flow_bb (bb);
if (tree_forwarder_block_p (bb, false) if (tree_forwarder_block_p (bb, false)
&& remove_forwarder_block (bb)) && remove_forwarder_block (bb))
return true; return true;
@ -640,7 +638,7 @@ cleanup_tree_cfg_bb (basic_block bb)
} }
} }
return retval; return false;
} }
/* Iterate the cfg cleanups, while anything changes. */ /* Iterate the cfg cleanups, while anything changes. */
@ -660,8 +658,26 @@ cleanup_tree_cfg_1 (void)
recording of edge to CASE_LABEL_EXPR. */ recording of edge to CASE_LABEL_EXPR. */
start_recording_case_labels (); start_recording_case_labels ();
/* Start by iterating over all basic blocks. We cannot use FOR_EACH_BB_FN, /* We cannot use FOR_EACH_BB_FN for the BB iterations below
since the basic blocks may get removed. */ since the basic blocks may get removed. */
/* Start by iterating over all basic blocks looking for edge removal
opportunities. Do this first because incoming SSA form may be
invalid and we want to avoid performing SSA related tasks such
as propgating out a PHI node during BB merging in that state. */
n = last_basic_block_for_fn (cfun);
for (i = NUM_FIXED_BLOCKS; i < n; i++)
{
bb = BASIC_BLOCK_FOR_FN (cfun, i);
if (bb)
retval |= cleanup_control_flow_bb (bb);
}
/* After doing the above SSA form should be valid (or an update SSA
should be required). */
/* Continue by iterating over all basic blocks looking for BB merging
opportunities. */
n = last_basic_block_for_fn (cfun); n = last_basic_block_for_fn (cfun);
for (i = NUM_FIXED_BLOCKS; i < n; i++) for (i = NUM_FIXED_BLOCKS; i < n; i++)
{ {
@ -682,6 +698,7 @@ cleanup_tree_cfg_1 (void)
if (!bb) if (!bb)
continue; continue;
retval |= cleanup_control_flow_bb (bb);
retval |= cleanup_tree_cfg_bb (bb); retval |= cleanup_tree_cfg_bb (bb);
} }