aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-pre.c
diff options
context:
space:
mode:
authorMartin Jambor <mjambor@suse.cz>2013-04-19 14:00:27 +0200
committerMartin Jambor <jamborm@gcc.gnu.org>2013-04-19 14:00:27 +0200
commite248d83f4ba23139d1c24aac2d9b2caf9c67c206 (patch)
tree48a1cde54c03eeceeb5712488b900a74b29947ac /gcc/tree-ssa-pre.c
parent4891e8f8cdeb34ad392a8cf374ce9b8ee54a177f (diff)
downloadgcc-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.c11
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