summaryrefslogtreecommitdiff
path: root/gcc/ipa-devirt.c
diff options
context:
space:
mode:
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2015-01-19 20:35:55 +0000
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2015-01-19 20:35:55 +0000
commite7d46f62f40c9b13a7fd9acdd35e98aa0bd703de (patch)
tree3b4b0631f624755107d28fb30fb863ecb1580843 /gcc/ipa-devirt.c
parentdcf572482a0bdd2b2a2d57a8efaca8840fb8049e (diff)
downloadgcc-e7d46f62f40c9b13a7fd9acdd35e98aa0bd703de.tar.gz
* ipa-devirt.c (ipa_devirt): Drop polymorphic call info in hopeless
cases. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@219858 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ipa-devirt.c')
-rw-r--r--gcc/ipa-devirt.c29
1 files changed, 26 insertions, 3 deletions
diff --git a/gcc/ipa-devirt.c b/gcc/ipa-devirt.c
index 70f2bc88bd5..aaffa3cbb2f 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 {