aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2015-12-02 09:47:43 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2015-12-02 09:47:43 +0000
commit3810ff24db44fde0629e0fc1e6449a219aef94fb (patch)
treefa4021b1bfa7ec0b0f842b78c7121c7b80618428
parentd95ab70a3cab2998b4671d842e1ad769e75f19a3 (diff)
downloadgcc-3810ff24db44fde0629e0fc1e6449a219aef94fb.zip
gcc-3810ff24db44fde0629e0fc1e6449a219aef94fb.tar.gz
gcc-3810ff24db44fde0629e0fc1e6449a219aef94fb.tar.bz2
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
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr68625.c51
-rw-r--r--gcc/tree-cfgcleanup.c25
4 files changed, 86 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b7e853d..8eaac80 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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>
PR tree-optimization/68432
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0d686b2..81fcff1 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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>
* 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 0000000..47f837a
--- /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 9eee7bb..40ad5ca 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);
}