From 671fe6509b7cf0b182a018b77f91ae494b2e32c1 Mon Sep 17 00:00:00 2001 From: rguenth Date: Fri, 14 Mar 2014 12:54:25 +0000 Subject: [PATCH] 2014-03-14 Richard Biener PR middle-end/60518 * cfghooks.c (split_block): Properly adjust all loops the block was a latch of. * g++.dg/pr60518.C: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@208567 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 8 +++++++- gcc/cfghooks.c | 8 ++++++-- gcc/testsuite/ChangeLog | 7 ++++++- gcc/testsuite/g++.dg/pr60518.C | 13 +++++++++++++ 4 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/g++.dg/pr60518.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b2c7072cc20..95ae779284e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,4 +1,10 @@ -2014-03-13 Martin Jambor +2014-03-14 Richard Biener + + PR middle-end/60518 + * cfghooks.c (split_block): Properly adjust all loops the + block was a latch of. + +2014-03-14 Martin Jambor PR lto/60461 * ipa-prop.c (ipa_modify_call_arguments): Fix iteration condition diff --git a/gcc/cfghooks.c b/gcc/cfghooks.c index 7cf3cd50a66..bc1634aac87 100644 --- a/gcc/cfghooks.c +++ b/gcc/cfghooks.c @@ -510,9 +510,13 @@ split_block (basic_block bb, void *i) if (current_loops != NULL) { + edge_iterator ei; + edge e; add_bb_to_loop (new_bb, bb->loop_father); - if (bb->loop_father->latch == bb) - bb->loop_father->latch = new_bb; + /* Identify all loops bb may have been the latch of and adjust them. */ + FOR_EACH_EDGE (e, ei, new_bb->succs) + if (e->dest->loop_father->latch == bb) + e->dest->loop_father->latch = new_bb; } res = make_single_succ_edge (bb, new_bb, EDGE_FALLTHRU); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7f7c9743567..97e6bba7381 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,4 +1,9 @@ -2014-03-13 Martin Jambor +2014-03-14 Richard Biener + + PR middle-end/60518 + * g++.dg/pr60518.C: New testcase. + +2014-03-14 Martin Jambor PR lto/60461 * gcc.dg/lto/pr60461_0.c: New test. diff --git a/gcc/testsuite/g++.dg/pr60518.C b/gcc/testsuite/g++.dg/pr60518.C new file mode 100644 index 00000000000..e3da48a2ec9 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr60518.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// { dg-options "-Os -fprofile-use" } + +int a; +int fn1 () { return a == ',' || a == ';'; } + +void fn2 () +{ + do + while (fn1 ()) + ; + while (1); +} -- 2.11.4.GIT