diff options
author | Martin Jambor <mjambor@suse.cz> | 2011-01-15 00:19:08 +0100 |
---|---|---|
committer | Martin Jambor <jamborm@gcc.gnu.org> | 2011-01-15 00:19:08 +0100 |
commit | 05842ff57c6eb899ffb7bfd6624634f5aa4df878 (patch) | |
tree | 59421812ee885d513e8c87c7fb099f042a10672d | |
parent | f65cf2b706151e0310518eef48bab95cf8155c3c (diff) | |
download | gcc-05842ff57c6eb899ffb7bfd6624634f5aa4df878.zip gcc-05842ff57c6eb899ffb7bfd6624634f5aa4df878.tar.gz gcc-05842ff57c6eb899ffb7bfd6624634f5aa4df878.tar.bz2 |
common.opt (fdevirtualize): New flag.
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
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/common.opt | 4 | ||||
-rw-r--r-- | gcc/doc/invoke.texi | 13 | ||||
-rw-r--r-- | gcc/ipa-prop.c | 11 | ||||
-rw-r--r-- | gcc/opts.c | 1 |
5 files changed, 35 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d4d7dc4..f9e9b35 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/common.opt b/gcc/common.opt index 32df6fc..7c93c83 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -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 diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 0a1625f..c7187f2 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -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. diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c index fd67221..1970881 100644 --- a/gcc/ipa-prop.c +++ b/gcc/ipa-prop.c @@ -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 @@ -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 }, |