This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PR ipa/71981] Make get_dynamic_type grok MEM_REF
- From: Martin Jambor <mjambor at suse dot cz>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Tue, 9 Aug 2016 18:16:59 +0200
- Subject: [PR ipa/71981] Make get_dynamic_type grok MEM_REF
- Authentication-results: sourceware.org; auth=none
Hi,
in the PR ipa_polymorphic_call_context::get_dynamic_type hits an assert
when it tries to figure out dynamic type changes in sequence:
_3 = MEM[(char * *)""];
fn1.isra.0 (_3);
and gets the MEM_REF as its instance parameter. This patch makes it
bail out early instead.
Pre-approved by Honza on IRC, I have committed it to the trunk and the
gcc-6-branch after bootstrapping and testing it on both.
Thanks,
Martin
2016-08-09 Martin Jambor <mjambor@suse.cz>
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.
diff --git a/gcc/ipa-polymorphic-call.c b/gcc/ipa-polymorphic-call.c
index 56f3344..f7ef6aa 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/gcc.dg/ipa/pr71981.c b/gcc/testsuite/gcc.dg/ipa/pr71981.c
new file mode 100644
index 0000000..1b21602
--- /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; }