From 3810ff24db44fde0629e0fc1e6449a219aef94fb Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Wed, 2 Dec 2015 09:47:43 +0000 Subject: [PATCH] re PR tree-optimization/68625 (Segmentation fault in useless_type_conversion_p) 2015-12-02 Richard Biener 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 --- gcc/ChangeLog | 9 +++++ gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/gcc.dg/torture/pr68625.c | 51 ++++++++++++++++++++++++++ gcc/tree-cfgcleanup.c | 25 +++++++++++-- 4 files changed, 86 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr68625.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b7e853d061d..8eaac80b47d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2015-12-02 Richard Biener + + 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 PR tree-optimization/68432 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0d686b2d5e8..81fcff16945 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-12-02 Richard Biener + + PR tree-optimization/68625 + * gcc.dg/torture/pr68625.c: New testcase. + 2015-12-02 Richard Sandiford * gcc.target/i386/pr68432-1.c: New test. diff --git a/gcc/testsuite/gcc.dg/torture/pr68625.c b/gcc/testsuite/gcc.dg/torture/pr68625.c new file mode 100644 index 00000000000..47f837a2418 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr68625.c @@ -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; +} diff --git a/gcc/tree-cfgcleanup.c b/gcc/tree-cfgcleanup.c index 9eee7bb8606..40ad5ca33cd 100644 --- a/gcc/tree-cfgcleanup.c +++ b/gcc/tree-cfgcleanup.c @@ -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); } -- 2.30.2