diff options
author | Martin Jambor <mjambor@suse.cz> | 2013-04-19 14:00:27 +0200 |
---|---|---|
committer | Martin Jambor <jamborm@gcc.gnu.org> | 2013-04-19 14:00:27 +0200 |
commit | e248d83f4ba23139d1c24aac2d9b2caf9c67c206 (patch) | |
tree | 48a1cde54c03eeceeb5712488b900a74b29947ac /gcc/tree-ssa-pre.c | |
parent | 4891e8f8cdeb34ad392a8cf374ce9b8ee54a177f (diff) | |
download | gcc-e248d83f4ba23139d1c24aac2d9b2caf9c67c206.zip gcc-e248d83f4ba23139d1c24aac2d9b2caf9c67c206.tar.gz gcc-e248d83f4ba23139d1c24aac2d9b2caf9c67c206.tar.bz2 |
re PR tree-optimization/56718 (Early inlining prevents type based devirtualization)
2013-04-19 Martin Jambor <mjambor@suse.cz>
PR tree-optimization/56718
* ipa-cp.c (ipa_value_from_known_type_jfunc): Moved...
* ipa-prop.c (ipa_binfo_from_known_type_jfunc): ...here, renamed
and made public. Adjusted all callers.
(ipa_intraprocedural_devirtualization): New function.
* ipa-prop.h (ipa_binfo_from_known_type_jfunc): Declare.
(ipa_intraprocedural_devirtualization): Likewise.
* Makefile.in (tree-ssa-pre.o): Add ipa-prop.h to dependencies.
testsuite/
* g++.dg/ipa/imm-devirt-1.C: New test.
* g++.dg/ipa/imm-devirt-2.C: Likewise.
From-SVN: r198088
Diffstat (limited to 'gcc/tree-ssa-pre.c')
-rw-r--r-- | gcc/tree-ssa-pre.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c index 798409a..345ebcc 100644 --- a/gcc/tree-ssa-pre.c +++ b/gcc/tree-ssa-pre.c @@ -43,6 +43,7 @@ along with GCC; see the file COPYING3. If not see #include "params.h" #include "dbgcnt.h" #include "domwalk.h" +#include "ipa-prop.h" /* TODO: @@ -4326,7 +4327,15 @@ eliminate_bb (dom_walk_data *, basic_block b) fn = VN_INFO (orig_fn)->valnum; else if (TREE_CODE (orig_fn) == OBJ_TYPE_REF && TREE_CODE (OBJ_TYPE_REF_EXPR (orig_fn)) == SSA_NAME) - fn = VN_INFO (OBJ_TYPE_REF_EXPR (orig_fn))->valnum; + { + fn = VN_INFO (OBJ_TYPE_REF_EXPR (orig_fn))->valnum; + if (!gimple_call_addr_fndecl (fn)) + { + fn = ipa_intraprocedural_devirtualization (stmt); + if (fn) + fn = build_fold_addr_expr (fn); + } + } else continue; if (gimple_call_addr_fndecl (fn) != NULL_TREE |