Hi, the following patch will be committed to google/main. The patch added multiple source file support for FDO and a couple of multi-source test cases for LIPO. It also include a couple of bug fixes related to missing assembler name binding cleanup.
regression test and SPEC with LIPO. David 2011-05-01 David Li <davi...@google.com> * testsuite/lib/profopt.exp (proc): Multiple source file support. * testsuite/gcc.dg/tree-prof/lipo/lipo.exp (load_lib): Multiple source file support. * testsuite/g++.dg/tree-prof/lipo/lipo.exp: Ditto. * testsuite/gcc.dg/tree-prof/lipo/indir-call-prof_0.c: New test. * testsuite/gcc.dg/tree-prof/lipo/indir-call-prof_1.c: New test. * testsuite/gcc.dg/tree-prof/lipo/lipo_inline1_0.c: New test. * testsuite/gcc.dg/tree-prof/lipo/lipo_inline1_1.c: New test. * testsuite/gcc.dg/tree-prof/lipo/lipo_inline1_2.c: New test. * testsuite/g++.dg/tree-prof/lipo/vcall1_0.c: New test. * testsuite/g++.dg/tree-prof/lipo/vcall1_1.c: New test. * testsuite/g++.dg/tree-prof/lipo/vcall1_2.c: New test. * testsuite/gcc.dg/tree-prof/lipo/inliner-1.c: Rename. * testsuite/gcc.dg/tree-prof/lipo/stringop-1.c: Ditto. * testsuite/gcc.dg/tree-prof/lipo/update-loopch.c: Ditto. * testsuite/gcc.dg/tree-prof/lipo/stringop-2.: Ditto. * testsuite/gcc.dg/tree-prof/lipo/ic-misattribution-1.c: Ditto. * testsuite/gcc.dg/tree-prof/lipo/update-tailcall.c: Ditto. * testsuite/gcc.dg/tree-prof/lipo/ic-misattribution-1a.c: Ditto. * testsuite/gcc.dg/tree-prof/lipo/tracer-1.c: Ditto. * testsuite/gcc.dg/tree-prof/lipo/indir-call-prof.c: Ditto. * testsuite/gcc.dg/tree-prof/lipo/val-prof-1.c: Ditto. * testsuite/gcc.dg/tree-prof/lipo/val-prof-2.c: Ditto. * testsuite/gcc.dg/tree-prof/lipo/val-prof-3.c: Ditto. * testsuite/gcc.dg/tree-prof/lipo/val-prof-4.c: Ditto. * testsuite/gcc.dg/tree-prof/lipo/val-prof-5.c: Ditto. * testsuite/gcc.dg/tree-prof/lipo/val-prof-6.c: Ditto. * testsuite/gcc.dg/tree-prof/lipo/val-prof-7.c: Ditto. * testsuite/gcc.dg/tree-prof/lipo/pr47187.c: Ditto. * testsuite/gcc.dg/tree-prof/lipo/update-cunroll-2.c: Ditto. * testsuite/gcc.dg/tree-prof/lipo/bb-reorg.c: Ditto. * testsuite/gcc.dg/tree-prof/lipo/pr34999.c: Ditto. * testsuite/gcc.dg/tree-prof/lipo/ic-misattribution-1_0.c: Ditto. * testsuite/gcc.dg/tree-prof/lipo/ic-misattribution-1_1.c: Ditto. * testsuite/gcc.dg/tree-prof/lipo/wcoverage-mismatch.c: Ditto. * testsuite/gcc.dg/tree-prof/lipo/pr45354.c: Ditto. * testsuite/g++.dg/tree-prof/lipo/inline_mismatch_args.C: Ditto. * testsuite/g++.dg/tree-prof/lipo/indir-call-prof-2.C: Ditto. * testsuite/g++.dg/tree-prof/lipo/indir-call-prof.C: Ditto. * testsuite/g++.dg/tree-prof/lipo/partition1.C: Ditto. * testsuite/g++.dg/tree-prof/lipo/partition2.C: Ditto. * testsuite/g++.dg/tree-prof/lipo/partition3.C: Ditto. * cp/cp-objcp-common.c (cmp_templ_arg): Use assembler name for decl comparison. * l-ipo.c (clear_module_scope_bindings): Clear name binding for assembler name. (pop_module_scope): Clear name bindings for the last module. (lipo_cmp_type): Handle template arg type. Index: testsuite/lib/profopt.exp =================================================================== --- testsuite/lib/profopt.exp (revision 173148) +++ testsuite/lib/profopt.exp (working copy) @@ -239,6 +239,27 @@ proc profopt-execute { src } { set executable $tmpdir/[file tail [file rootname $src].x] set basename [file tail $testcase] set base [file rootname $basename] + set dir [file dirname $src] + # multiple file test base + set mbase [file rootname $basename] + regsub "_0" $mbase "" mbase + regsub "/" $mbase "" mbase + set src_list $src + set i 1 + set done 0 + while { !$done } { + set names [glob -nocomplain -types f -- "${dir}/${mbase}_${i}.*"] + if { [llength ${names}] > 1 } { + warning "profopt-execute: more than one file matched ${dir}/${mbase}_${i}.*" + } + if { [llength ${names}] == 1 } { + lappend src_list [lindex ${names} 0] + incr i + } else { + set num_srcs ${i} + set done 1 + } + } set count 0 foreach option $prof_option_list { @@ -279,7 +300,8 @@ proc profopt-execute { src } { set options "$extra_options" lappend options "additional_flags=$option $extra_flags $profile_option" set optstr "$option $profile_option" - set comp_output [${tool}_target_compile "$src" "$execname1" executable $options] + verbose "Hey $src_list $execname1 executable $options" + set comp_output [${tool}_target_compile "$src_list" "$execname1" executable $options] if ![${tool}_check_compile "$testcase compilation" $optstr $execname1 $comp_output] { unresolved "$testcase execution, $optstr" unresolved "$testcase compilation, $option $feedback_option" @@ -294,15 +316,32 @@ proc profopt-execute { src } { set missing_file 0 # Make sure the profile data was generated, and fail if not. if { $status == "pass" } { - foreach ext $prof_ext { - remote_upload target $tmpdir/$base.$ext - set files [glob -nocomplain $base.$ext] - if { $files == "" } { - set status "fail" - set missing_file 1 - fail "$testcase execution: file $base.$ext does not exist, $option $profile_option" - } - } + set i 0 + if { $num_srcs > 1 } { + foreach s $src_list { + foreach ext $prof_ext { + remote_upload target $tmpdir/${mbase}_${i}.$ext + set files [glob -nocomplain ${mbase}_${i}.$ext] + if { $files == "" } { + set status "fail" + set missing_file 1 + fail "$testcase execution: file ${mbase}_${i}.$ext does not exist, $option $profile_option" + } + } + incr i + } + } else { + foreach ext $prof_ext { + remote_upload target $tmpdir/$base.$ext + set files [glob -nocomplain $base.$ext] + if { $files == "" } { + set status "fail" + set missing_file 1 + fail "$testcase execution: file $base.$ext does not exist, $option $profile_option" + } + } + } + } if { $missing_file == 0 } { $status "$testcase execution, $optstr" @@ -328,7 +367,7 @@ proc profopt-execute { src } { set options "$extra_options" lappend options "additional_flags=$option $extra_flags $feedback_option" set optstr "$option $feedback_option" - set comp_output [${tool}_target_compile "$src" "$execname2" "executable" $options] + set comp_output [${tool}_target_compile "$src_list" "$execname2" "executable" $options] # Prune warnings we know are unwanted. set comp_output [prune_warnings $comp_output] @@ -379,7 +418,7 @@ proc profopt-execute { src } { set options "$extra_options" lappend options "additional_flags=$option" set optstr "$option" - set comp_output [${tool}_target_compile "$src" "$execname3" "executable" $options] + set comp_output [${tool}_target_compile "$src_list" "$execname3" "executable" $options] if ![${tool}_check_compile "$testcase compilation" $optstr $execname3 $comp_output] { unresolved "$testcase execution, $optstr" unresolved "$testcase perf check, $optstr" Index: testsuite/gcc.dg/tree-prof/lipo/inliner-1.c =================================================================== --- testsuite/gcc.dg/tree-prof/lipo/inliner-1.c (revision 173148) +++ testsuite/gcc.dg/tree-prof/lipo/inliner-1.c (working copy) @@ -1,42 +0,0 @@ -/* { dg-options "-O2 -fdump-tree-optimized" } */ -int a; -int b[100]; -void abort (void); - -inline void -cold_function () -{ - int i; - for (i = 0; i < 99; i++) - if (b[i] / (b[i+1] + 1)) - abort (); -} - -inline void -hot_function () -{ - int i; - for (i = 0; i < 99; i++) - if (b[i] / (b[i+1] + 1)) - abort (); -} - -main () -{ - int i; - for (i = 0; i < 100; i++) - { - if (a) - cold_function (); - else - hot_function (); - } - return 0; -} - -/* cold function should be inlined, while hot function should not. - Look for "cold_function () [tail call];" call statement not for the - declaration or other apperances of the string in dump. */ -/* { dg-final-use { scan-tree-dump "cold_function ..;" "optimized"} } */ -/* { dg-final-use { scan-tree-dump-not "hot_function ..;" "optimized"} } */ -/* { dg-final-use { cleanup-tree-dump "optimized" } } */ Index: testsuite/gcc.dg/tree-prof/lipo/gdb_cmd =================================================================== --- testsuite/gcc.dg/tree-prof/lipo/gdb_cmd (revision 173148) +++ testsuite/gcc.dg/tree-prof/lipo/gdb_cmd (working copy) @@ -1,5 +0,0 @@ -file /usr/local/google/davidxl/dev/gcc/gcc-gmain-native_64-linux/libexec/gcc/x86_64-linux/4.6.0-google-main/cc1 -set args -quiet -v indir-call-prof.c -march=core2 -mcx16 -msahf --param l1-cache-size=32 --param l1-cache-line-size=64 --param l2-cache-size=4096 -mtune=core2 -quiet -dumpbase indir-call-prof.c -auxbase indir-call-prof -g -O2 -version -fprofile-generate -fripa -fdump-ipa-tree_profile_ipa -fdump-tree-optimized-blocks -o /tmp/ccdBoNgb.s -b main -b internal_error -b fancy_abort Index: testsuite/gcc.dg/tree-prof/lipo/indir-call-prof_0.c =================================================================== --- testsuite/gcc.dg/tree-prof/lipo/indir-call-prof_0.c (revision 0) +++ testsuite/gcc.dg/tree-prof/lipo/indir-call-prof_0.c (revision 0) @@ -0,0 +1,23 @@ +/* { dg-options "-O2 -fdump-tree-optimized -fdump-ipa-tree_profile_ipa" } */ + +extern void setp (int (**pp) (void), int i); + +int +main (void) +{ + int (*p) (void); + int i; + + for (i = 0; i < 10; i ++) + { + setp (&p, i); + p (); + } + + return 0; +} + +/* { dg-final-use { scan-ipa-dump "Indirect call -> direct call.* a1" "tree_profile_ipa"} } */ +/* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */ +/* { dg-final-use { cleanup-tree-dump "optimized" } } */ +/* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */ Index: testsuite/gcc.dg/tree-prof/lipo/indir-call-prof_1.c =================================================================== --- testsuite/gcc.dg/tree-prof/lipo/indir-call-prof_1.c (revision 0) +++ testsuite/gcc.dg/tree-prof/lipo/indir-call-prof_1.c (revision 0) @@ -0,0 +1,23 @@ +/* { dg-options "-O2 -fdump-tree-optimized -fdump-ipa-tree_profile_ipa" } */ + +int a1 (void) +{ + return 10; +} + +int a2 (void) +{ + return 0; +} + +typedef int (*tp) (void); + +tp aa [] = {a2, a1, a1, a1, a1}; + +__attribute__((noinline)) void setp (int (**pp) (void), int i) +{ + if (!i) + *pp = aa [i]; + else + *pp = aa [(i & 2) + 1]; +} Index: testsuite/gcc.dg/tree-prof/lipo/stringop-1.c =================================================================== --- testsuite/gcc.dg/tree-prof/lipo/stringop-1.c (revision 173148) +++ testsuite/gcc.dg/tree-prof/lipo/stringop-1.c (working copy) @@ -1,22 +0,0 @@ -/* { dg-options "-O2 -fdump-tree-optimized -fdump-ipa-tree_profile_ipa" } */ -int a[1000]; -int b[1000]; -int size=1; -int max=10000; -main() -{ - int i; - for (i=0;i<max; i++) - { - __builtin_memcpy (a, b, size * sizeof (a[0])); - asm(""); - } - return 0; -} -/* { dg-final-use { scan-ipa-dump "Single value 4 stringop" "tree_profile_ipa"} } */ -/* Really this ought to simplify into assignment, but we are not there yet. */ -/* a[0] = b[0] is what we fold the resulting memcpy into. */ -/* { dg-final-use { scan-tree-dump " = MEM.*&b" "optimized"} } */ -/* { dg-final-use { scan-tree-dump "MEM.*&a\\\] = " "optimized"} } */ -/* { dg-final-use { cleanup-tree-dump "optimized" } } */ -/* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */ Index: testsuite/gcc.dg/tree-prof/lipo/update-loopch.c =================================================================== --- testsuite/gcc.dg/tree-prof/lipo/update-loopch.c (revision 173148) +++ testsuite/gcc.dg/tree-prof/lipo/update-loopch.c (working copy) @@ -1,21 +0,0 @@ -/* { dg-options "-O2 -fdump-ipa-tree_profile_ipa-blocks -fdump-tree-optimized-blocks" } */ -int max = 33333; -int a[8]; -int -main () -{ - int i; - for (i = 0; i < max; i++) - { - a[i % 8]++; - } - return 0; -} -/* Loop header copying will peel away the initial conditional, so the loop body - is once reached directly from entry point of function, rest via loopback - edge. */ -/* { dg-final-use { scan-ipa-dump "count:33333" "tree_profile_ipa"} } */ -/* { dg-final-use { scan-tree-dump "count:33332" "optimized"} } */ -/* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */ -/* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */ -/* { dg-final-use { cleanup-tree-dump "optimized" } } */ Index: testsuite/gcc.dg/tree-prof/lipo/stringop-2.c =================================================================== --- testsuite/gcc.dg/tree-prof/lipo/stringop-2.c (revision 173148) +++ testsuite/gcc.dg/tree-prof/lipo/stringop-2.c (working copy) @@ -1,20 +0,0 @@ -/* { dg-options "-O2 -fdump-tree-optimized -fdump-ipa-tree_profile_ipa" } */ -int a[1000]; -int b[1000]; -int size=1; -int max=10000; -main() -{ - int i; - for (i=0;i<max; i++) - { - __builtin_memset (a, 10, size * sizeof (a[0])); - asm(""); - } - return 0; -} -/* { dg-final-use { scan-ipa-dump "Single value 4 stringop" "tree_profile_ipa"} } */ -/* The versioned memset of size 4 should be optimized to an assignment. */ -/* { dg-final-use { scan-tree-dump "a\\\[0\\\] = 168430090" "optimized"} } */ -/* { dg-final-use { cleanup-tree-dump "optimized" } } */ -/* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */ Index: testsuite/gcc.dg/tree-prof/lipo/ic-misattribution-1.c =================================================================== --- testsuite/gcc.dg/tree-prof/lipo/ic-misattribution-1.c (revision 173148) +++ testsuite/gcc.dg/tree-prof/lipo/ic-misattribution-1.c (working copy) @@ -1,19 +0,0 @@ -/* { dg-options "-O2 -fdump-ipa-tree_profile_ipa" } */ -/* { dg-additional-sources "ic-misattribution-1a.c" } */ - -extern void other_caller (void); - -void -callee (void) -{ - return; -} - -void -caller(void (*func) (void)) -{ - func (); -} - -/* { dg-final-use { scan-ipa-dump "hist->count 1 hist->all 1" "tree_profile_ipa" } } */ -/* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */ Index: testsuite/gcc.dg/tree-prof/lipo/update-tailcall.c =================================================================== --- testsuite/gcc.dg/tree-prof/lipo/update-tailcall.c (revision 173148) +++ testsuite/gcc.dg/tree-prof/lipo/update-tailcall.c (working copy) @@ -1,20 +0,0 @@ -/* { dg-options "-O2 -fdump-tree-tailc -fdump-tree-optimized" } */ -__attribute__ ((noinline)) -int factorial(int x) -{ - if (x == 1) - return 1; - else - return x*factorial(--x); -} -int gbl; -int -main() -{ - gbl = factorial(100); - return 0; -} -/* { dg-final-use { scan-tree-dump-not "Invalid sum" "tailc"} } */ -/* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */ -/* { dg-final-use { cleanup-tree-dump "tailc" } } */ -/* { dg-final-use { cleanup-tree-dump "optimized" } } */ Index: testsuite/gcc.dg/tree-prof/lipo/ic-misattribution-1a.c =================================================================== --- testsuite/gcc.dg/tree-prof/lipo/ic-misattribution-1a.c (revision 173148) +++ testsuite/gcc.dg/tree-prof/lipo/ic-misattribution-1a.c (working copy) @@ -1,22 +0,0 @@ -/* { dg-options "-DEMPTY" } */ -/* This file is only needed in combination with ic-misattribution-1.c - but there's no easy way to make this file ignored. */ -extern void callee (void); -extern void caller (void (*func) (void)); - -typedef void (*func_t) (void); -func_t func; - -int -main () -{ -#ifdef EMPTY -#else - func = callee; - caller (callee); - func (); -#endif - return 0; -} - -/* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */ Index: testsuite/gcc.dg/tree-prof/lipo/tracer-1.c =================================================================== --- testsuite/gcc.dg/tree-prof/lipo/tracer-1.c (revision 173148) +++ testsuite/gcc.dg/tree-prof/lipo/tracer-1.c (working copy) @@ -1,18 +0,0 @@ -/* { dg-options "-O2 -ftracer -fdump-tree-tracer" } */ -volatile int a, b, c; -int main () -{ - int i; - for (i = 0; i < 1000; i++) - { - if (i % 17) - a++; - else - b++; - c++; - } - return 0; -} -/* Superblock formation should produce two copies of the increment of c */ -/* { dg-final-generate { scan-tree-dump-times "c =" 2 "tracer" } } */ -/* { dg-final-use { cleanup-tree-dump "tracer" } } */ Index: testsuite/gcc.dg/tree-prof/lipo/indir-call-prof.c =================================================================== --- testsuite/gcc.dg/tree-prof/lipo/indir-call-prof.c (revision 173148) +++ testsuite/gcc.dg/tree-prof/lipo/indir-call-prof.c (working copy) @@ -1,43 +0,0 @@ -/* { dg-options "-O2 -fdump-tree-optimized -fdump-ipa-tree_profile_ipa" } */ - -static int a1 (void) -{ - return 10; -} - -static int a2 (void) -{ - return 0; -} - -typedef int (*tp) (void); - -static tp aa [] = {a2, a1, a1, a1, a1}; - -__attribute__((noinline)) void setp (int (**pp) (void), int i) -{ - if (!i) - *pp = aa [i]; - else - *pp = aa [(i & 2) + 1]; -} - -int -main (void) -{ - int (*p) (void); - int i; - - for (i = 0; i < 10; i ++) - { - setp (&p, i); - p (); - } - - return 0; -} - -/* { dg-final-use { scan-ipa-dump "Indirect call -> direct call.* a1" "tree_profile_ipa"} } */ -/* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */ -/* { dg-final-use { cleanup-tree-dump "optimized" } } */ -/* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */ Index: testsuite/gcc.dg/tree-prof/lipo/val-prof-1.c =================================================================== --- testsuite/gcc.dg/tree-prof/lipo/val-prof-1.c (revision 173148) +++ testsuite/gcc.dg/tree-prof/lipo/val-prof-1.c (working copy) @@ -1,22 +0,0 @@ -/* { dg-options "-O2 -fdump-tree-optimized -fdump-ipa-tree_profile_ipa" } */ -int a[1000]; -int b = 256; -int c = 257; -main () -{ - int i; - int n; - for (i = 0; i < 1000; i++) - { - if (i % 17) - n = c; - else n = b; - a[i] /= n; - } - return 0; -} -/* { dg-final-use { scan-ipa-dump "Div.mod by constant n_\[0-9\]*=257 transformation on insn" "tree_profile_ipa"} } */ -/* { dg-final-use { scan-tree-dump "if \\(n_\[0-9\]* != 257\\)" "optimized"} } */ -/* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */ -/* { dg-final-use { cleanup-tree-dump "optimized" } } */ -/* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */ Index: testsuite/gcc.dg/tree-prof/lipo/val-prof-2.c =================================================================== --- testsuite/gcc.dg/tree-prof/lipo/val-prof-2.c (revision 173148) +++ testsuite/gcc.dg/tree-prof/lipo/val-prof-2.c (working copy) @@ -1,32 +0,0 @@ -/* { dg-options "-O2 -fdump-tree-optimized -fdump-ipa-tree_profile_ipa" } */ -unsigned int a[1000]; -unsigned int b = 256; -unsigned int c = 1024; -unsigned int d = 17; -main () -{ - int i; - unsigned int n; - for (i = 0; i < 1000; i++) - { - a[i]=100*i; - } - for (i = 0; i < 1000; i++) - { - if (i % 2) - n = b; - else if (i % 3) - n = c; - else - n = d; - a[i] %= n; - } - return 0; -} -/* { dg-final-use { scan-ipa-dump "Mod power of 2 transformation on insn" "tree_profile_ipa" } } */ -/* This is part of code checking that n is power of 2, so we are sure that the transformation - didn't get optimized out. */ -/* { dg-final-use { scan-tree-dump "n_\[0-9\]* \\+ 0xffff" "optimized"} } */ -/* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */ -/* { dg-final-use { cleanup-tree-dump "optimized" } } */ -/* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */ Index: testsuite/gcc.dg/tree-prof/lipo/val-prof-3.c =================================================================== --- testsuite/gcc.dg/tree-prof/lipo/val-prof-3.c (revision 173148) +++ testsuite/gcc.dg/tree-prof/lipo/val-prof-3.c (working copy) @@ -1,32 +0,0 @@ -/* { dg-options "-O2 -fdump-tree-optimized -fdump-ipa-tree_profile_ipa" } */ -unsigned int a[1000]; -unsigned int b = 257; -unsigned int c = 1023; -unsigned int d = 19; -main () -{ - int i; - unsigned int n; - for (i = 0; i < 1000; i++) - { - a[i]=18; - } - for (i = 0; i < 1000; i++) - { - if (i % 2) - n = b; - else if (i % 3) - n = c; - else - n = d; - a[i] %= n; - } - return 0; -} -/* { dg-final-use { scan-ipa-dump "Mod subtract transformation on insn" "tree_profile_ipa" } } */ -/* This is part of code checking that n is greater than the divisor so we are sure that it - didn't get optimized out. */ -/* { dg-final-use { scan-tree-dump "if \\(n_\[0-9\]* \\>" "optimized"} } */ -/* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */ -/* { dg-final-use { cleanup-tree-dump "optimized" } } */ -/* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */ Index: testsuite/gcc.dg/tree-prof/lipo/val-prof-4.c =================================================================== --- testsuite/gcc.dg/tree-prof/lipo/val-prof-4.c (revision 173148) +++ testsuite/gcc.dg/tree-prof/lipo/val-prof-4.c (working copy) @@ -1,32 +0,0 @@ -/* { dg-options "-O2 -fdump-tree-optimized -fdump-ipa-tree_profile_ipa" } */ -unsigned int a[1000]; -unsigned int b = 999; -unsigned int c = 1002; -unsigned int d = 1003; -main () -{ - int i; - unsigned int n; - for (i = 0; i < 1000; i++) - { - a[i]=1000+i; - } - for (i = 0; i < 1000; i++) - { - if (i % 2) - n = b; - else if (i % 3) - n = c; - else - n = d; - a[i] %= n; - } - return 0; -} -/* { dg-final-use { scan-ipa-dump "Mod subtract transformation on insn" "tree_profile_ipa" } } */ -/* This is part of code checking that n is greater than the divisor so we are sure that it - didn't get optimized out. */ -/* { dg-final-use { scan-tree-dump "if \\(n_\[0-9\]* \\>" "optimized"} } */ -/* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */ -/* { dg-final-use { cleanup-tree-dump "optimized" } } */ -/* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */ Index: testsuite/gcc.dg/tree-prof/lipo/val-prof-5.c =================================================================== --- testsuite/gcc.dg/tree-prof/lipo/val-prof-5.c (revision 173148) +++ testsuite/gcc.dg/tree-prof/lipo/val-prof-5.c (working copy) @@ -1,17 +0,0 @@ -/* { dg-options "-O2 -fdump-tree-optimized -fdump-ipa-tree_profile_ipa" } */ -int a[1000]; -int b=997; -main() -{ - int i; - for (i = 0; i < 1000; i++) - if (a[i]) - a[i]/=b; - else - a[i]/=b; - return 0; -} -/* { dg-final-use { scan-ipa-dump "Div.mod by constant b.*=997 transformation on insn" "tree_profile_ipa" } } */ -/* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */ -/* { dg-final-use { cleanup-tree-dump "optimized" } } */ -/* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */ Index: testsuite/gcc.dg/tree-prof/lipo/val-prof-6.c =================================================================== --- testsuite/gcc.dg/tree-prof/lipo/val-prof-6.c (revision 173148) +++ testsuite/gcc.dg/tree-prof/lipo/val-prof-6.c (working copy) @@ -1,20 +0,0 @@ -/* { dg-options "-O2 -fdump-tree-optimized" } */ -char a[1000]; -char b[1000]; -int size=1000; -__attribute__ ((noinline)) -t(int size) -{ - __builtin_memcpy(a,b,size); -} -int -main() -{ - int i; - for (i=0; i < size; i++) - t(i); - return 0; -} -/* { dg-final-use { scan-tree-dump "Average value sum:499500" "optimized"} } */ -/* { dg-final-use { scan-tree-dump "IOR value" "optimized"} } */ -/* { dg-final-use { cleanup-tree-dump "optimized" } } */ Index: testsuite/gcc.dg/tree-prof/lipo/val-prof-7.c =================================================================== --- testsuite/gcc.dg/tree-prof/lipo/val-prof-7.c (revision 173148) +++ testsuite/gcc.dg/tree-prof/lipo/val-prof-7.c (working copy) @@ -1,26 +0,0 @@ -/* { dg-options "-O2 -fdump-ipa-tree_profile_ipa -mtune=core2" } */ -/* { dg-skip-if "" { ! { i?86-*-* x86_64-*-* } } { "*" } { "" } } */ - -#include <strings.h> - -int foo(int len) -{ - char array[1000]; - bzero(array, len); - return 0; -} - -int main() { - int i; - for (i = 0; i < 1000; i++) - { - if (i > 990) - foo(16); - else - foo(8); - } - return 0; -} - -/* { dg-final-use { scan-ipa-dump "Single value 8 stringop transformation on bzero" "tree_profile_ipa" } } */ -/* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */ Index: testsuite/gcc.dg/tree-prof/lipo/pr47187.c =================================================================== --- testsuite/gcc.dg/tree-prof/lipo/pr47187.c (revision 173148) +++ testsuite/gcc.dg/tree-prof/lipo/pr47187.c (working copy) @@ -1,23 +0,0 @@ -/* PR bootstrap/47187 */ -/* { dg-options "-O2" } */ - -char buf[64]; -char buf2[64]; - -void * -foo (char *p, long size) -{ - return __builtin_memcpy (buf, p, size); -} - -int -main (void) -{ - long i; - for (i = 0; i < 65536; i++) - if (foo ("abcdefghijkl", 12) != buf) - __builtin_abort (); - if (foo (buf2, 64) != buf) - __builtin_abort (); - return 0; -} Index: testsuite/gcc.dg/tree-prof/lipo/update-cunroll-2.c =================================================================== --- testsuite/gcc.dg/tree-prof/lipo/update-cunroll-2.c (revision 173148) +++ testsuite/gcc.dg/tree-prof/lipo/update-cunroll-2.c (working copy) @@ -1,21 +0,0 @@ - -/* { dg-options "-O2 -fdump-tree-optimized-blocks" } */ -int a[8]; -__attribute__ ((noinline)) -int t() -{ - int i; - for (i = 0; i < 3; i++) - if (a[i]) - break; - return i; -} -main () -{ - int i; - for (i = 0; i < 1000; i++) - t (); - return 0; -} -/* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */ -/* { dg-final-use { cleanup-tree-dump "optimized" } } */ Index: testsuite/gcc.dg/tree-prof/lipo/bb-reorg.c =================================================================== --- testsuite/gcc.dg/tree-prof/lipo/bb-reorg.c (revision 173148) +++ testsuite/gcc.dg/tree-prof/lipo/bb-reorg.c (working copy) @@ -1,39 +0,0 @@ -/* { dg-require-effective-target freorder } */ -/* { dg-options "-O2 -freorder-blocks-and-partition" } */ - -#include <string.h> - -#define SIZE 1000 -int t0 = 0; -const char *t2[SIZE]; -char buf[SIZE]; - -void -foo (void) -{ - char *s = buf; - t0 = 1; - - for (;;) - { - if (*s == '\0') - break; - else - { - t2[t0] = s; - t0++; - } - *s++ = '\0'; - } - t2[t0] = NULL; -} - - -int -main () -{ - strcpy (buf, "hello"); - foo (); - return 0; -} - Index: testsuite/gcc.dg/tree-prof/lipo/lipo_inline1_0.c =================================================================== --- testsuite/gcc.dg/tree-prof/lipo/lipo_inline1_0.c (revision 0) +++ testsuite/gcc.dg/tree-prof/lipo/lipo_inline1_0.c (revision 0) @@ -0,0 +1,29 @@ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +extern int foo (void); +extern int goo (void); + + +int bar (void) +{ + return 2; +} + +int g; +int main () +{ + int s = 0, i; + + for (i = 0; i < 1000; i ++) + { + s += foo(); /* Should be inlined */ + s += goo(); /* Should be inlined */ + } + + g = s; + return 0; +} + +/* { dg-final-use { scan-tree-dump-not "foo" "optimized"} } */ +/* { dg-final-use { scan-tree-dump-not "goo" "optimized"} } */ +/* { dg-final-use { cleanup-tree-dump "optimized" } } */ Index: testsuite/gcc.dg/tree-prof/lipo/lipo_inline1_1.c =================================================================== --- testsuite/gcc.dg/tree-prof/lipo/lipo_inline1_1.c (revision 0) +++ testsuite/gcc.dg/tree-prof/lipo/lipo_inline1_1.c (revision 0) @@ -0,0 +1,22 @@ +extern int bar(void); +extern int blah(void); +int foo (void) +{ + int i, s = 0; + + for (i = 0; i < 2; i++) + { + s += bar(); /* Inlined */ + s += blah(); /* Inlined */ + } + return s; +} + +int goo (void) +{ + return 10; +} + +/* { dg-final-use { scan-tree-dump-not "bar" "optimized"} } */ +/* { dg-final-use { scan-tree-dump-not "blah" "optimized"} } */ +/* { dg-final-use { cleanup-tree-dump "optimized" } } */ Index: testsuite/gcc.dg/tree-prof/lipo/pr34999.c =================================================================== --- testsuite/gcc.dg/tree-prof/lipo/pr34999.c (revision 173148) +++ testsuite/gcc.dg/tree-prof/lipo/pr34999.c (working copy) @@ -1,45 +0,0 @@ -/* Same test as built-in-setjmp.c. Includes the case where - the source block of a crossing fallthru edge ends with a call. */ -/* { dg-require-effective-target freorder } */ -/* { dg-options "-O2 -freorder-blocks-and-partition" } */ - -extern int strcmp(const char *, const char *); -extern char *strcpy(char *, const char *); -extern void abort(void); -extern void exit(int); - -void *buf[20]; - -void __attribute__((noinline)) -sub2 (void) -{ - __builtin_longjmp (buf, 1); -} - -int -main () -{ - char *p = (char *) __builtin_alloca (20); - - strcpy (p, "test"); - - if (__builtin_setjmp (buf)) - { - if (strcmp (p, "test") != 0) - abort (); - - exit (0); - } - - { - int *q = (int *) __builtin_alloca (p[2] * sizeof (int)); - int i; - - for (i = 0; i < p[2]; i++) - q[i] = 0; - - while (1) - sub2 (); - } -} - Index: testsuite/gcc.dg/tree-prof/lipo/lipo_inline1_2.c =================================================================== --- testsuite/gcc.dg/tree-prof/lipo/lipo_inline1_2.c (revision 0) +++ testsuite/gcc.dg/tree-prof/lipo/lipo_inline1_2.c (revision 0) @@ -0,0 +1,6 @@ +int blah (void) +{ + return 2; +} + +/* { dg-final-use { cleanup-tree-dump "optimized" } } */ Index: testsuite/gcc.dg/tree-prof/lipo/lipo.exp =================================================================== --- testsuite/gcc.dg/tree-prof/lipo/lipo.exp (revision 173148) +++ testsuite/gcc.dg/tree-prof/lipo/lipo.exp (working copy) @@ -45,7 +45,7 @@ load_lib profopt.exp set profile_option "-fprofile-generate -fripa -D_PROFILE_GENERATE" set feedback_option "-fprofile-use -fripa -D_PROFILE_USE" -foreach src [lsort [glob -nocomplain $srcdir/$subdir/*.c]] { +foreach src [lsort [glob -nocomplain $srcdir/$subdir/*_0.c]] { # If we're only testing specific files and this isn't one of them, skip it. if ![runtest_file_p $runtests $src] then { continue Index: testsuite/gcc.dg/tree-prof/lipo/ic-misattribution-1_0.c =================================================================== --- testsuite/gcc.dg/tree-prof/lipo/ic-misattribution-1_0.c (revision 173148) +++ testsuite/gcc.dg/tree-prof/lipo/ic-misattribution-1_0.c (working copy) @@ -1,19 +1,19 @@ /* { dg-options "-O2 -fdump-ipa-tree_profile_ipa" } */ -/* { dg-additional-sources "ic-misattribution-1a.c" } */ -extern void other_caller (void); +extern void callee (void); +extern void caller (void (*func) (void)); -void -callee (void) -{ - return; -} +typedef void (*func_t) (void); +func_t func; -void -caller(void (*func) (void)) +int +main () { + func = callee; + caller (callee); func (); + return 0; } -/* { dg-final-use { scan-ipa-dump "hist->count 1 hist->all 1" "tree_profile_ipa" } } */ +/* { dg-final-use { scan-ipa-dump-times "Indirect call -> direct call" 2 "tree_profile_ipa" } } */ /* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */ Index: testsuite/gcc.dg/tree-prof/lipo/ic-misattribution-1_1.c =================================================================== --- testsuite/gcc.dg/tree-prof/lipo/ic-misattribution-1_1.c (revision 173148) +++ testsuite/gcc.dg/tree-prof/lipo/ic-misattribution-1_1.c (working copy) @@ -1,22 +1,18 @@ -/* { dg-options "-DEMPTY" } */ -/* This file is only needed in combination with ic-misattribution-1.c - but there's no easy way to make this file ignored. */ -extern void callee (void); -extern void caller (void (*func) (void)); +/* { dg-options "-O2 -fdump-ipa-tree_profile_ipa" } */ -typedef void (*func_t) (void); -func_t func; +extern void other_caller (void); -int -main () +void +callee (void) +{ + return; +} + +void +caller(void (*func) (void)) { -#ifdef EMPTY -#else - func = callee; - caller (callee); func (); -#endif - return 0; } +/* { dg-final-use { scan-ipa-dump "Indiret call -> direct call" "tree_profile_ipa" } } */ /* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */ Index: testsuite/gcc.dg/tree-prof/lipo/wcoverage-mismatch.c =================================================================== --- testsuite/gcc.dg/tree-prof/lipo/wcoverage-mismatch.c (revision 173148) +++ testsuite/gcc.dg/tree-prof/lipo/wcoverage-mismatch.c (working copy) @@ -1,20 +0,0 @@ -/* { dg-options "-O2 -Wno-coverage-mismatch" } */ - -int __attribute__((noinline)) bar (void) -{ -} - -int foo (int i) -{ -#ifdef _PROFILE_USE - if (i) - bar (); -#endif - return 0; -} - -int main(int argc, char **argv) -{ - foo (argc); - return 0; -} Index: testsuite/gcc.dg/tree-prof/lipo/pr45354.c =================================================================== --- testsuite/gcc.dg/tree-prof/lipo/pr45354.c (revision 173148) +++ testsuite/gcc.dg/tree-prof/lipo/pr45354.c (working copy) @@ -1,43 +0,0 @@ -/* { dg-require-effective-target freorder } */ -/* { dg-options "-O -freorder-blocks-and-partition -fschedule-insns -fselective-scheduling" { target powerpc*-*-* ia64-*-* x86_64-*-* } } */ - -extern void abort (void); - -int ifelse_val2; - -int __attribute__((noinline)) -test_ifelse2 (int i) -{ - int result = 0; - if (!i) /* count(6) */ - result = 1; /* count(1) */ - if (i == 1) /* count(6) */ - result = 1024; - if (i == 2) /* count(6) */ - result = 2; /* count(3) */ - if (i == 3) /* count(6) */ - return 8; /* count(2) */ - if (i == 4) /* count(4) */ - return 2048; - return result; /* count(4) */ -} - -void __attribute__((noinline)) -call_ifelse () -{ - ifelse_val2 += test_ifelse2 (0); - ifelse_val2 += test_ifelse2 (2); - ifelse_val2 += test_ifelse2 (2); - ifelse_val2 += test_ifelse2 (2); - ifelse_val2 += test_ifelse2 (3); - ifelse_val2 += test_ifelse2 (3); -} - -int -main() -{ - call_ifelse (); - if (ifelse_val2 != 23) - abort (); - return 0; -} Index: testsuite/g++.dg/tree-prof/lipo/vcall1_0.C =================================================================== --- testsuite/g++.dg/tree-prof/lipo/vcall1_0.C (revision 0) +++ testsuite/g++.dg/tree-prof/lipo/vcall1_0.C (revision 0) @@ -0,0 +1,41 @@ +/* { dg-options "-O2 -fdump-tree-optimized -fdump-ipa-tree_profile_ipa" } */ +#include <stdio.h> +struct A { + A () {} + virtual int AA (void) { return 0; } +}; + +extern A* getB (void); +extern A* getC (void); + +int g; + +int +main (void) +{ + A* p; + int i; + int s = 0; + + p = getB(); + for (i = 0; i < 100; i++) + { + s += p->AA(); + } + + for (i = 0; i < 100; i++) + { + if (i%10 == 0) + p = getB(); + else + p = getC(); + + s += p->AA(); + } + printf ("result = %d\n",s); +} + +/* { dg-final-use { scan-ipa-dump-times "Indirect call -> direct call" 2 "tree_profile_ipa" } } */ +/* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized" } } */ +/* { dg-final-use { cleanup-tree-dump "optimized" } } */ +/* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */ Index: testsuite/g++.dg/tree-prof/lipo/vcall1_1.C =================================================================== --- testsuite/g++.dg/tree-prof/lipo/vcall1_1.C (revision 0) +++ testsuite/g++.dg/tree-prof/lipo/vcall1_1.C (revision 0) @@ -0,0 +1,23 @@ +/* { dg-options "-O2 -fdump-tree-optimized -fdump-ipa-tree_profile_ipa" } */ + +struct A { + A () {} + + virtual int AA (void) + { return 0; } + +}; + +struct B : public A { + B () {} + + virtual int AA (void) + { return 1; } +}; + +B b; + +A* getB (void) +{ + return &b; +} Index: testsuite/g++.dg/tree-prof/lipo/vcall1_2.C =================================================================== --- testsuite/g++.dg/tree-prof/lipo/vcall1_2.C (revision 0) +++ testsuite/g++.dg/tree-prof/lipo/vcall1_2.C (revision 0) @@ -0,0 +1,31 @@ +/* { dg-options "-O2 -fdump-tree-optimized -fdump-ipa-tree_profile_ipa" } */ + +struct A { + A () {} + + virtual int AA (void) + { return 0; } + +}; + +struct B : public A { + B () {} + + virtual int AA (void) + { return 1; } +}; + +struct C : public B { + C () {} + + virtual int AA (void) + { return 2; } + +}; + +C c; + +A* getC(void) +{ + return &c; +} Index: testsuite/g++.dg/tree-prof/lipo/lipo.exp =================================================================== --- testsuite/g++.dg/tree-prof/lipo/lipo.exp (revision 173148) +++ testsuite/g++.dg/tree-prof/lipo/lipo.exp (working copy) @@ -45,7 +45,7 @@ load_lib profopt.exp set profile_option "-fprofile-generate -fripa" set feedback_option "-fprofile-use -fripa" -foreach src [lsort [glob -nocomplain $srcdir/$subdir/*.C]] { +foreach src [lsort [glob -nocomplain $srcdir/$subdir/*_0.C]] { # If we're only testing specific files and this isn't one of them, skip it. if ![runtest_file_p $runtests $src] then { continue Index: testsuite/g++.dg/tree-prof/lipo/inline_mismatch_args.C =================================================================== --- testsuite/g++.dg/tree-prof/lipo/inline_mismatch_args.C (revision 173148) +++ testsuite/g++.dg/tree-prof/lipo/inline_mismatch_args.C (working copy) @@ -1,36 +0,0 @@ -/* { dg-options "-O2 -fdump-tree-einline" } */ -class DocId { - public: - DocId() { } - DocId(const DocId &other) { } -}; - -int g; -class Base { - public: - virtual void Foo(DocId id) { g++; } -}; - -class Super: public Base { - public: - void Foo(DocId id) { } - void Bar(Base *base, DocId id) __attribute__((noinline)); -}; - -void Super::Bar(Base *base, DocId id) { - Super::Foo(id); // direct call is inlined - base->Foo(id); // indirect call is marked do not inline -} - -int main(void) -{ - Base bah; - Super baz; - DocId gid; - - baz.Bar(&baz, gid); - return 0; -} -/* { dg-final-use { scan-tree-dump "Inlining .*Super::Foo" "einline" } } */ -/* { dg-final-use { scan-tree-dump-not "mismatched arguments" "einline" } } */ -/* { dg-final-use { cleanup-tree-dump "einline" } } */ Index: testsuite/g++.dg/tree-prof/lipo/indir-call-prof-2.C =================================================================== --- testsuite/g++.dg/tree-prof/lipo/indir-call-prof-2.C (revision 173148) +++ testsuite/g++.dg/tree-prof/lipo/indir-call-prof-2.C (working copy) @@ -1,35 +0,0 @@ -/* { 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; -} Index: testsuite/g++.dg/tree-prof/lipo/indir-call-prof.C =================================================================== --- testsuite/g++.dg/tree-prof/lipo/indir-call-prof.C (revision 173148) +++ testsuite/g++.dg/tree-prof/lipo/indir-call-prof.C (working copy) @@ -1,39 +0,0 @@ -/* { dg-options "-O2 -fdump-tree-optimized -fdump-ipa-tree_profile_ipa" } */ - -struct A { - A () {} - - virtual int AA (void) - { return 0; } - -}; - -struct B : public A { - B () {} - - virtual int AA (void) - { return 1; } -}; - -void * __attribute__((noinline,noclone)) wrap (void *p) { return p; } -int -main (void) -{ - A a; - B b; - - A* p; - - p = (A *)wrap ((void *)&a); - p->AA (); - - p = (B *)wrap ((void *)&b); - p->AA (); - - return 0; -} - -/* { dg-final-use { scan-ipa-dump "Indirect call -> direct call.* AA " "tree_profile_ipa" } } */ -/* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized" } } */ -/* { dg-final-use { cleanup-tree-dump "optimized" } } */ -/* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */ Index: testsuite/g++.dg/tree-prof/lipo/partition1.C =================================================================== --- testsuite/g++.dg/tree-prof/lipo/partition1.C (revision 173148) +++ testsuite/g++.dg/tree-prof/lipo/partition1.C (working copy) @@ -1,54 +0,0 @@ -/* { dg-require-effective-target freorder } */ -/* { dg-options "-O2 -freorder-blocks-and-partition" } */ -/* { dg-skip-if "PR target/47683" { mips-sgi-irix* } } */ - -struct A { A () __attribute__((noinline)); ~A () __attribute__((noinline)); }; -A::A () { asm volatile ("" : : : "memory"); } -A::~A () { asm volatile ("" : : : "memory"); } - -int bar () __attribute__((noinline)); -void foo () __attribute__((noinline)); - -volatile int k, l; - -int bar (int i) -{ - void *p = __builtin_alloca (i); - asm volatile ("" : : "r" (i), "r" (p) : "memory"); - if (k) throw 6; - return ++l; -} - -void foo () -{ - A a; - try { - A b; - int i = bar (5); - try { throw 6; } catch (int) {} - if (__builtin_expect (i < 4500, 0)) { - bar (7); - try { bar (8); } catch (long) {} - bar (10); - if (__builtin_expect (i < 0, 0)) { - try { bar (12); } catch (...) {} - bar (16); - bar (122); - } else { - try { bar (bar (7)); } catch (int) {} - } - } else { - try { bar (bar (bar (9))); } catch (...) {} - bar (5); - } - } catch (...) { - } -} - -int -main () -{ - int i; - for (i = 0; i < 10000; i++) - foo (); -} Index: testsuite/g++.dg/tree-prof/lipo/partition2.C =================================================================== --- testsuite/g++.dg/tree-prof/lipo/partition2.C (revision 173148) +++ testsuite/g++.dg/tree-prof/lipo/partition2.C (working copy) @@ -1,16 +0,0 @@ -// PR middle-end/45458 -// { dg-require-effective-target freorder } -// { dg-options "-fnon-call-exceptions -freorder-blocks-and-partition" } -// { dg-skip-if "PR target/47683" { mips-sgi-irix* } } - -int -main () -{ - try - { - throw 6; - } - catch (...) - { - } -} Index: testsuite/g++.dg/tree-prof/lipo/partition3.C =================================================================== --- testsuite/g++.dg/tree-prof/lipo/partition3.C (revision 173148) +++ testsuite/g++.dg/tree-prof/lipo/partition3.C (working copy) @@ -1,18 +0,0 @@ -// PR middle-end/45566 -// { dg-require-effective-target freorder } -// { dg-options "-O -fnon-call-exceptions -freorder-blocks-and-partition" } - -int k; - -int -main () -{ - try - { - if (k) - throw 6; - } - catch (...) - { - } -} Index: cp/cp-objcp-common.c =================================================================== --- cp/cp-objcp-common.c (revision 173148) +++ cp/cp-objcp-common.c (working copy) @@ -349,8 +349,17 @@ cmp_templ_arg (tree ta1, tree ta2) if (TREE_CODE (td1) != TREE_CODE (td2)) return 0; if (TREE_CODE (td1) == FUNCTION_DECL) - return (cgraph_lipo_get_resolved_node (td1) - == cgraph_lipo_get_resolved_node (td2)); + { + tree id1, id2; + + if (!TREE_PUBLIC (td1) || !TREE_PUBLIC (td2)) + return td1 == td2; + + id1 = DECL_ASSEMBLER_NAME (td1); + id2 = DECL_ASSEMBLER_NAME (td2); + return !strcmp (IDENTIFIER_POINTER (id1), + IDENTIFIER_POINTER (id2)); + } else { gcc_assert (TREE_CODE (td1) == VAR_DECL); Index: l-ipo.c =================================================================== --- l-ipo.c (revision 173148) +++ l-ipo.c (working copy) @@ -281,8 +281,18 @@ clear_module_scope_bindings (struct save for (i = 0; VEC_iterate (tree, module_scope->module_decls, i, decl); ++i) - lang_hooks.l_ipo.clear_global_name_bindings ( + { + lang_hooks.l_ipo.clear_global_name_bindings ( get_type_or_decl_name (decl)); + /* Now force creating assembly name. */ + if (VAR_OR_FUNCTION_DECL_P (decl)) + { + tree assembler_name; + + assembler_name = DECL_ASSEMBLER_NAME (decl); + lang_hooks.l_ipo.clear_global_name_bindings (assembler_name); + } + } } /* The referenced attribute of a decl is not associated with the @@ -416,7 +426,10 @@ pop_module_scope (void) /* cp_clear_conv_type_map (); */ } else if (num_in_fnames > 1) - restore_post_parsing_states (); + { + clear_module_scope_bindings (current_module_scope); + restore_post_parsing_states (); + } else gcc_assert (L_IPO_IS_PRIMARY_MODULE && num_in_fnames == 1); } @@ -691,6 +704,8 @@ lipo_cmp_type (tree t1, tree t2) case VOID_TYPE: case BOOLEAN_TYPE: return 1; + case TEMPLATE_TYPE_PARM: + return 1; default: gcc_unreachable (); } -- This patch is available for review at http://codereview.appspot.com/4441084