summaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-pre.c
diff options
context:
space:
mode:
authorjamborm <jamborm@138bc75d-0d04-0410-961f-82ee72b054a4>2013-04-19 12:00:27 +0000
committerjamborm <jamborm@138bc75d-0d04-0410-961f-82ee72b054a4>2013-04-19 12:00:27 +0000
commitbee52153273af07da6c5f997a5820e36c19bf7c5 (patch)
tree48a1cde54c03eeceeb5712488b900a74b29947ac /gcc/tree-ssa-pre.c
parent204c295fbca80918852ecdf06faa1451218fcded (diff)
downloadgcc-bee52153273af07da6c5f997a5820e36c19bf7c5.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@198088 138bc75d-0d04-0410-961f-82ee72b054a4
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 798409afa82..345ebcceaad 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