common.opt (fdevirtualize): New flag.
authorMartin Jambor <mjambor@suse.cz>
Fri, 14 Jan 2011 23:19:08 +0000 (00:19 +0100)
committerMartin Jambor <jamborm@gcc.gnu.org>
Fri, 14 Jan 2011 23:19:08 +0000 (00:19 +0100)
2011-01-15  Martin Jambor  <mjambor@suse.cz>

* common.opt (fdevirtualize): New flag.
* doc/invoke.texi (Option Summary): Document it.
* opts.c (default_options_table): Add devirtualize flag.
* ipa-prop.c (detect_type_change): Return immediately if
devirtualize flag is not set.
(detect_type_change_ssa): Likewise.
(compute_known_type_jump_func): Likewise.
(ipa_analyze_virtual_call_uses): Likewise.

From-SVN: r168826

gcc/ChangeLog
gcc/common.opt
gcc/doc/invoke.texi
gcc/ipa-prop.c
gcc/opts.c

index d4d7dc4d5abdf12e64758c28e40d471f9f892225..f9e9b359aeceda6ca95a04002d8d90c8dd5e5d62 100644 (file)
@@ -1,3 +1,14 @@
+2011-01-15  Martin Jambor  <mjambor@suse.cz>
+
+       * common.opt (fdevirtualize): New flag.
+       * doc/invoke.texi (Option Summary): Document it.
+       * opts.c (default_options_table): Add devirtualize flag.
+       * ipa-prop.c (detect_type_change): Return immediately if
+       devirtualize flag is not set.
+       (detect_type_change_ssa): Likewise.
+       (compute_known_type_jump_func): Likewise.
+       (ipa_analyze_virtual_call_uses): Likewise.
+
 2011-01-14  Martin Jambor  <mjambor@suse.cz>
 
        PR tree-optimization/45934
index 32df6fc470354564d394059c9a4739b4d2e7a6da..7c93c8339accefb27c37db2e2c81f431d915f651 100644 (file)
@@ -911,6 +911,10 @@ fdelete-null-pointer-checks
 Common Report Var(flag_delete_null_pointer_checks) Init(1) Optimization
 Delete useless null pointer checks
 
+fdevirtualize
+Common Report Var(flag_devirtualize) Optimization
+Try to convert virtual calls to direct ones.
+
 fdiagnostics-show-location=
 Common Joined RejectNegative Enum(diagnostic_prefixing_rule)
 -fdiagnostics-show-location=[once|every-line]  How often to emit source location at the beginning of line-wrapped diagnostics
index 0a1625f241acef31020a93a32bdb2811219c0bfb..c7187f2c42dbefa38234a1d6526edda24c77e574 100644 (file)
@@ -340,8 +340,8 @@ Objective-C and Objective-C++ Dialects}.
 -fcprop-registers -fcrossjumping @gol
 -fcse-follow-jumps -fcse-skip-blocks -fcx-fortran-rules @gol
 -fcx-limited-range @gol
--fdata-sections -fdce -fdce @gol
--fdelayed-branch -fdelete-null-pointer-checks -fdse -fdse @gol
+-fdata-sections -fdce -fdce -fdelayed-branch @gol
+-fdelete-null-pointer-checks -fdse -fdevirtualize -fdse @gol
 -fearly-inlining -fipa-sra -fexpensive-optimizations -ffast-math @gol
 -ffinite-math-only -ffloat-store -fexcess-precision=@var{style} @gol
 -fforward-propagate -ffp-contract=@var{style} -ffunction-sections @gol
@@ -5918,6 +5918,7 @@ also turns on the following optimization flags:
 -fcrossjumping @gol
 -fcse-follow-jumps  -fcse-skip-blocks @gol
 -fdelete-null-pointer-checks @gol
+-fdevirtualize @gol
 -fexpensive-optimizations @gol
 -fgcse  -fgcse-lm  @gol
 -finline-small-functions @gol
@@ -6421,6 +6422,14 @@ Otherwise it is enabled at all levels: @option{-O0}, @option{-O1},
 @option{-O2}, @option{-O3}, @option{-Os}.  Passes that use the information
 are enabled independently at different optimization levels.
 
+@item -fdevirtualize
+@opindex fdevirtualize
+Attempt to convert calls to virtual functions to direct calls.  This
+is done both within a procedure and interprocedurally as part of
+indirect inlining (@code{-findirect-inlining}) and interprocedural constant
+propagation (@option{-fipa-cp}).
+Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}.
+
 @item -fexpensive-optimizations
 @opindex fexpensive-optimizations
 Perform a number of minor optimizations that are relatively expensive.
index fd672218b4b56741f0342ea8ebd34306ea54a12e..1970881c6865e2a3db891cc59fcbe2ec778ed8b8 100644 (file)
@@ -456,7 +456,7 @@ detect_type_change (tree arg, tree base, gimple call,
                       || handled_component_p (arg));
   /* Const calls cannot call virtual methods through VMT and so type changes do
      not matter.  */
-  if (!gimple_vuse (call))
+  if (!flag_devirtualize || !gimple_vuse (call))
     return false;
 
   tci.type_maybe_changed = false;
@@ -486,7 +486,8 @@ static bool
 detect_type_change_ssa (tree arg, gimple call, struct ipa_jump_func *jfunc)
 {
   gcc_checking_assert (TREE_CODE (arg) == SSA_NAME);
-  if (!POINTER_TYPE_P (TREE_TYPE (arg))
+  if (!flag_devirtualize
+      || !POINTER_TYPE_P (TREE_TYPE (arg))
       || TREE_CODE (TREE_TYPE (TREE_TYPE (arg))) != RECORD_TYPE)
     return false;
 
@@ -689,7 +690,8 @@ compute_known_type_jump_func (tree op, struct ipa_jump_func *jfunc,
   HOST_WIDE_INT offset, size, max_size;
   tree base, binfo;
 
-  if (TREE_CODE (op) != ADDR_EXPR
+  if (!flag_devirtualize
+      || TREE_CODE (op) != ADDR_EXPR
       || TREE_CODE (TREE_TYPE (TREE_TYPE (op))) != RECORD_TYPE)
     return;
 
@@ -1378,6 +1380,9 @@ ipa_analyze_virtual_call_uses (struct cgraph_node *node,
   tree var;
   int index;
 
+  if (!flag_devirtualize)
+    return;
+
   if (TREE_CODE (obj) == ADDR_EXPR)
     {
       do
index ee39500cbce8d5659f02c656322197da8ec1bd2e..67fb6dac2da3251cf5ef3c5ce9b346ee38c8c009 100644 (file)
@@ -485,6 +485,7 @@ static const struct default_options default_options_table[] =
     { OPT_LEVELS_2_PLUS, OPT_ftree_pre, NULL, 1 },
     { OPT_LEVELS_2_PLUS, OPT_ftree_switch_conversion, NULL, 1 },
     { OPT_LEVELS_2_PLUS, OPT_fipa_cp, NULL, 1 },
+    { OPT_LEVELS_2_PLUS, OPT_fdevirtualize, NULL, 1 },
     { OPT_LEVELS_2_PLUS, OPT_fipa_sra, NULL, 1 },
     { OPT_LEVELS_2_PLUS, OPT_falign_loops, NULL, 1 },
     { OPT_LEVELS_2_PLUS, OPT_falign_jumps, NULL, 1 },