diff mbox

Fix PR64068 and PR64559

Message ID 54B7F782.4020405@suse.cz
State New
Headers show

Commit Message

Martin Liška Jan. 15, 2015, 5:23 p.m. UTC
Hello.

This is Honsa's patch that I've just tested on x86_64-linux-pc. The patch is preapproved by Honza
and is going to be installed.

Thanks,
Martin
diff mbox

Patch

From 84b6878f168802516febfbd00252f56f965b9666 Mon Sep 17 00:00:00 2001
From: mliska <mliska@suse.cz>
Date: Thu, 15 Jan 2015 17:20:00 +0100
Subject: [PATCH] Fix for PR64068 and PR64559.

gcc/testsuite/ChangeLog:

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

	* g++.dg/ipa/pr64068.C: New test.
	* gcc.dg/ipa/PR64559.c: New test.

gcc/ChangeLog:

2015-01-15  Jan Hubicka  <hubicka@ucw.cz>

	PR ipa/64068
	PR ipa/64559
	* ipa.c (symbol_table::remove_unreachable_nodes):
	Do not put abstract origins into boundary.
---
 gcc/ipa.c                          |  1 -
 gcc/testsuite/g++.dg/ipa/pr64068.C | 49 ++++++++++++++++++++++++++++++++++++++
 gcc/testsuite/gcc.dg/ipa/PR64559.c | 39 ++++++++++++++++++++++++++++++
 3 files changed, 88 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/ipa/pr64068.C
 create mode 100644 gcc/testsuite/gcc.dg/ipa/PR64559.c

diff --git a/gcc/ipa.c b/gcc/ipa.c
index df96515..3626417 100644
--- a/gcc/ipa.c
+++ b/gcc/ipa.c
@@ -400,7 +400,6 @@  symbol_table::remove_unreachable_nodes (FILE *file)
 		       n = n->next_sibling_clone)
 		    if (n->decl == DECL_ABSTRACT_ORIGIN (node->decl))
 		      n->used_as_abstract_origin = true;
-	          enqueue_node (origin_node, &first, &reachable);
 		}
 	    }
 	  /* If any symbol in a comdat group is reachable, force
diff --git a/gcc/testsuite/g++.dg/ipa/pr64068.C b/gcc/testsuite/g++.dg/ipa/pr64068.C
new file mode 100644
index 0000000..9528883
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ipa/pr64068.C
@@ -0,0 +1,49 @@ 
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+typedef int PROV_ENUMALGS_EX, PCCRYPT_OID_INFO;
+class A {
+  int m_fn2();
+  virtual bool m_fn1(PCCRYPT_OID_INFO);
+};
+int fn1();
+void fn2();
+int A::m_fn2() { m_fn1(0); }
+
+bool fn3() {
+  for (;;) {
+    if (fn1()) {
+      if (fn1() != 259)
+        fn2();
+      break;
+    }
+    return 1;
+  }
+  return 0;
+}
+
+class B {
+public:
+  B() { fn3(); }
+};
+class C : A {
+  bool m_fn1(PCCRYPT_OID_INFO) { m_fn3(); }
+  int isSupportedByProvider_algId;
+  PROV_ENUMALGS_EX isSupportedByProvider_outEnumAlgs;
+  PROV_ENUMALGS_EX isSupportedByProvider_enumAlgs;
+  bool m_fn3() {
+    while (1) {
+      if (fn1()) {
+        if (fn1() != 259)
+          fn2();
+        break;
+      }
+      if (isSupportedByProvider_algId)
+        isSupportedByProvider_outEnumAlgs = isSupportedByProvider_enumAlgs;
+      return 1;
+    }
+    return 0;
+  }
+};
+
+void fn4() { B(); }
diff --git a/gcc/testsuite/gcc.dg/ipa/PR64559.c b/gcc/testsuite/gcc.dg/ipa/PR64559.c
new file mode 100644
index 0000000..463afdc
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/ipa/PR64559.c
@@ -0,0 +1,39 @@ 
+/* { dg-do compile } */
+/* { dg-options "-Os"  } */
+
+int a, b, c, d;
+
+struct S
+{
+  int f0;
+};
+
+static int
+fn1 (int p)
+{
+  return p == 0 || a;
+}
+
+static int
+fn2 ()
+{
+  d = fn1 (c);
+  return 0;
+}
+
+static int
+fn3 (struct S p)
+{
+  p.f0 || fn2 ();
+  if (fn1 (1))
+    b = 0;
+  return 0;
+}
+
+int
+main ()
+{
+  struct S e = { 1 };
+  fn3 (e);
+  return 0;
+}
-- 
2.1.2