This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH]: Fix for PR ipa/64550


Hello.

Following patch is fix for PR ipa/64550 which can bootstrap on x86_64-linux-pc.
Explanation for the patch is described here: [1].

I hope this is correct fix for such cases?

Thanks,
Martin

[1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64550
From bef79e6e5e0d7d8e555e9241ffcfb88a92552e12 Mon Sep 17 00:00:00 2001
From: mliska <mliska@suse.cz>
Date: Mon, 12 Jan 2015 10:54:36 +0100
Subject: [PATCH] Fix for PR64550.

gcc/ChangeLog:

2015-01-12  Martin Liska  <mliska@suse.cz>

	* ipa-icf-gimple.c (func_checker::compare_memory_operand): Compare
	volatility for correct operands.

gcc/testsuite/ChangeLog:

2015-01-12  Martin Liska  <mliska@suse.cz>

	* gcc.dg/ipa/PR64550.c: New test.
---
 gcc/ipa-icf-gimple.c               |  2 +-
 gcc/testsuite/gcc.dg/ipa/PR64550.c | 76 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 77 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.dg/ipa/PR64550.c

diff --git a/gcc/ipa-icf-gimple.c b/gcc/ipa-icf-gimple.c
index 8c3a27b..ed3cdf5 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/gcc.dg/ipa/PR64550.c b/gcc/testsuite/gcc.dg/ipa/PR64550.c
new file mode 100644
index 0000000..3b439c9
--- /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" } } */
-- 
2.1.2


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]