[PR ipa/71981] Make get_dynamic_type grok MEM_REF
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. From-SVN: r239294
This commit is contained in:
parent
045f240b97
commit
04d6d3b6d7
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
10
gcc/testsuite/gcc.dg/ipa/pr71981.c
Normal file
10
gcc/testsuite/gcc.dg/ipa/pr71981.c
Normal file
@ -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; }
|
Loading…
Reference in New Issue
Block a user