PR tree-optimization/62091
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 14 Aug 2014 23:36:22 +0000 (23:36 +0000)
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 14 Aug 2014 23:36:22 +0000 (23:36 +0000)
* g++.dg/ipa/devirt-38.C: New testcase.
* tree-ssa-alias.c (walk_aliased_vdefs_1): Do not clear
function_entry_reached.
(walk_aliased_vdefs): Clear it here.
* ipa-devirt.c (check_stmt_for_type_change): Handle static storage.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@213991 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/ipa-devirt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ipa/devirt-38.C [new file with mode: 0644]
gcc/tree-ssa-alias.c

index 223e484..e5e0852 100644 (file)
@@ -1,5 +1,13 @@
 2014-08-14  Jan Hubicka  <hubicka@ucw.cz>
 
+       PR tree-optimization/62091
+       * tree-ssa-alias.c (walk_aliased_vdefs_1): Do not clear
+       function_entry_reached.
+       (walk_aliased_vdefs): Clear it here.
+       * ipa-devirt.c (check_stmt_for_type_change): Handle static storage.
+
+2014-08-14  Jan Hubicka  <hubicka@ucw.cz>
+
        * ipa-utils.h (compare_virtual_tables): Declare.
        * ipa-devirt.c (odr_subtypes_equivalent_p): New function
 
index 2d356ad..ff206ee 100644 (file)
@@ -2777,6 +2777,8 @@ check_stmt_for_type_change (ao_ref *ao ATTRIBUTE_UNUSED, tree vdef, void *data)
                          * BITS_PER_UNIT;
                op = TREE_OPERAND (op, 0);
              }
+           else if (DECL_P (op))
+             ;
            else
              {
                 tci->speculative = true;
index bc879c1..73a6ab8 100644 (file)
@@ -1,3 +1,8 @@
+2014-08-14  Jan Hubicka  <hubicka@ucw.cz>
+
+       PR tree-optimization/62091
+       * g++.dg/ipa/devirt-38.C: New testcase.
+
 2014-08-14  Marek Polacek  <polacek@redhat.com>
 
        DR 458
diff --git a/gcc/testsuite/g++.dg/ipa/devirt-38.C b/gcc/testsuite/g++.dg/ipa/devirt-38.C
new file mode 100644 (file)
index 0000000..be8cbdf
--- /dev/null
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-options "-O2"  } */
+class SnmpSyntax
+{
+public:
+  virtual SnmpSyntax *m_fn1 () const;
+  ~SnmpSyntax () {}
+  virtual SnmpSyntax &operator=(const SnmpSyntax &);
+};
+
+class A : public SnmpSyntax
+{
+public:
+  A (int);
+  SnmpSyntax *m_fn1 () const {}
+  SnmpSyntax &operator=(const SnmpSyntax &);
+};
+int a;
+void fn1 ()
+{
+  for (;; a++)
+    switch (0)
+    case 0:
+      {
+        A b (0);
+        SnmpSyntax &c = b;
+        c.m_fn1 ();
+      }
+}
+// Devirtualization to A::m_fn1 would be possible, but we can not do it at the moment
index 2910374..67419a9 100644 (file)
@@ -2658,8 +2658,6 @@ walk_aliased_vdefs_1 (ao_ref *ref, tree vdef,
                      bitmap *visited, unsigned int cnt,
                      bool *function_entry_reached)
 {
-  if (function_entry_reached)
-    *function_entry_reached = false;
   do
     {
       gimple def_stmt = SSA_NAME_DEF_STMT (vdef);
@@ -2709,6 +2707,9 @@ walk_aliased_vdefs (ao_ref *ref, tree vdef,
 
   timevar_push (TV_ALIAS_STMT_WALK);
 
+  if (function_entry_reached)
+    *function_entry_reached = false;
+
   ret = walk_aliased_vdefs_1 (ref, vdef, walker, data,
                              visited ? visited : &local_visited, 0,
                              function_entry_reached);