OSDN Git Service

PR target/36684
[pf3gnuchains/gcc-fork.git] / gcc / tree-flow-inline.h
index 8fcb77f..bff697d 100644 (file)
@@ -1,5 +1,6 @@
 /* Inline functions for tree-flow.h
-   Copyright (C) 2001, 2003, 2005, 2006, 2007 Free Software Foundation, Inc.
+   Copyright (C) 2001, 2003, 2005, 2006, 2007, 2008 Free Software
+   Foundation, Inc.
    Contributed by Diego Novillo <dnovillo@redhat.com>
 
 This file is part of GCC.
@@ -65,8 +66,17 @@ gimple_call_clobbered_vars (const struct function *fun)
   return fun->gimple_df->call_clobbered_vars;
 }
 
-/* Array of all variables referenced in the function.  */
+/* Call-used variables in the function.  If bit I is set, then
+   REFERENCED_VARS (I) is call-used at pure function call-sites.  */
 static inline bitmap
+gimple_call_used_vars (const struct function *fun)
+{
+  gcc_assert (fun && fun->gimple_df);
+  return fun->gimple_df->call_used_vars;
+}
+
+/* Array of all variables referenced in the function.  */
+static inline htab_t
 gimple_referenced_vars (const struct function *fun)
 {
   if (!fun->gimple_df)
@@ -91,14 +101,6 @@ gimple_nonlocal_all (const struct function *fun)
   return fun->gimple_df->nonlocal_all;
 }
 
-/* Hashtable of variables annotations.  Used for static variables only;
-   local variables have direct pointer in the tree node.  */
-static inline htab_t
-gimple_var_anns (const struct function *fun)
-{
-  return fun->gimple_df->var_anns;
-}
-
 /* Initialize the hashtable iterator HTI to point to hashtable TABLE */
 
 static inline void *
@@ -145,23 +147,34 @@ next_htab_element (htab_iterator *hti)
   return NULL;
 }
 
-/* Helper for FOR_EACH_REFERENCED_VAR.  Needed unless iterator
-   bodies deal with NULL elements.  */
+/* Initialize ITER to point to the first referenced variable in the
+   referenced_vars hashtable, and return that variable.  */
+
+static inline tree
+first_referenced_var (referenced_var_iterator *iter)
+{
+  return (tree) first_htab_element (&iter->hti,
+                                   gimple_referenced_vars (cfun));
+}
+
+/* Return true if we have hit the end of the referenced variables ITER is
+   iterating through.  */
 
 static inline bool
-referenced_var_iterator_set (referenced_var_iterator *ri, tree *var)
+end_referenced_vars_p (const referenced_var_iterator *iter)
 {
-  while (1)
-    {
-      if (!bmp_iter_set (&ri->bi, &ri->i))
-       return false;
-      *var = lookup_decl_from_uid (ri->i);
-      if (*var)
-       return true;
-      bmp_iter_next (&ri->bi, &ri->i);
-    }
+  return end_htab_p (&iter->hti);
 }
 
+/* Make ITER point to the next referenced_var in the referenced_var hashtable,
+   and return that variable.  */
+
+static inline tree
+next_referenced_var (referenced_var_iterator *iter)
+{
+  return (tree) next_htab_element (&iter->hti);
+} 
+
 /* Fill up VEC with the variables in the referenced vars hashtable.  */
 
 static inline void
@@ -181,22 +194,9 @@ var_ann (const_tree t)
 {
   var_ann_t ann;
 
-  if (!MTAG_P (t)
-      && (TREE_STATIC (t) || DECL_EXTERNAL (t)))
-    {
-      struct static_var_ann_d *sann
-        = ((struct static_var_ann_d *)
-          htab_find_with_hash (gimple_var_anns (cfun), t, DECL_UID (t)));
-      if (!sann)
-       return NULL;
-      ann = &sann->ann;
-    }
-  else
-    {
-      if (!t->base.ann)
-       return NULL;
-      ann = (var_ann_t) t->base.ann;
-    }
+  if (!t->base.ann)
+    return NULL;
+  ann = (var_ann_t) t->base.ann;
 
   gcc_assert (ann->common.type == VAR_ANN);
 
@@ -267,6 +267,41 @@ get_stmt_ann (tree stmt)
   return (ann) ? ann : create_stmt_ann (stmt);
 }
 
