+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
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
-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
-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
@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.
|| 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;
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;
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;
tree var;
int index;
+ if (!flag_devirtualize)
+ return;
+
if (TREE_CODE (obj) == ADDR_EXPR)
{
do
{ 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 },