From 581aedec91ca246f52469d349fbd7664d17d6dc2 Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Tue, 10 Sep 2013 06:29:58 -0600 Subject: [PATCH] re PR tree-optimization/58343 (ICE in dfs_enumerate_from, at cfganal.c:1036) PR tree-optimization/58343 * tree-ssa-threadupdate.c (thread_block): Identify and disable jump threading requests through loop headers buried in the middle of a jump threading path. * tree-ssa-threadedge.c (thread_around_empty_blocks): Fix thinko in return value/type. * gcc.c-torture/compile/pr58343.c: New test. From-SVN: r202441 --- gcc/ChangeLog | 10 ++++++ gcc/testsuite/ChangeLog | 4 +++ gcc/testsuite/gcc.c-torture/compile/pr58343.c | 15 ++++++++ gcc/tree-ssa-threadedge.c | 2 +- gcc/tree-ssa-threadupdate.c | 34 +++++++++++++++---- 5 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr58343.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cd91607f9b78..4607dd63a680 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2013-09-10 Jeff Law + + PR tree-optimization/58343 + * tree-ssa-threadupdate.c (thread_block): Identify and disable + jump threading requests through loop headers buried in the middle + of a jump threading path. + + * tree-ssa-threadedge.c (thread_around_empty_blocks): Fix thinko + in return value/type. + 2013-09-10 Jakub Jelinek PR rtl-optimization/58365 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fe91b24808fb..1e5f483d20ad 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2013-09-10 Jeff Law + + * gcc.c-torture/compile/pr58343.c: New test. + 2013-09-10 Jakub Jelinek PR rtl-optimization/58365 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr58343.c b/gcc/testsuite/gcc.c-torture/compile/pr58343.c new file mode 100644 index 000000000000..cdd2ce9f4a62 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr58343.c @@ -0,0 +1,15 @@ +int a; + +int main () +{ + int b = a; + + for (a = 1; a > 0; a--) + ; + + lbl: + if (b && a) + goto lbl; + + return 0; +} diff --git a/gcc/tree-ssa-threadedge.c b/gcc/tree-ssa-threadedge.c index f2051d7e7d00..14bc4e37329d 100644 --- a/gcc/tree-ssa-threadedge.c +++ b/gcc/tree-ssa-threadedge.c @@ -764,7 +764,7 @@ thread_around_empty_blocks (edge taken_edge, when threading. Thus they can not have visible side effects such as PHI nodes. */ if (!gsi_end_p (gsi_start_phis (bb))) - return NULL; + return false; /* Skip over DEBUG statements at the start of the block. */ gsi = gsi_start_nondebug_bb (bb); diff --git a/gcc/tree-ssa-threadupdate.c b/gcc/tree-ssa-threadupdate.c index 8e40f6668cf5..3c3d3bc80f0a 100644 --- a/gcc/tree-ssa-threadupdate.c +++ b/gcc/tree-ssa-threadupdate.c @@ -640,14 +640,36 @@ thread_block (basic_block bb, bool noloop_only) else e2 = THREAD_TARGET (e); - if (!e2 + if (!e2 || noloop_only) + { /* If NOLOOP_ONLY is true, we only allow threading through the - header of a loop to exit edges. */ - || (noloop_only - && bb == bb->loop_father->header + header of a loop to exit edges. + + There are two cases to consider. The first when BB is the + loop header. We will attempt to thread this elsewhere, so + we can just continue here. */ + + if (bb == bb->loop_father->header && (!loop_exit_edge_p (bb->loop_father, e2) - || THREAD_TARGET2 (e)))) - continue; + || THREAD_TARGET2 (e))) + continue; + + + /* The second occurs when there was loop header buried in a jump + threading path. We do not try and thread this elsewhere, so + just cancel the jump threading request by clearing the AUX + field now. */ + if (bb->loop_father != e2->src->loop_father + && !loop_exit_edge_p (e2->src->loop_father, e2)) + { + /* Since this case is not handled by our special code + to thread through a loop header, we must explicitly + cancel the threading request here. */ + free (e->aux); + e->aux = NULL; + continue; + } + } if (e->dest == e2->src) update_bb_profile_for_threading (e->dest, EDGE_FREQUENCY (e),