mirror of git://gcc.gnu.org/git/gcc.git
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:
parent
d95ab70a3c
commit
3810ff24db
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue