]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[PR ipa/71981] Make get_dynamic_type grok MEM_REF
authorjamborm <jamborm@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 9 Aug 2016 16:05:30 +0000 (16:05 +0000)
committerjamborm <jamborm@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 9 Aug 2016 16:05:30 +0000 (16:05 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@239294 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/ipa-polymorphic-call.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/ipa/pr71981.c [new file with mode: 0644]

index 7ae805542e6d2e864185d5216bbbce7e99d73277..854dea5249abc727592cee117a28f2641d99f0c1 100644 (file)
@@ -1,3 +1,9 @@
+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.
+
 2016-08-09  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/72843
index 56f334471de498f7f0407eb3b27cb03f9e2b1ad5..f7ef6aa94fdb49597b318f1823027f148c8d8ac0 100644 (file)
@@ -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;
index 5674f97b67edd221a589e86b6d1380d04f134324..34834693309a09e40a00b7884e0f2fb290e6b5e1 100644 (file)
@@ -1,3 +1,8 @@
+2016-08-09  Martin Jambor  <mjambor@suse.cz>
+
+        PR ipa/71981
+        * gcc.dg/ipa/pr71981.c: New test.
+
 2016-08-09  Bin Cheng  <bin.cheng@arm.com>
 
        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 (file)
index 0000000..1b21602
--- /dev/null
@@ -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; }