Commit 3810ff24 by Richard Biener Committed by Richard Biener

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
parent d95ab70a
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>
PR tree-optimization/68432
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>
* gcc.target/i386/pr68432-1.c: New test.
......
/* { 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;
}
......@@ -614,8 +614,6 @@ fixup_noreturn_call (gimple *stmt)
static bool
cleanup_tree_cfg_bb (basic_block bb)
{
bool retval = cleanup_control_flow_bb (bb);
if (tree_forwarder_block_p (bb, false)
&& remove_forwarder_block (bb))
return true;
......@@ -640,7 +638,7 @@ cleanup_tree_cfg_bb (basic_block bb)
}
}
return retval;
return false;
}
/* Iterate the cfg cleanups, while anything changes. */
......@@ -660,8 +658,26 @@ cleanup_tree_cfg_1 (void)
recording of edge to CASE_LABEL_EXPR. */
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. */
/* 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);
for (i = NUM_FIXED_BLOCKS; i < n; i++)
{
......@@ -682,6 +698,7 @@ cleanup_tree_cfg_1 (void)
if (!bb)
continue;
retval |= cleanup_control_flow_bb (bb);
retval |= cleanup_tree_cfg_bb (bb);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment