OSDN Git Service

* tree-ssa-loop-ivopts.c: New file.
[pf3gnuchains/gcc-fork.git] / gcc / tree-alias-common.c
index 33ef6d3..eac7746 100644 (file)
@@ -154,11 +154,7 @@ get_alias_var_decl (tree decl)
       newvar = create_alias_var (decl);
       /* Assign globals to global var for purposes of intraprocedural
         analysis.  */
-      if ((DECL_CONTEXT (decl) == NULL 
-          || TREE_PUBLIC (decl)
-          || TREE_STATIC (decl)
-          || decl_function_context (decl) == NULL) 
-         && decl != pta_global_var)
+      if (TREE_STATIC (decl) && decl != pta_global_var)
        {
          current_alias_ops->addr_assign (current_alias_ops, 
                                          get_alias_var (pta_global_var), 
@@ -207,12 +203,15 @@ get_alias_var (tree expr)
   switch (TREE_CODE (expr))
     {
     case ARRAY_REF:
+    case ARRAY_RANGE_REF:
       {
-       /* Find the first non-array ref, and return it's alias
-          variable */
+       /* Find the first non-array ref, and return its alias variable.  */
        tree p;
-       for (p = expr; TREE_CODE (p) == ARRAY_REF;
-            p = TREE_OPERAND (p, 0));
+
+       for (p = expr;
+            TREE_CODE (p) == ARRAY_REF || TREE_CODE (p) == ARRAY_RANGE_REF;
+            p = TREE_OPERAND (p, 0))
+         ;
        return get_alias_var (p);
       }
       break;
@@ -445,7 +444,10 @@ find_func_aliases (tree stp)
        {
          op0 = TREE_OPERAND (stp, 0);
          op1 = TREE_OPERAND (stp, 1);
+         if (TREE_CODE (op1) == WITH_SIZE_EXPR)
+           op1 = TREE_OPERAND (op1, 0);
        }
+
       /* lhsAV should always have an alias variable */
       lhsAV = get_alias_var (op0);
       if (!lhsAV)
@@ -530,7 +532,7 @@ find_func_aliases (tree stp)
          else if (TREE_CODE (op1) == CALL_EXPR)
            {
              /* Heap assignment. These are __attribute__ malloc or
-                something, i'll deal with it later.  */
+                something, I'll deal with it later.  */
              if (0)
                {}
              else
@@ -1010,7 +1012,7 @@ create_alias_vars (void)
        {
          var = TREE_VALUE (vars);
          if (TREE_CODE (var) != LABEL_DECL
-             && decl_function_context (var) == NULL
+             && TREE_STATIC (var)
              && DECL_INITIAL (var))
            find_func_aliases (var);
        }
@@ -1027,10 +1029,20 @@ create_alias_vars (void)
   pta_global_var = NULL_TREE;
 }
 
+static bool
+gate_pta (void)
+{
+#ifdef HAVE_BANSHEE
+  return flag_tree_points_to != PTA_NONE;
+#else
+  return false;
+#endif
+}
+
 struct tree_opt_pass pass_build_pta = 
 {
   "pta",                               /* name */
-  NULL,                                        /* gate */
+  gate_pta,                            /* gate */
   create_alias_vars,                   /* execute */
   NULL,                                        /* sub */
   NULL,                                        /* next */
@@ -1051,9 +1063,6 @@ delete_alias_vars (void)
 {
   size_t i;
 
-  if (flag_tree_points_to != PTA_ANDERSEN)
-    return;
-
   for (i = 0; i < VARRAY_ACTIVE_SIZE (local_alias_vars); i++)
     {
       tree key = VARRAY_TREE (local_alias_vars, i);
@@ -1078,7 +1087,7 @@ delete_alias_vars (void)
 struct tree_opt_pass pass_del_pta = 
 {
   "pta",                               /* name */
-  NULL,                                        /* gate */
+  gate_pta,                            /* gate */
   delete_alias_vars,                   /* execute */
   NULL,                                        /* sub */
   NULL,                                        /* next */