From: Martin Liska Date: Mon, 12 Jan 2015 10:39:25 +0000 (+0100) Subject: re PR ipa/64550 (IPA fixes cause ICE in tree-ssa.c:939) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=365536ca8d8af9d8b25a41217626df5794049676;p=gcc.git re PR ipa/64550 (IPA fixes cause ICE in tree-ssa.c:939) Fix for PR64550. PR ipa/64550 * ipa-icf-gimple.c (func_checker::compare_memory_operand): Compare volatility for correct operands. * gcc.dg/ipa/PR64550.c: New test. From-SVN: r219457 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3205cec4a95..a2486a9ee74 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2015-01-12 Martin Liska + + PR ipa/64550 + * ipa-icf-gimple.c (func_checker::compare_memory_operand): Compare + volatility for correct operands. + +2015-01-12 Martin Liska + + * ipa-icf.c (sem_function::equals_wpa): Add indirect_calls as indication + that a function is not leaf. + (sem_function::compare_polymorphic_p): Likewise. + 2015-01-12 Martin Liska * ipa-icf.c (sem_function::equals_wpa): Add indirect_calls as indication diff --git a/gcc/ipa-icf-gimple.c b/gcc/ipa-icf-gimple.c index 8c3a27babc3..ed3cdf56ccb 100644 --- a/gcc/ipa-icf-gimple.c +++ b/gcc/ipa-icf-gimple.c @@ -267,7 +267,7 @@ func_checker::compare_memory_operand (tree t1, tree t2) /* Compare alias sets for memory operands. */ if (source_is_memop && target_is_memop) { - if (TREE_THIS_VOLATILE (b1) != TREE_THIS_VOLATILE (b2)) + if (TREE_THIS_VOLATILE (t1) != TREE_THIS_VOLATILE (t2)) return return_false_with_msg ("different operand volatility"); if (ao_ref_alias_set (&r1) != ao_ref_alias_set (&r2) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 937826612e7..7e3489baae0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2015-01-12 Martin Liska + + * gcc.dg/ipa/PR64550.c: New test. + 2015-01-12 Jan Hubicka PR ipa/63470 diff --git a/gcc/testsuite/gcc.dg/ipa/PR64550.c b/gcc/testsuite/gcc.dg/ipa/PR64550.c new file mode 100644 index 00000000000..3b439c9568a --- /dev/null +++ b/gcc/testsuite/gcc.dg/ipa/PR64550.c @@ -0,0 +1,76 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-ipa-icf-details" } */ + +struct __hlist_head +{ + struct __hlist_node *first; +}; + +struct __hlist_node +{ + struct __hlist_node *next, **pprev; +}; + +struct __net +{ + int ifindex; + struct __hlist_head * dev_index_head; +}; + +struct __net_device +{ + int ifindex; + struct __net *nd_net; + struct __hlist_node index_hlist; +}; + +__attribute__ ((noinline, noclone)) +static struct __hlist_head * __dev_index_hash(struct __net *net, + int ifindex) +{ + return &net->dev_index_head[ifindex & 1]; +} + +__attribute__ ((noinline, noclone)) +struct __net_device * __dev_get_by_index(struct __net *net, int ifindex) +{ + struct __net_device * dev; + struct __hlist_head * head = __dev_index_hash(net, ifindex); + + for (dev = ( { typeof((head)->first) ____ptr = ((head)->first); ____ptr ? ( { const typeof(((typeof(*(dev)) *) 0)->index_hlist) * __mptr = (____ptr); (typeof(*(dev)) *) ((char *)__mptr - __builtin_offsetof(typeof(*(dev)), index_hlist));}): ((void *) 0);}); + dev; dev = ( { typeof ((dev)->index_hlist.next) ____ptr = ((dev)->index_hlist.next); ____ptr ? ( { const typeof(((typeof(*(dev)) *) 0)->index_hlist) * __mptr = (____ptr); (typeof(*(dev)) *) ((char *)__mptr - __builtin_offsetof(typeof(*(dev)), index_hlist));}): ((void *) 0);})) + if (dev->ifindex == ifindex) + return dev; + + return ((void *)0); +} + +__attribute__ ((noinline, noclone)) +struct __net_device * dev_get_by_index_rcu(struct __net *net, int ifindex) +{ + struct __net_device * dev; + struct __hlist_head * head = __dev_index_hash(net, ifindex); + + for (dev = ( { typeof(( { typeof (* ((*((struct __hlist_node **)(&(head)->first))))) * _________p1 = (typeof(*((*((struct __hlist_node **)(&(head)->first))))) *) (*(volatile typeof(((*((struct __hlist_node **)(&(head)->first))))) *)&(((*((struct __hlist_node **)(&(head)->first)))))); do { } while (0);; do { } while (0); ((typeof(*((*((struct __hlist_node **)(&(head)->first))))) *) (_________p1));})) ____ptr = (( { typeof (* ((*((struct __hlist_node **)(&(head)->first))))) * _________p1 = (typeof(*((*((struct __hlist_node **)(&(head)->first))))) *) (*(volatile typeof(((*((struct __hlist_node **)(&(head)->first))))) *)&(((*((struct __hlist_node **)(&(head)->first)))))); do { } while (0);; do { } while (0); ((typeof(*((*((struct __hlist_node **)(&(head)->first))))) *) (_________p1));})); ____ptr ? ( { const typeof(((typeof(*(dev)) *) 0)->index_hlist) * __mptr = (____ptr); (typeof(*(dev)) *) ((char *)__mptr - __builtin_offsetof(typeof(*(dev)), index_hlist));}):((void *) 0);}); + dev; dev = ( { typeof(( { typeof (* ((*((struct __hlist_node **)(&(&(dev)->index_hlist)->next))))) * _________p1 = (typeof(*((*((struct __hlist_node **)(&(&(dev)->index_hlist)->next))))) *) (*(volatile typeof(((*((struct __hlist_node **)(&(&(dev)->index_hlist)->next))))) *)&(((*((struct __hlist_node **)(&(&(dev)->index_hlist)->next)))))); do { } while (0);; do { } while (0); ((typeof(*((*((struct __hlist_node **)(&(&(dev)->index_hlist)->next))))) *) (_________p1));})) ____ptr = (( { typeof (* ((*((struct __hlist_node **)(&(&(dev)->index_hlist)->next))))) * _________p1 = (typeof(*((*((struct __hlist_node **)(&(&(dev)->index_hlist)->next))))) *) (*(volatile typeof(((*((struct __hlist_node **)(&(&(dev)->index_hlist)->next))))) *)&(((*((struct __hlist_node **)(&(&(dev)->index_hlist)->next)))))); do { } while (0);; do { } while (0); ((typeof(*((*((struct __hlist_node **)(&(&(dev)->index_hlist)->next))))) *) (_________p1));})); ____ptr ? ( { const typeof(((typeof(*(dev)) *) 0)->index_hlist) * __mptr = (____ptr); (typeof(*(dev)) *) ((char *)__mptr - __builtin_offsetof(typeof(*(dev)), index_hlist));}): ((void *) 0);})) + if (dev->ifindex == ifindex) + return dev; + return ((void *)0); +} + +__attribute__ ((noinline, noclone)) +int foo(struct __net *net) +{ + if (!__dev_get_by_index(net, net->ifindex)); + return 1; + return 0; +} + +int main() +{ + return 0; +} + +/* { dg-final { scan-ipa-dump "different operand volatility" "icf" } } */ +/* { dg-final { scan-ipa-dump "Equal symbols: 0" "icf" } } */ +/* { dg-final { cleanup-ipa-dump "icf" } } */