+/* Set the uid of all non phi function statements.  */
+static inline void
+set_gimple_stmt_uid (tree stmt, unsigned int uid)
+{
+  get_stmt_ann (stmt)->uid = uid;
+}
+
+/* Get the uid of all non phi function statements.  */
+static inline unsigned int
+gimple_stmt_uid (tree stmt)
+{
+  return get_stmt_ann (stmt)->uid;
+}
+
+/* Get the number of the next statement uid to be allocated.  */
+static inline unsigned int
+gimple_stmt_max_uid (struct function *fn)
+{
+  return fn->last_stmt_uid;
+}
+
+/* Set the number of the next statement uid to be allocated.  */
+static inline void
+set_gimple_stmt_max_uid (struct function *fn, unsigned int maxid)
+{
+  fn->last_stmt_uid = maxid;
+}
+
+/* Set the number of the next statement uid to be allocated.  */
+static inline unsigned int
+inc_gimple_stmt_max_uid (struct function *fn)
+{
+  return fn->last_stmt_uid++;
+}
+
 /* Return the annotation type for annotation ANN.  */
 static inline enum tree_ann_type
 ann_type (tree_ann_t ann)
@@ -501,7 +536,7 @@ next_readonly_imm_use (imm_use_iterator *imm)
 
   imm->imm_use = old->next;
   if (end_readonly_imm_use_p (imm))
-    return old;
+    return NULL_USE_OPERAND_P;
   return imm->imm_use;
 }
 
@@ -673,7 +708,7 @@ static inline bool
 is_global_var (const_tree t)
 {
   if (MTAG_P (t))
-    return (TREE_STATIC (t) || MTAG_GLOBAL (t));
+    return MTAG_GLOBAL (t);
   else
     return (TREE_STATIC (t) || DECL_EXTERNAL (t));
 }
@@ -850,10 +885,7 @@ factoring_name_p (const_tree name)
 static inline bool
 is_call_clobbered (const_tree var)
 {
-  if (!MTAG_P (var))
-    return var_ann (var)->call_clobbered;
-  else
-    return bitmap_bit_p (gimple_call_clobbered_vars (cfun), DECL_UID (var)); 
+  return var_ann (var)->call_clobbered;
 }
 
 /* Mark variable VAR as being clobbered by function calls.  */
@@ -861,8 +893,7 @@ static inline void
 mark_call_clobbered (tree var, unsigned int escape_type)
 {
   var_ann (var)->escape_mask |= escape_type;
-  if (!MTAG_P (var))
-    var_ann (var)->call_clobbered = true;
+  var_ann (var)->call_clobbered = true;
   bitmap_set_bit (gimple_call_clobbered_vars (cfun), DECL_UID (var));
 }
 
@@ -872,10 +903,9 @@ clear_call_clobbered (tree var)
 {
   var_ann_t ann = var_ann (var);
   ann->escape_mask = 0;
-  if (MTAG_P (var) && TREE_CODE (var) != STRUCT_FIELD_TAG)
+  if (MTAG_P (var))
     MTAG_GLOBAL (var) = 0;
-  if (!MTAG_P (var))
-    var_ann (var)->call_clobbered = false;
+  var_ann (var)->call_clobbered = false;
   bitmap_clear_bit (gimple_call_clobbered_vars (cfun), DECL_UID (var));
 }
 
@@ -1443,7 +1473,7 @@ link_use_stmts_after (use_operand_p head, imm_use_iterator *imm)
        if (USE_FROM_PTR (use_p) == use)
          last_p = move_use_after_head (use_p, head, last_p);
     }
-  /* LInk iter node in after last_p.  */
+  /* Link iter node in after last_p.  */
   if (imm->iter_node.prev != NULL)
     delink_imm_use (&imm->iter_node);
   link_imm_use_to_list (&(imm->iter_node), last_p);
