re PR ipa/60912 (wrong code with -O -fno-inline -fipa-pta)
authorRichard Biener <rguenther@suse.de>
Fri, 25 Apr 2014 07:47:22 +0000 (07:47 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 25 Apr 2014 07:47:22 +0000 (07:47 +0000)
2014-04-25  Richard Biener  <rguenther@suse.de>

PR ipa/60912
* tree-ssa-structalias.c (ipa_pta_execute): Compute direct
call stmt use/clobber sets during stmt walk instead of
walking the possibly incomplete set of caller edges.

* g++.dg/opt/pr60912.C: New testcase.

From-SVN: r209780

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/opt/pr60912.C [new file with mode: 0644]
gcc/tree-ssa-structalias.c

index ec3c2e2..1e413ba 100644 (file)
@@ -1,5 +1,12 @@
 2014-04-25  Richard Biener  <rguenther@suse.de>
 
+       PR ipa/60912
+       * tree-ssa-structalias.c (ipa_pta_execute): Compute direct
+       call stmt use/clobber sets during stmt walk instead of
+       walking the possibly incomplete set of caller edges.
+
+2014-04-25  Richard Biener  <rguenther@suse.de>
+
        PR ipa/60911
        * passes.c (apply_ipa_transforms): Inline into only caller ...
        (execute_one_pass): ... here.  Properly bring in function
index 6d0fe01..d11d70b 100644 (file)
@@ -1,5 +1,10 @@
 2014-04-25  Richard Biener  <rguenther@suse.de>
 
+       PR ipa/60912
+       * g++.dg/opt/pr60912.C: New testcase.
+
+2014-04-25  Richard Biener  <rguenther@suse.de>
+
        PR ipa/60911
        * gcc.dg/lto/pr60911_0.c: New testcase.
 
diff --git a/gcc/testsuite/g++.dg/opt/pr60912.C b/gcc/testsuite/g++.dg/opt/pr60912.C
new file mode 100644 (file)
index 0000000..ad51ba7
--- /dev/null
@@ -0,0 +1,18 @@
+// { dg-do run }
+// { dg-options "-O -fno-inline -fipa-pta" }
+
+struct IFoo
+{
+  virtual void Foo () = 0;
+};
+
+struct Bar:IFoo
+{
+  void Foo () {}
+};
+
+int main ()
+{
+  (new Bar ())->Foo ();
+  return 0;
+}
index 2686ba6..c4f5f49 100644 (file)
@@ -7244,10 +7244,7 @@ ipa_pta_execute (void)
       tree ptr;
       struct function *fn;
       unsigned i;
-      varinfo_t fi;
       basic_block bb;
-      struct pt_solution uses, clobbers;
-      struct cgraph_edge *e;
 
       /* Nodes without a body are not interesting.  */
       if (!cgraph_function_with_gimple_body_p (node) || node->clone_of)
@@ -7263,21 +7260,6 @@ ipa_pta_execute (void)
            find_what_p_points_to (ptr);
        }
 
-      /* Compute the call-use and call-clobber sets for all direct calls.  */
-      fi = lookup_vi_for_tree (node->decl);
-      gcc_assert (fi->is_fn_info);
-      clobbers
-       = find_what_var_points_to (first_vi_for_offset (fi, fi_clobbers));
-      uses = find_what_var_points_to (first_vi_for_offset (fi, fi_uses));
-      for (e = node->callers; e; e = e->next_caller)
-       {
-         if (!e->call_stmt)
-           continue;
-
-         *gimple_call_clobber_set (e->call_stmt) = clobbers;
-         *gimple_call_use_set (e->call_stmt) = uses;
-       }
-
       /* Compute the call-use and call-clobber sets for indirect calls
         and calls to external functions.  */
       FOR_EACH_BB_FN (bb, fn)
@@ -7288,17 +7270,27 @@ ipa_pta_execute (void)
            {
              gimple stmt = gsi_stmt (gsi);
              struct pt_solution *pt;
-             varinfo_t vi;
+             varinfo_t vi, fi;
              tree decl;
 
              if (!is_gimple_call (stmt))
                continue;
 
-             /* Handle direct calls to external functions.  */
+             /* Handle direct calls to functions with body.  */
              decl = gimple_call_fndecl (stmt);
              if (decl
-                 && (!(fi = lookup_vi_for_tree (decl))
-                     || !fi->is_fn_info))
+                 && (fi = lookup_vi_for_tree (decl))
+                 && fi->is_fn_info)
+               {
+                 *gimple_call_clobber_set (stmt)
+                    = find_what_var_points_to
+                        (first_vi_for_offset (fi, fi_clobbers));
+                 *gimple_call_use_set (stmt)
+                    = find_what_var_points_to
+                        (first_vi_for_offset (fi, fi_uses));
+               }
+             /* Handle direct calls to external functions.  */
+             else if (decl)
                {
                  pt = gimple_call_use_set (stmt);
                  if (gimple_call_flags (stmt) & ECF_CONST)
@@ -7342,10 +7334,9 @@ ipa_pta_execute (void)
                      pt->nonlocal = 1;
                    }
                }
-
              /* Handle indirect calls.  */
-             if (!decl
-                 && (fi = get_fi_for_callee (stmt)))
+             else if (!decl
+                      && (fi = get_fi_for_callee (stmt)))
                {
                  /* We need to accumulate all clobbers/uses of all possible
                     callees.  */