===================================================================
@@ -0,0 +1,40 @@
+/* Check that we speculatively devirutalize call to FOO to A::foo becuase
+ B is noreturn. */
+/* { dg-do run } */
+/* { dg-options "-O2 -fdump-ipa-devirt" } */
+class A {
+public:
+ virtual int foo(void)
+ {
+ throw (1);
+ return 0;
+ }
+};
+
+
+class B : public A {
+public:
+ virtual int foo(void);
+};
+
+int
+B::foo(void)
+{
+ return 1;
+}
+class A a, *b=&a;
+void
+m(void)
+{
+ b->foo();
+}
+main()
+{
+ m();
+}
+
+/* { dg-final { scan-ipa-dump "Speculatively devirtualizing call" "devirt"} } */
+/* { dg-final { cleanup-ipa-dump "devirt" } } */
+/* Match if (PROF_6 == foo) to verify that the speculation survived. */
+/* { dg-final { scan-tree-dump "== foo" "optimized"} } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */