diff options
author | Jan Hubicka <hubicka@ucw.cz> | 2015-01-19 21:35:55 +0100 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2015-01-19 20:35:55 +0000 |
commit | 68c9467f3ee877d6aefc9fe9fa4f1af44ed34192 (patch) | |
tree | 3b4b0631f624755107d28fb30fb863ecb1580843 /gcc/ipa-devirt.c | |
parent | 6ce54d0f336b3907dafcc9a3046ef56fd7913847 (diff) | |
download | gcc-68c9467f3ee877d6aefc9fe9fa4f1af44ed34192.zip gcc-68c9467f3ee877d6aefc9fe9fa4f1af44ed34192.tar.gz gcc-68c9467f3ee877d6aefc9fe9fa4f1af44ed34192.tar.bz2 |
ipa-devirt.c (ipa_devirt): Drop polymorphic call info in hopeless cases.
* ipa-devirt.c (ipa_devirt): Drop polymorphic call info in hopeless
cases.
From-SVN: r219858
Diffstat (limited to 'gcc/ipa-devirt.c')
-rw-r--r-- | gcc/ipa-devirt.c | 29 |
1 files changed, 26 insertions, 3 deletions
diff --git a/gcc/ipa-devirt.c b/gcc/ipa-devirt.c index 70f2bc8..aaffa3c 100644 --- a/gcc/ipa-devirt.c +++ b/gcc/ipa-devirt.c @@ -2815,6 +2815,7 @@ ipa_devirt (void) int npolymorphic = 0, nspeculated = 0, nconverted = 0, ncold = 0; int nmultiple = 0, noverwritable = 0, ndevirtualized = 0, nnotdefined = 0; int nwrong = 0, nok = 0, nexternal = 0, nartificial = 0; + int ndropped = 0; if (!odr_types_ptr) return 0; @@ -2865,6 +2866,28 @@ ipa_devirt (void) npolymorphic++; + /* See if the call can be devirtualized by means of ipa-prop's + polymorphic call context propagation. If not, we can just + forget about this call being polymorphic and avoid some heavy + lifting in remove_unreachable_nodes that will otherwise try to + keep all possible targets alive until inlining and in the inliner + itself. + + This may need to be revisited once we add further ways to use + the may edges, but it is a resonable thing to do right now. */ + + if ((e->indirect_info->param_index == -1 + || (!opt_for_fn (n->decl, flag_devirtualize_speculatively) + && e->indirect_info->vptr_changed)) + && !flag_ltrans_devirtualize) + { + e->indirect_info->polymorphic = false; + ndropped++; + if (dump_file) + fprintf (dump_file, "Dropping polymorphic call info;" + " it can not be used by ipa-prop\n"); + } + if (!opt_for_fn (n->decl, flag_devirtualize_speculatively)) continue; @@ -3094,11 +3117,11 @@ ipa_devirt (void) " %i speculatively devirtualized, %i cold\n" "%i have multiple targets, %i overwritable," " %i already speculated (%i agree, %i disagree)," - " %i external, %i not defined, %i artificial\n", + " %i external, %i not defined, %i artificial, %i infos dropped\n", npolymorphic, ndevirtualized, nconverted, ncold, nmultiple, noverwritable, nspeculated, nok, nwrong, - nexternal, nnotdefined, nartificial); - return ndevirtualized ? TODO_remove_functions : 0; + nexternal, nnotdefined, nartificial, ndropped); + return ndevirtualized || ndropped ? TODO_remove_functions : 0; } namespace { |