From ee597801cc32f80c8a959150bbb5d6592c09885b Mon Sep 17 00:00:00 2001 From: Richard Guenther <rguenther@suse.de> Date: Wed, 1 Dec 2010 13:13:23 +0000 Subject: [PATCH] re PR bootstrap/46730 (Failed to profiledbootstrap) 2010-12-01 Richard Guenther <rguenther@suse.de> PR tree-optimization/46730 * value-prof.c (gimple_ic): Always generate a separate merge BB. * g++.dg/tree-prof/indir-call-prof-2.C: New testcase. From-SVN: r167326 --- gcc/ChangeLog | 5 +++ gcc/testsuite/ChangeLog | 5 +++ .../g++.dg/tree-prof/indir-call-prof-2.C | 35 +++++++++++++++++++ gcc/value-prof.c | 9 +++-- 4 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/tree-prof/indir-call-prof-2.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 735cde3eff97..56bb5347d2d4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2010-12-01 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/46730 + * value-prof.c (gimple_ic): Always generate a separate merge BB. + 2010-11-30 Ian Lance Taylor <iant@google.com> * config/i386/linux.h (ASM_SPEC): Pass -v as -v, not -V. Remove diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1514fd0f03b1..55f33a1068e6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-12-01 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/46730 + * g++.dg/tree-prof/indir-call-prof-2.C: New testcase. + 2010-11-30 Michael Meissner <meissner@linux.vnet.ibm.com> * gcc.target/powerpc/ppc-fma-7.c: New file, test that (a*b)+c and diff --git a/gcc/testsuite/g++.dg/tree-prof/indir-call-prof-2.C b/gcc/testsuite/g++.dg/tree-prof/indir-call-prof-2.C new file mode 100644 index 000000000000..e20cc64d3739 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-prof/indir-call-prof-2.C @@ -0,0 +1,35 @@ +/* { dg-options "-O" } */ + +int foo1(void) { return 0; } +int bar1(void) { throw 1; } +void foo2(void) { } +void bar2(void) { throw 1; } +void __attribute__((noinline,noclone)) test1(void (*f)(void)) { (*f)(); } +void __attribute__((noinline,noclone)) test2(void (*f)(void)) { (*f)(); } +int __attribute__((noinline,noclone)) test3(int (*f)(void)) { return (*f)(); } +int __attribute__((noinline,noclone)) test4(int (*f)(void)) { return (*f)(); } +int __attribute__((noinline,noclone)) test5(int (*f)(void), int x) { return x ? x : (*f)(); } +int __attribute__((noinline,noclone)) test6(int (*f)(void), int x) { return x ? x : (*f)(); } +void __attribute__((noinline,noclone)) test7(void (*f)(void)) { try { (*f)(); } catch (...) {} } +void __attribute__((noinline,noclone)) test8(void (*f)(void)) { try { (*f)(); } catch (...) {}} +int __attribute__((noinline,noclone)) test9(int (*f)(void)) { try { return (*f)(); } catch (...) {return 0;} } +int __attribute__((noinline,noclone)) test10(int (*f)(void)) { try { return (*f)(); } catch (...) {return 0;} } +int __attribute__((noinline,noclone)) test11(int (*f)(void), int x) { try { return x ? x : (*f)(); } catch (...) {return 0;} } +int __attribute__((noinline,noclone)) test12(int (*f)(void), int x) { try { return x ? x : (*f)(); } catch (...) {return 0;} } + +int main() +{ + for (int i = 0; i < 100; ++i) test1(foo2); + for (int i = 0; i < 100; ++i) try { test2(bar2); } catch (...) {} + for (int i = 0; i < 100; ++i) test3(foo1); + for (int i = 0; i < 100; ++i) try { test4(bar1); } catch (...) {} + for (int i = 0; i < 100; ++i) test5(foo1, 0); + for (int i = 0; i < 100; ++i) try { test6(bar1, 0); } catch (...) {} + for (int i = 0; i < 100; ++i) test7(foo2); + for (int i = 0; i < 100; ++i) try { test8(bar2); } catch (...) {} + for (int i = 0; i < 100; ++i) test9(foo1); + for (int i = 0; i < 100; ++i) try { test10(bar1); } catch (...) {} + for (int i = 0; i < 100; ++i) test11(foo1, 0); + for (int i = 0; i < 100; ++i) try { test12(bar1, 0); } catch (...) {} + return 0; +} diff --git a/gcc/value-prof.c b/gcc/value-prof.c index 9e27a9679fc5..6011922db0af 100644 --- a/gcc/value-prof.c +++ b/gcc/value-prof.c @@ -1146,10 +1146,15 @@ gimple_ic (gimple icall_stmt, struct cgraph_node *direct_call, icall_bb->count = all - count; /* Do not disturb existing EH edges from the indirect call. */ - if (last_stmt (icall_bb) != icall_stmt) + if (gsi_stmt (gsi_last_bb (icall_bb)) != icall_stmt) e_ij = split_block (icall_bb, icall_stmt); else - e_ij = find_fallthru_edge (icall_bb->succs); + { + e_ij = find_fallthru_edge (icall_bb->succs); + e_ij->probability = REG_BR_PROB_BASE; + e_ij->count = all - count; + e_ij = single_pred_edge (split_edge (e_ij)); + } join_bb = e_ij->dest; join_bb->count = all; -- GitLab