From 04d6d3b6d77d247616543dedad7ee239368591a5 Mon Sep 17 00:00:00 2001 From: Martin Jambor Date: Tue, 9 Aug 2016 18:05:30 +0200 Subject: [PATCH] [PR ipa/71981] Make get_dynamic_type grok MEM_REF 2016-08-09 Martin Jambor PR ipa/71981 * ipa-polymorphic-call.c (get_dynamic_type): Bail out gracefully if instance is a MEM_REF. testsuite/ PR ipa/71981 * gcc.dg/ipa/pr71981.c: New test. From-SVN: r239294 --- gcc/ChangeLog | 6 ++++++ gcc/ipa-polymorphic-call.c | 6 +++++- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/ipa/pr71981.c | 10 ++++++++++ 4 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/ipa/pr71981.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7ae805542e6..854dea5249a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-08-09 Martin Jambor + + PR ipa/71981 + * ipa-polymorphic-call.c (get_dynamic_type): Bail out gracefully + if instance is a MEM_REF. + 2016-08-09 Uros Bizjak PR target/72843 diff --git a/gcc/ipa-polymorphic-call.c b/gcc/ipa-polymorphic-call.c index 56f334471de..f7ef6aa94fd 100644 --- a/gcc/ipa-polymorphic-call.c +++ b/gcc/ipa-polymorphic-call.c @@ -1544,6 +1544,11 @@ ipa_polymorphic_call_context::get_dynamic_type (tree instance, if (!maybe_in_construction && !maybe_derived_type) return false; + /* If we are in fact not looking at any object object or the instance is + some placement new into a random load, give up straight away. */ + if (TREE_CODE (instance) == MEM_REF) + return false; + /* We need to obtain refernce to virtual table pointer. It is better to look it up in the code rather than build our own. This require bit of pattern matching, but we end up verifying that what we found is @@ -1664,7 +1669,6 @@ ipa_polymorphic_call_context::get_dynamic_type (tree instance, tci.offset = instance_offset; tci.instance = instance; tci.vtbl_ptr_ref = instance_ref; - gcc_assert (TREE_CODE (instance) != MEM_REF); tci.known_current_type = NULL_TREE; tci.known_current_offset = 0; tci.otr_type = otr_type; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5674f97b67e..34834693309 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-08-09 Martin Jambor + + PR ipa/71981 + * gcc.dg/ipa/pr71981.c: New test. + 2016-08-09 Bin Cheng PR tree-optimization/33707 diff --git a/gcc/testsuite/gcc.dg/ipa/pr71981.c b/gcc/testsuite/gcc.dg/ipa/pr71981.c new file mode 100644 index 00000000000..1b2160246e8 --- /dev/null +++ b/gcc/testsuite/gcc.dg/ipa/pr71981.c @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -w" } */ + +int **a; +static void fn1(char **p1) { + char s = *p1, b = &s; + while (*fn2()[a]) + ; +} +int main() { fn1(""); return 0; }