Hi,
testcase in PR 62092 triggers assert I added to temporarily check that new
ipa-devirt code handles all cases as ipa-prop devirtualization.  In this case
ipa-prop gives wrong answer because of bug I introduced into
walk_aliased_vdefs.  The function_entry_reached is supposed to be cleared at
begginign of walk_aliased_vdefs instead of walk_aliased_vdefs_1.  It seems I
have misapplied a patch here.

THere is one extra issue I noticed while looking into dump - the ctor detection
code did not handled static storage vars correctly.

Bootstrapped/regtested x86_64-linux.  With this patch the testcase passes
but it is not devirtualized, becuase we think we can not reffer the function.

We ought to devirtualize because the funcion is empty and should be inlined -
I would like to keep the PR open for that.

Honza

        PR tree-optimization/62091
        * 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.
Index: testsuite/g++.dg/ipa/devirt-38.C
===================================================================
--- testsuite/g++.dg/ipa/devirt-38.C    (revision 0)
+++ testsuite/g++.dg/ipa/devirt-38.C    (revision 0)
@@ -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: tree-ssa-alias.c
===================================================================
--- tree-ssa-alias.c    (revision 213989)
+++ tree-ssa-alias.c    (working copy)
@@ -2658,8 +2658,6 @@ walk_aliased_vdefs_1 (ao_ref *ref, tree
                      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 vd
 
   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);
Index: ipa-devirt.c
===================================================================
--- ipa-devirt.c        (revision 213990)
+++ ipa-devirt.c        (working copy)
@@ -2777,6 +2777,8 @@ check_stmt_for_type_change (ao_ref *ao A
                          * BITS_PER_UNIT;
                op = TREE_OPERAND (op, 0);
              }
+           else if (DECL_P (op))
+             ;
            else
              {
                 tci->speculative = true;

Reply via email to