@@ -1534,7 +1564,7 @@ unmodifiable_var_p (const_tree var)
     var = SSA_NAME_VAR (var);
 
   if (MTAG_P (var))
-    return TREE_READONLY (var) && (TREE_STATIC (var) || MTAG_GLOBAL (var));
+    return false;
 
   return TREE_READONLY (var) && (TREE_STATIC (var) || DECL_EXTERNAL (var));
 }
@@ -1570,197 +1600,28 @@ ref_contains_array_ref (const_tree ref)
   return false;
 }
 
-/* Given a variable VAR, lookup and return a pointer to the list of
-   subvariables for it.  */
-
-static inline subvar_t *
-lookup_subvars_for_var (const_tree var)
-{
-  var_ann_t ann = var_ann (var);
-  gcc_assert (ann);
-  return &ann->subvars;
-}
-
-/* Given a variable VAR, return a linked list of subvariables for VAR, or
-   NULL, if there are no subvariables.  */
-
-static inline subvar_t
-get_subvars_for_var (tree var)
-{
-  subvar_t subvars;
-
-  gcc_assert (SSA_VAR_P (var));  
-  
-  if (TREE_CODE (var) == SSA_NAME)
-    subvars = *(lookup_subvars_for_var (SSA_NAME_VAR (var)));
-  else
-    subvars = *(lookup_subvars_for_var (var));
-  return subvars;
-}
-
-/* Return the subvariable of VAR at offset OFFSET.  */
-
-static inline tree
-get_subvar_at (tree var, unsigned HOST_WIDE_INT offset)
-{
-  subvar_t sv = get_subvars_for_var (var);
-  int low, high;
-
-  low = 0;
-  high = VEC_length (tree, sv) - 1;
-  while (low <= high)
-    {
-      int mid = (low + high) / 2;
-      tree subvar = VEC_index (tree, sv, mid);
-      if (SFT_OFFSET (subvar) == offset)
-       return subvar;
-      else if (SFT_OFFSET (subvar) < offset)
-       low = mid + 1;
-      else
-       high = mid - 1;
-    }
-
-  return NULL_TREE;
-}
-
-
-/* Return the first subvariable in SV that overlaps [offset, offset + size[.
-   NULL_TREE is returned, if there is no overlapping subvariable, else *I
-   is set to the index in the SV vector of the first overlap.  */
-
-static inline tree
-get_first_overlapping_subvar (subvar_t sv, unsigned HOST_WIDE_INT offset,
-                             unsigned HOST_WIDE_INT size, unsigned int *i)
-{
-  int low = 0;
-  int high = VEC_length (tree, sv) - 1;
-  int mid;
-  tree subvar;
-
-  if (low > high)
-    return NULL_TREE;
-
-  /* Binary search for offset.  */
-  do
-    {
-      mid = (low + high) / 2;
-      subvar = VEC_index (tree, sv, mid);
-      if (SFT_OFFSET (subvar) == offset)
-       {
-         *i = mid;
-         return subvar;
-       }
-      else if (SFT_OFFSET (subvar) < offset)
-       low = mid + 1;
-      else
-       high = mid - 1;
-    }
-  while (low <= high);
-
-  /* As we didn't find a subvar with offset, adjust to return the
-     first overlapping one.  */
-  if (SFT_OFFSET (subvar) < offset
-      && SFT_OFFSET (subvar) + SFT_SIZE (subvar) <= offset)
-    {
-      mid += 1;
-      if ((unsigned)mid >= VEC_length (tree, sv))
-       return NULL_TREE;
-      subvar = VEC_index (tree, sv, mid);
-    }
-  else if (SFT_OFFSET (subvar) > offset
-          && size <= SFT_OFFSET (subvar) - offset)
-    {
-      mid -= 1;
-      if (mid < 0)
-       return NULL_TREE;
-      subvar = VEC_index (tree, sv, mid);
-    }
-
-  if (overlap_subvar (offset, size, subvar, NULL))
-    {
-      *i = mid;
-      return subvar;
-    }
-
-  return NULL_TREE;
-}
-
-
-/* Return true if V is a tree that we can have subvars for.
-   Normally, this is any aggregate type.  Also complex
-   types which are not gimple registers can have subvars.  */
+/* Return true, if the two ranges [POS1, SIZE1] and [POS2, SIZE2]
+   overlap.  SIZE1 and/or SIZE2 can be (unsigned)-1 in which case the
+   range is open-ended.  Otherwise return false.  */
 
 static inline bool
