tree-ssa-structalias.c (get_fi_for_callee): Restructure.
authorRichard Guenther <rguenther@suse.de>
Fri, 29 Apr 2011 10:59:33 +0000 (10:59 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 29 Apr 2011 10:59:33 +0000 (10:59 +0000)
2011-04-29  Richard Guenther  <rguenther@suse.de>

* tree-ssa-structalias.c (get_fi_for_callee): Restructure.
Handle OBJ_TYPE_REF.
(find_func_aliases_for_call): Use it more consistently.

From-SVN: r173152

gcc/ChangeLog
gcc/tree-ssa-structalias.c

index 5bb003794073ad1ceed66329309045c96f5dcc47..e2e0a8f5f53e8249297799ee84bd2ac3563833c1 100644 (file)
@@ -1,3 +1,9 @@
+2011-04-29  Richard Guenther  <rguenther@suse.de>
+
+       * tree-ssa-structalias.c (get_fi_for_callee): Restructure.
+       Handle OBJ_TYPE_REF.
+       (find_func_aliases_for_call): Use it more consistently.
+
 2011-04-29  Alexandre Oliva  <aoliva@redhat.com>
 
        * haifa-sched.c (last_nondebug_scheduled_insn): New.
index 3aab8ee7a3d414736a49b3ea7060980e9d876dbc..ce0d8d0653d03f77d9acaebb3679fa9e2228fe1d 100644 (file)
@@ -3925,35 +3925,29 @@ handle_pure_call (gimple stmt, VEC(ce_s, heap) **results)
 static varinfo_t
 get_fi_for_callee (gimple call)
 {
-  tree decl;
+  tree decl, fn = gimple_call_fn (call);
 
-  gcc_assert (!gimple_call_internal_p (call));
+  if (fn && TREE_CODE (fn) == OBJ_TYPE_REF)
+    fn = OBJ_TYPE_REF_EXPR (fn);
 
   /* If we can directly resolve the function being called, do so.
      Otherwise, it must be some sort of indirect expression that
      we should still be able to handle.  */
-  decl = gimple_call_fndecl (call);
+  decl = gimple_call_addr_fndecl (fn);
   if (decl)
     return get_vi_for_tree (decl);
 
-  decl = gimple_call_fn (call);
-  /* The function can be either an SSA name pointer or,
-     worse, an OBJ_TYPE_REF.  In this case we have no
+  /* If the function is anything other than a SSA name pointer we have no
      clue and should be getting ANYFN (well, ANYTHING for now).  */
-  if (TREE_CODE (decl) == SSA_NAME)
-    {
-      if (TREE_CODE (decl) == SSA_NAME
-         && (TREE_CODE (SSA_NAME_VAR (decl)) == PARM_DECL
-             || TREE_CODE (SSA_NAME_VAR (decl)) == RESULT_DECL)
-         && SSA_NAME_IS_DEFAULT_DEF (decl))
-       decl = SSA_NAME_VAR (decl);
-      return get_vi_for_tree (decl);
-    }
-  else if (TREE_CODE (decl) == INTEGER_CST
-          || TREE_CODE (decl) == OBJ_TYPE_REF)
+  if (!fn || TREE_CODE (fn) != SSA_NAME)
     return get_varinfo (anything_id);
-  else
-    gcc_unreachable ();
+
+  if ((TREE_CODE (SSA_NAME_VAR (fn)) == PARM_DECL
+       || TREE_CODE (SSA_NAME_VAR (fn)) == RESULT_DECL)
+      && SSA_NAME_IS_DEFAULT_DEF (fn))
+    fn = SSA_NAME_VAR (fn);
+
+  return get_vi_for_tree (fn);
 }
 
 /* Create constraints for the builtin call T.  Return true if the call
@@ -4199,11 +4193,9 @@ find_func_aliases_for_call (gimple t)
       && find_func_aliases_for_builtin_call (t))
     return;
 
+  fi = get_fi_for_callee (t);
   if (!in_ipa_mode
-      || gimple_call_internal_p (t)
-      || (fndecl
-         && (!(fi = lookup_vi_for_tree (fndecl))
-             || !fi->is_fn_info)))
+      || (fndecl && !fi->is_fn_info))
     {
       VEC(ce_s, heap) *rhsc = NULL;
       int flags = gimple_call_flags (t);
@@ -4231,8 +4223,6 @@ find_func_aliases_for_call (gimple t)
       tree lhsop;
       unsigned j;
 
-      fi = get_fi_for_callee (t);
-
       /* Assign all the passed arguments to the appropriate incoming
         parameters of the function.  */
       for (j = 0; j < gimple_call_num_args (t); j++)
@@ -4271,7 +4261,7 @@ find_func_aliases_for_call (gimple t)
              VEC_free(ce_s, heap, tem);
            }
          FOR_EACH_VEC_ELT (ce_s, lhsc, j, lhsp)
-             process_constraint (new_constraint (*lhsp, rhs));
+           process_constraint (new_constraint (*lhsp, rhs));
        }
 
       /* If we pass the result decl by reference, honor that.  */
@@ -4286,7 +4276,7 @@ find_func_aliases_for_call (gimple t)
          get_constraint_for_address_of (lhsop, &rhsc);
          lhs = get_function_part_constraint (fi, fi_result);
          FOR_EACH_VEC_ELT (ce_s, rhsc, j, rhsp)
-             process_constraint (new_constraint (lhs, *rhsp));
+           process_constraint (new_constraint (lhs, *rhsp));
          VEC_free (ce_s, heap, rhsc);
        }
 
@@ -4299,7 +4289,7 @@ find_func_aliases_for_call (gimple t)
          get_constraint_for (gimple_call_chain (t), &rhsc);
          lhs = get_function_part_constraint (fi, fi_static_chain);
          FOR_EACH_VEC_ELT (ce_s, rhsc, j, rhsp)
-             process_constraint (new_constraint (lhs, *rhsp));
+           process_constraint (new_constraint (lhs, *rhsp));
        }
     }
 }