aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/g++.dg/ipa
diff options
context:
space:
mode:
Diffstat (limited to 'gcc-4.9/gcc/testsuite/g++.dg/ipa')
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-1.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-10.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-11.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-12.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-13.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-14.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-15.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-16.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-17.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-18.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-19.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-2.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-20.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-21.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-22.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-23.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-24.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-25.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-26.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-27.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-28.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-28a.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-29.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-3.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-30.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-31.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-39.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-4.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-40.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-5.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-6.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-7.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-9.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-1.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-2.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-3.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-4.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-5.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-6.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-7.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-8.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-d-1.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-g-1.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/imm-devirt-1.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/imm-devirt-2.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-1.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-2.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-3.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-4.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-5.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-7.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-8.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-9.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/pr60600.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/pr60640-4.C2
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/pr61654.C40
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/pr62015.C55
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/pr63306.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/pr63838.C56
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/pr64068.C49
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/ipa/type-inheritance-1.C2
61 files changed, 305 insertions, 56 deletions
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-1.C
index de0f665c4..710a99c6f 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-1.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-1.C
@@ -1,6 +1,6 @@
/* Verify that simple virtual calls are converted to direct calls by ipa-cp. */
/* { dg-do run } */
-/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized" } */
+/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized -fdevirtualize" } */
extern "C" void abort (void);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-10.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-10.C
index 658442e34..b58e1e036 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-10.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-10.C
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O3 -fdump-ipa-inline -fdump-ipa-cp -fno-early-inlining" } */
+/* { dg-options "-O3 -fdump-ipa-inline -fdump-ipa-cp -fno-early-inlining -fdevirtualize" } */
class wxPaintEvent { };
struct wxDCBase
{
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-11.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-11.C
index e31832b87..dae47f700 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-11.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-11.C
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -fdump-ipa-inline --param=early-inlining-insns-comdat=0 -fno-devirtualize-speculatively" } */
+/* { dg-options "-O2 -fdump-ipa-inline --param=early-inlining-insns-comdat=0 -fno-devirtualize-speculatively -fdevirtualize" } */
int baz ();
struct A
{
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-12.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-12.C
index 16bae4d8d..4d713714c 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-12.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-12.C
@@ -1,5 +1,5 @@
// { dg-do compile { target c++11 } }
-// { dg-options "-O -fdump-ipa-inline" }
+// { dg-options "-O -fdump-ipa-inline -fdevirtualize" }
class Foo
{
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-13.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-13.C
index b338a4c34..4b2ff069b 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-13.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-13.C
@@ -1,6 +1,6 @@
/* { dg-do run } */
/* Call to foo should be devirtualized because there are no derived types of A. */
-/* { dg-options "-O2 -fdump-tree-ssa" } */
+/* { dg-options "-O2 -fdump-tree-ssa -fdevirtualize" } */
namespace {
class A {
public:
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-14.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-14.C
index 456d44f84..517173065 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-14.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-14.C
@@ -2,7 +2,7 @@
because the constructor of A is unreachable and therefore the virtual
method table referring to A::foo is optimized out. */
/* { dg-do run } */
-/* { dg-options "-O2 -fdump-tree-ssa" } */
+/* { dg-options "-O2 -fdump-tree-ssa -fdevirtualize" } */
class B {
public:
virtual int foo(void)
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-15.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-15.C
index 2ea85f487..2c041b5a2 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-15.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-15.C
@@ -1,7 +1,7 @@
/* Check that we speculatively devirutalize call to FOO to B::foo becuase
A is noreturn. */
/* { dg-do compile } */
-/* { dg-options "-O2 -fdump-ipa-devirt -fdump-tree-optimized" } */
+/* { dg-options "-O2 -fdump-ipa-devirt -fdump-tree-optimized -fdevirtualize" } */
class A {
public:
virtual int foo(void)
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-16.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-16.C
index 85567867f..d0ac06134 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-16.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-16.C
@@ -1,7 +1,7 @@
/* We shall devirtualize to unreachable. No anonymous type method should surivve
reachability. */
/* { dg-do compile } */
-/* { dg-options "-O2 -fdump-ipa-whole-program" } */
+/* { dg-options "-O2 -fdump-ipa-whole-program -fdevirtualize" } */
namespace {
class B {
public:
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-17.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-17.C
index 9edfd73af..56e4294ab 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-17.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-17.C
@@ -1,7 +1,7 @@
/* We shall devirtualize to B::foo since it is the only live candidate of an
anonymous type. */
/* { dg-do compile } */
-/* { dg-options "-O2 -fdump-ipa-whole-program" } */
+/* { dg-options "-O2 -fdump-ipa-whole-program -fdevirtualize" } */
namespace {
class B {
public:
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-18.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-18.C
index dbbe597c9..6729d7c42 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-18.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-18.C
@@ -1,7 +1,7 @@
/* We shall devirtualize to unreachable. No anonymous type method should surivve
reachability. */
/* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-ssa" } */
+/* { dg-options "-O2 -fdump-tree-ssa -fdevirtualize" } */
namespace {
class B {
public:
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-19.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-19.C
index 13686e3e0..8fb82a288 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-19.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-19.C
@@ -2,7 +2,7 @@
Previously we were failing by considering CLOBBER statement to be
a type change. */
/* { dg-do compile } */
-/* { dg-options "-O2 -fdump-ipa-cp" } */
+/* { dg-options "-O2 -fdump-ipa-cp -fdevirtualize" } */
struct A {
void operator==(const A &);
};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-2.C
index d3181e4c0..95eba9c60 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-2.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-2.C
@@ -1,7 +1,7 @@
/* Verify that simple virtual calls using this pointer are converted
to direct calls by ipa-cp. */
/* { dg-do run } */
-/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp" } */
+/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdevirtualize" } */
extern "C" void abort (void);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-20.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-20.C
index 0ea245baf..85e064b99 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-20.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-20.C
@@ -1,6 +1,6 @@
#include <stdlib.h>
/* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-release_ssa" } */
+/* { dg-options "-O2 -fdump-tree-release_ssa -fdevirtualize" } */
namespace {
struct A
{ int a; virtual int foo() {return a;} void bar() {a=7;} };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-21.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-21.C
index 675bd08d7..7791cb94f 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-21.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-21.C
@@ -1,5 +1,5 @@
/* { dg-do run } */
-/* { dg-options "-O3 -fno-early-inlining -fno-ipa-sra -fdump-ipa-cp" } */
+/* { dg-options "-O3 -fno-early-inlining -fno-ipa-sra -fdump-ipa-cp -fdevirtualize" } */
/* Main purpose is to verify that we do not produce wrong devirtualization to
C::m_fn1. We currently devirtualize to B::m_fn1, so check that. */
#include <stdlib.h>
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-22.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-22.C
index 37e766945..194d60004 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-22.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-22.C
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O3 -fno-early-inlining -fno-ipa-sra -fdump-ipa-cp" } */
+/* { dg-options "-O3 -fno-early-inlining -fno-ipa-sra -fdump-ipa-cp -fdevirtualize" } */
class A {};
class B {
public:
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-23.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-23.C
index 98d86aee8..52e3c9cef 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-23.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-23.C
@@ -1,5 +1,5 @@
/* { dg-do run } */
-/* { dg-options "-O3 -fno-partial-inlining -fdump-ipa-cp -fno-devirtualize-speculatively" } */
+/* { dg-options "-O3 -fno-partial-inlining -fdump-ipa-cp -fno-devirtualize-speculatively -fdevirtualize" } */
/* Main purpose is to verify that we do not produce wrong devirtualization to
C::m_fn1. We currently devirtualize to B::m_fn1, so check that. */
#include <stdlib.h>
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-24.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-24.C
index 01bfdc2ec..4bba9b0c9 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-24.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-24.C
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O3 -fno-ipa-sra -fdump-ipa-inline -fdump-ipa-cp" } */
+/* { dg-options "-O3 -fno-ipa-sra -fdump-ipa-inline -fdump-ipa-cp --param=early-inlining-insns-comdat=0 -fdevirtualize" } */
void pad(void);
class A {};
class B {
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-25.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-25.C
index 1da44f5d1..fed7a96ef 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-25.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-25.C
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O3 -fdump-ipa-cp" } */
+/* { dg-options "-O3 -fdump-ipa-cp -fdevirtualize" } */
class ert_RefCounter {
protected:
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-26.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-26.C
index 2df429c34..f8b33e288 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-26.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-26.C
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O3 -fdump-ipa-devirt" } */
+/* { dg-options "-O3 -fdump-ipa-devirt -fdevirtualize" } */
struct A
{
int a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-27.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-27.C
index 749f40af1..eb064990b 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-27.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-27.C
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O3 -fdump-tree-optimized" } */
+/* { dg-options "-O3 -fdump-tree-optimized -fdevirtualize" } */
struct A
{
int a;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-28.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-28.C
index e18b81897..9bfef924d 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-28.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-28.C
@@ -1,5 +1,5 @@
// PR c++/58678
-// { dg-options "-O3 -fdump-ipa-devirt" }
+// { dg-options "-O3 -fdump-ipa-devirt -fdevirtualize" }
struct A {
virtual ~A();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-28a.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-28a.C
new file mode 100644
index 000000000..65d5fcdf3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-28a.C
@@ -0,0 +1,15 @@
+// PR c++/58678
+// { dg-options "-O3 -flto -shared -fPIC -Wl,--no-undefined" }
+// { dg-do link { target { { gld && fpic } && shared } } }
+
+struct A {
+ virtual ~A();
+};
+struct B : A {
+ virtual int m_fn1();
+};
+void fn1(B* b) {
+ delete b;
+}
+
+int main() {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-29.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-29.C
index b4f24a104..ebfd01b60 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-29.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-29.C
@@ -1,7 +1,7 @@
/* { dg-do run { target c++11 } } */
/* There is a devirtualizable call. In PR60306 we deduced wrong target to cxa_pure_virtual.
For gcc 4.10 we temporarily disable the devirtualization. */
-/* { dg-options "-O3" } */
+/* { dg-options "-O3 -fdevirtualize" } */
#include <vector>
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-3.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-3.C
index a68eb024f..45ad33756 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-3.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-3.C
@@ -1,7 +1,7 @@
/* Verify that simple virtual calls on an object refrence are
converted to simple calls by ipa-cp. */
/* { dg-do run } */
-/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized" } */
+/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized -fdevirtualize" } */
extern "C" void abort (void);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-30.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-30.C
index c4ac6940a..b147476f7 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-30.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-30.C
@@ -1,5 +1,5 @@
// PR c++/58678
-// { dg-options "-O3 -fdump-ipa-devirt" }
+// { dg-options "-O3 -fdump-ipa-devirt -fdevirtualize" }
// We shouldn't speculatively devirtualize to ~B because B is an abstract
// class; any actual object passed to f will be of some derived class which
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-31.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-31.C
index 64c44ba1e..16c782025 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-31.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-31.C
@@ -1,4 +1,4 @@
-/* { dg-options "-O2 -std=c++11 -fdump-ipa-inline" } */
+/* { dg-options "-O2 -std=c++11 -fdump-ipa-inline -fdevirtualize" } */
#include <new>
class EmbeddedObject {
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-39.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-39.C
index fbeea126e..38e280899 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-39.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-39.C
@@ -1,5 +1,5 @@
// PR c++/61214
-/* { dg-options "-O2 -fdump-tree-optimized" } */
+/* { dg-options "-O2 -fdump-tree-optimized -fdevirtualize" } */
struct Base
{
@@ -24,5 +24,4 @@ int main()
return 0;
}
-/* { dg-final { scan-tree-dump-not "OBJ_TYPE_REF" "optimized" } } */
-/* { dg-final { cleanup-tree-dump "optimized" } } */
+/* { dg-final { scan-assembler-not "_ZN3Foo5cloneEv" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-4.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-4.C
index 72c883b3f..64f8eb05d 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-4.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-4.C
@@ -1,7 +1,7 @@
/* Verify that ipa-co can convert virtual calls to direct ones even
when a typecast to an ancestor is involved along the way. */
/* { dg-do run } */
-/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized" } */
+/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized -fdevirtualize" } */
extern "C" void abort (void);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-40.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-40.C
new file mode 100644
index 000000000..9c3bdf5e9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-40.C
@@ -0,0 +1,21 @@
+// PR c++/62224
+// { dg-options "-O2" }
+// For 4.9, we don't want to devirtualize f and thus create a reference to g.
+
+struct A
+{
+ virtual void f () = 0;
+};
+
+class B : A
+{
+ virtual void f () { g(); }
+ void g();
+};
+
+void h (A *a)
+{
+ a->f ();
+}
+
+// { dg-final { scan-assembler-not "_ZN1B1gEv" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-5.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-5.C
index 575bc0271..980b59617 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-5.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-5.C
@@ -2,7 +2,7 @@
ones even when a typecast to an ancestor is involved along the way
and that ancestor is not the first one with virtual functions. */
/* { dg-do run } */
-/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized" } */
+/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized -fdevirtualize" } */
extern "C" void abort (void);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-6.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-6.C
index e9a5d7093..4599878d1 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-6.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-6.C
@@ -2,7 +2,7 @@
spot that foo changes the dynamic type of the passed object. */
/* { dg-do run } */
-/* { dg-options "-O3" } */
+/* { dg-options "-O3 -fdevirtualize" } */
extern "C" void abort (void);
extern "C" void *malloc(__SIZE_TYPE__);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-7.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-7.C
index 1c5912230..d2059baf6 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-7.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-7.C
@@ -1,7 +1,7 @@
/* Verify that IPA-CP can do devirtualization even if the virtual call
comes from a method that has been early-inlined into a descendant. */
/* { dg-do run } */
-/* { dg-options "-O3 -fdump-ipa-cp" } */
+/* { dg-options "-O3 -fdump-ipa-cp -fdevirtualize" } */
extern "C" void abort (void);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-9.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-9.C
index dc6c6c940..ce4febd9f 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-9.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-9.C
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -fdump-ipa-whole-program --param=early-inlining-insns-comdat=0" } */
+/* { dg-options "-O2 -fdump-ipa-whole-program --param=early-inlining-insns-comdat=0 -fdevirtualize" } */
double foo ();
struct B
{
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-1.C
index dcd804659..5e1348baa 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-1.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-1.C
@@ -1,7 +1,7 @@
/* Verify that ipa-cp correctly detects the dynamic type of an object
under construction when doing devirtualization. */
/* { dg-do run } */
-/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized" } */
+/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized -fdevirtualize" } */
extern "C" void abort (void);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-2.C
index b9a36e29f..451b2293e 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-2.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-2.C
@@ -1,7 +1,7 @@
/* Verify that ipa-cp correctly detects the dynamic type of an object
under construction when doing devirtualization. */
/* { dg-do run } */
-/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized" } */
+/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized -fdevirtualize" } */
extern "C" void abort (void);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-3.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-3.C
index c8791f79e..321eea478 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-3.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-3.C
@@ -1,7 +1,7 @@
/* Verify that ipa-cp correctly detects the dynamic type of an object
under construction when doing devirtualization. */
/* { dg-do run } */
-/* { dg-options "-O3 -fno-inline" } */
+/* { dg-options "-O3 -fno-inline -fdevirtualize" } */
extern "C" void abort (void);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-4.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-4.C
index 56d41e496..24dfe3dab 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-4.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-4.C
@@ -1,7 +1,7 @@
/* Verify that ipa-cp correctly detects the dynamic type of an object
under construction when doing devirtualization. */
/* { dg-do run } */
-/* { dg-options "-O3 -fno-inline" } */
+/* { dg-options "-O3 -fno-inline -fdevirtualize" } */
extern "C" void abort (void);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-5.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-5.C
index 637d7d4be..f3d6b0014 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-5.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-5.C
@@ -1,7 +1,7 @@
/* Verify that ipa-cp correctly detects the dynamic type of an object
under construction when doing devirtualization. */
/* { dg-do run } */
-/* { dg-options "-O3 -fno-early-inlining -fno-inline" } */
+/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdevirtualize" } */
extern "C" void abort (void);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-6.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-6.C
index f9b8b6954..8e5a2bf47 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-6.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-6.C
@@ -1,7 +1,7 @@
/* Verify that ipa-cp correctly detects the dynamic type of an object
under construction when doing devirtualization. */
/* { dg-do run } */
-/* { dg-options "-O3 -fno-inline" } */
+/* { dg-options "-O3 -fno-inline -fdevirtualize" } */
extern "C" void abort (void);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-7.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-7.C
index 2e76cbe40..08f2d3043 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-7.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-7.C
@@ -2,7 +2,7 @@
object within another one when looking for dynamic type change . */
/* { dg-do run } */
/* { dg-require-effective-target nonpic } */
-/* { dg-options "-O3 -Wno-attributes" } */
+/* { dg-options "-O3 -Wno-attributes -fdevirtualize" } */
extern "C" void abort (void);
namespace std {
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-8.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-8.C
index 309644d92..2e417ec2c 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-8.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-8.C
@@ -1,7 +1,7 @@
/* Verify that ipa-cp correctly detects the dynamic type of an object
under construction when doing devirtualization. */
/* { dg-do run } */
-/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized" } */
+/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized -fdevirtualize" } */
extern "C" void abort (void);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-d-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-d-1.C
index 3897a7782..d84dd9fe0 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-d-1.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-d-1.C
@@ -1,7 +1,7 @@
/* Verify that ipa-cp correctly detects the dynamic type of an object
under destruction when doing devirtualization. */
/* { dg-do run } */
-/* { dg-options "-O3 -fno-early-inlining -fno-inline" } */
+/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdevirtualize" } */
extern "C" void abort (void);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-g-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-g-1.C
index 175f24efb..41f23453c 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-g-1.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-g-1.C
@@ -1,5 +1,5 @@
// { dg-do compile }
-// { dg-options "-O2 -fdump-ipa-cp -fdump-tree-optimized" }
+// { dg-options "-O2 -fdump-ipa-cp -fdump-tree-optimized -fdevirtualize" }
struct S { S(); virtual void xyzzy(); void otherstuff(); };
struct R { int a; S s; R(); };
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/imm-devirt-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/imm-devirt-1.C
index 32f7258a4..f530adad2 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/imm-devirt-1.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/imm-devirt-1.C
@@ -1,7 +1,7 @@
/* Verify that virtual calls are folded even early inlining puts them into one
function with the definition. */
/* { dg-do run } */
-/* { dg-options "-O2 -fdump-tree-fre1-details" } */
+/* { dg-options "-O2 -fdump-tree-fre1-details -fdevirtualize" } */
extern "C" void abort (void);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/imm-devirt-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/imm-devirt-2.C
index 5bddc2fcb..bce0e96ed 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/imm-devirt-2.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/imm-devirt-2.C
@@ -1,7 +1,7 @@
/* Verify that virtual calls are folded even early inlining puts them into one
function with the definition. */
/* { dg-do run } */
-/* { dg-options "-O2 -fdump-tree-fre1-details" } */
+/* { dg-options "-O2 -fdump-tree-fre1-details -fdevirtualize" } */
extern "C" void abort (void);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-1.C
index bc4dfea5c..39dbf59f0 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-1.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-1.C
@@ -1,7 +1,7 @@
/* Verify that simple virtual calls are inlined even without early
inlining. */
/* { dg-do run { target nonpic } } */
-/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp" } */
+/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp -fdevirtualize" } */
extern "C" void abort (void);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-2.C
index 001cff204..0607ffbbe 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-2.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-2.C
@@ -1,7 +1,7 @@
/* Verify that simple virtual calls using this pointer are inlined
even without early inlining.. */
/* { dg-do run { target nonpic } } */
-/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp" } */
+/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp -fdevirtualize" } */
extern "C" void abort (void);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-3.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-3.C
index 637a6aecc..5b6322ed1 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-3.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-3.C
@@ -1,7 +1,7 @@
/* Verify that simple virtual calls on an object refrence are inlined
even without early inlining. */
/* { dg-do run { target nonpic } } */
-/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp" } */
+/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp -fdevirtualize" } */
extern "C" void abort (void);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-4.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-4.C
index f5b8f8e5d..5358ebfde 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-4.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-4.C
@@ -2,7 +2,7 @@
inlining, even when a typecast to an ancestor is involved along the
way. */
/* { dg-do run { target nonpic } } */
-/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp" } */
+/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp -fdevirtualize" } */
extern "C" void abort (void);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-5.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-5.C
index d78173d69..33c1d7bf5 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-5.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-5.C
@@ -1,7 +1,7 @@
/* Verify that virtual call inlining does not pick a wrong method when
there is a user defined ancestor in an object. */
/* { dg-do run { target nonpic } } */
-/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp" } */
+/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp -fdevirtualize" } */
extern "C" void abort (void);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-7.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-7.C
index 9d725a508..e6ba8505d 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-7.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-7.C
@@ -2,7 +2,7 @@
inlining, even when a typecast to an ancestor is involved along the
way and that ancestor is not the first one with virtual functions. */
/* { dg-do run { target nonpic } } */
-/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp" } */
+/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp -fdevirtualize" } */
extern "C" void abort (void);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-8.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-8.C
index eebfc6af1..606049aad 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-8.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-8.C
@@ -1,7 +1,7 @@
/* Verify that virtual calls are inlined (ithout early inlining) even
when their caller is itself indirectly inlined. */
/* { dg-do run { target nonpic } } */
-/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp" } */
+/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp -fdevirtualize" } */
extern "C" void abort (void);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-9.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-9.C
index 586c3af30..dec234e06 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-9.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-9.C
@@ -3,7 +3,7 @@
way and that ancestor itself has an ancestor wich is not the
primary base class. */
/* { dg-do run { target nonpic } } */
-/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp" } */
+/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp -fdevirtualize" } */
extern "C" void abort (void);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr60600.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr60600.C
index b9039cb85..4d0db6be4 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr60600.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr60600.C
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O3 -fdump-ipa-cp" } */
+/* { dg-options "-O3 -fdump-ipa-cp -fdevirtualize" } */
struct data {
data(int);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr60640-4.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr60640-4.C
index eb9eb627f..d290450cd 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr60640-4.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr60640-4.C
@@ -1,5 +1,5 @@
// { dg-do run }
-// { dg-options "-O3 -fdump-ipa-cp" }
+// { dg-options "-O3 -fdump-ipa-cp -fdevirtualize" }
struct Distraction
{
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr61654.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr61654.C
new file mode 100644
index 000000000..d07e4586b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr61654.C
@@ -0,0 +1,40 @@
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+/* The bug only presented itself on a 32 bit i386 but in theory it might also
+ pop up elsewhere and we do not want to put -m32 options to testcase
+ options. */
+
+struct A
+{
+ virtual int a (int, int = 0) = 0;
+ void b ();
+ void c ();
+ int d;
+};
+
+struct B : virtual A
+{
+ int a (int, int);
+ int e;
+};
+
+int f;
+
+void
+A::b ()
+{
+ a (0);
+}
+
+void
+A::c ()
+{
+ a (f);
+}
+
+int
+B::a (int, int)
+{
+ return e;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr62015.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr62015.C
new file mode 100644
index 000000000..950b46e75
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr62015.C
@@ -0,0 +1,55 @@
+/* { dg-do run } */
+/* { dg-options "-O3 -std=c++11" } */
+
+
+extern "C" int printf(const char *fmt, ...);
+extern "C" void abort(void);
+
+struct Side {
+ enum _Value { Left, Right, Invalid };
+
+ constexpr Side() : _value(Invalid) {}
+ constexpr Side(_Value value) : _value(value) {}
+ operator _Value() const { return (_Value)_value; }
+
+ private:
+ char _value;
+};
+
+struct A {
+ void init();
+ void adjust(Side side, bool final);
+ void move(Side side);
+};
+
+void A::init()
+{
+ adjust(Side::Invalid, false);
+}
+
+static void __attribute__((noinline))
+check (int v, int final)
+{
+ if (v != 0)
+ abort();
+}
+
+
+__attribute__((noinline))
+void A::adjust(Side side, bool final)
+{
+ check ((int)side, final);
+}
+
+void A::move(Side side)
+{
+ adjust(side, false);
+ adjust(side, true);
+}
+
+int main()
+{
+ A t;
+ t.move(Side::Left);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr63306.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr63306.C
new file mode 100644
index 000000000..e22a4c2a0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr63306.C
@@ -0,0 +1,14 @@
+// PR c++/63306
+// { dg-do compile { target c++11 } }
+
+template <typename...>
+class A;
+
+class B
+{
+ B (const int &, const A<int, int> &);
+};
+
+B::B (const int &, const A<int, int> &)
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr63838.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr63838.C
new file mode 100644
index 000000000..d67364900
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr63838.C
@@ -0,0 +1,56 @@
+// PR ipa/63838
+// { dg-do run }
+// { dg-options "-O2 -fdump-ipa-pure-const" }
+// { dg-final { scan-ipa-dump-not "Function found to be nothrow: void foo" "pure-const" } }
+// { dg-final { scan-ipa-dump-not "Function found to be nothrow: void bar" "pure-const" } }
+// { dg-final { cleanup-ipa-dump "pure-const" } }
+
+__attribute__((noinline, noclone)) static void bar (int);
+volatile int v;
+void (*fn) ();
+struct S { S () { v++; } ~S () { v++; } };
+
+__attribute__((noinline, noclone)) static void
+foo (int x)
+{
+ v++;
+ if (x == 5)
+ bar (x);
+}
+
+__attribute__((noinline, noclone)) static void
+bar (int x)
+{
+ v++;
+ if (x == 6)
+ foo (x);
+ else if (x == 5)
+ fn ();
+}
+
+__attribute__((noinline, noclone)) int
+baz (int x)
+{
+ S s;
+ foo (x);
+}
+
+void
+throw0 ()
+{
+ throw 0;
+}
+
+int
+main ()
+{
+ fn = throw0;
+ asm volatile ("" : : : "memory");
+ try
+ {
+ baz (5);
+ }
+ catch (int)
+ {
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr64068.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr64068.C
new file mode 100644
index 000000000..95288836c
--- /dev/null
+++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/ipa/type-inheritance-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/type-inheritance-1.C
index 818002ec1..a0c151122 100644
--- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/type-inheritance-1.C
+++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/type-inheritance-1.C
@@ -1,7 +1,7 @@
/* Verify that callgraph construction keeps FOO for possible devirtualization
and removes BAR. */
/* { dg-do compile } */
-/* { dg-options "-O2 -fdump-ipa-visibility" } */
+/* { dg-options "-O2 -fdump-ipa-visibility -fdevirtualize" } */
extern "C" void abort (void);