-var_can_have_subvars (const_tree v)
-{
-  /* Volatile variables should never have subvars.  */
-  if (TREE_THIS_VOLATILE (v))
-    return false;
-
-  /* Non decls or memory tags can never have subvars.  */
-  if (!DECL_P (v) || MTAG_P (v))
-    return false;
-
-  /* Aggregates can have subvars.  */
-  if (AGGREGATE_TYPE_P (TREE_TYPE (v)))
+ranges_overlap_p (unsigned HOST_WIDE_INT pos1,
+                 unsigned HOST_WIDE_INT size1,
+                 unsigned HOST_WIDE_INT pos2,
+                 unsigned HOST_WIDE_INT size2)
+{
+  if (pos1 >= pos2
+      && (size2 == (unsigned HOST_WIDE_INT)-1
+         || pos1 < (pos2 + size2)))
     return true;
-
-  /* Complex types variables which are not also a gimple register can
-    have subvars. */
-  if (TREE_CODE (TREE_TYPE (v)) == COMPLEX_TYPE
-      && !DECL_GIMPLE_REG_P (v))
+  if (pos2 >= pos1
+      && (size1 == (unsigned HOST_WIDE_INT)-1
+         || pos2 < (pos1 + size1)))
     return true;
 
   return false;
 }
 
-  
-/* Return true if OFFSET and SIZE define a range that overlaps with some
-   portion of the range of SV, a subvar.  If there was an exact overlap,
-   *EXACT will be set to true upon return. */
-
-static inline bool
-overlap_subvar (unsigned HOST_WIDE_INT offset, unsigned HOST_WIDE_INT size,
-               const_tree sv,  bool *exact)
-{
-  /* There are three possible cases of overlap.
-     1. We can have an exact overlap, like so:   
-     |offset, offset + size             |
-     |sv->offset, sv->offset + sv->size |
-     
-     2. We can have offset starting after sv->offset, like so:
-     
-           |offset, offset + size              |
-     |sv->offset, sv->offset + sv->size  |
-
-     3. We can have offset starting before sv->offset, like so:
-     
-     |offset, offset + size    |
-       |sv->offset, sv->offset + sv->size|
-  */
-
-  if (exact)
-    *exact = false;
-  if (offset == SFT_OFFSET (sv) && size == SFT_SIZE (sv))
-    {
-      if (exact)
-       *exact = true;
-      return true;
-    }
-  else if (offset >= SFT_OFFSET (sv) 
-          && offset < (SFT_OFFSET (sv) + SFT_SIZE (sv)))
-    {
-      return true;
-    }
-  else if (offset < SFT_OFFSET (sv) 
-          && (size > SFT_OFFSET (sv) - offset))
-    {
-      return true;
-    }
-  return false;
-
-}
-
 /* Return the memory tag associated with symbol SYM.  */
 
 static inline tree
@@ -1831,4 +1692,31 @@ gimple_mem_ref_stats (const struct function *fn)
 {
   return &fn->gimple_df->mem_ref_stats;
 }
+
+/* Given an edge_var_map V, return the PHI arg definition.  */
+
+static inline tree
+redirect_edge_var_map_def (edge_var_map *v)
+{
+  return v->def;
+}
+
+/* Given an edge_var_map V, return the PHI result.  */
+
+static inline tree
+redirect_edge_var_map_result (edge_var_map *v)
+{
+  return v->result;
+}
+
+
+/* Return an SSA_NAME node for variable VAR defined in statement STMT
+   in function cfun.  */
+
+static inline tree
+make_ssa_name (tree var, tree stmt)
+{
+  return make_ssa_name_fn (cfun, var, stmt);
+}
+
 #endif /* _TREE_FLOW_INLINE_H  */