Home | History | Annotate | Download | only in include
      1 /* Inline functions for tree-flow.h
      2    Copyright (C) 2001-2013 Free Software Foundation, Inc.
      3    Contributed by Diego Novillo <dnovillo (at) redhat.com>
      4 
      5 This file is part of GCC.
      6 
      7 GCC is free software; you can redistribute it and/or modify
      8 it under the terms of the GNU General Public License as published by
      9 the Free Software Foundation; either version 3, or (at your option)
     10 any later version.
     11 
     12 GCC is distributed in the hope that it will be useful,
     13 but WITHOUT ANY WARRANTY; without even the implied warranty of
     14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15 GNU General Public License for more details.
     16 
     17 You should have received a copy of the GNU General Public License
     18 along with GCC; see the file COPYING3.  If not see
     19 <http://www.gnu.org/licenses/>.  */
     20 
     21 #ifndef _TREE_FLOW_INLINE_H
     22 #define _TREE_FLOW_INLINE_H 1
     23 
     24 /* Inline functions for manipulating various data structures defined in
     25    tree-flow.h.  See tree-flow.h for documentation.  */
     26 
     27 /* Return true when gimple SSA form was built.
     28    gimple_in_ssa_p is queried by gimplifier in various early stages before SSA
     29    infrastructure is initialized.  Check for presence of the datastructures
     30    at first place.  */
     31 static inline bool
     32 gimple_in_ssa_p (const struct function *fun)
     33 {
     34   return fun && fun->gimple_df && fun->gimple_df->in_ssa_p;
     35 }
     36 
     37 /* Artificial variable used for the virtual operand FUD chain.  */
     38 static inline tree
     39 gimple_vop (const struct function *fun)
     40 {
     41   gcc_checking_assert (fun && fun->gimple_df);
     42   return fun->gimple_df->vop;
     43 }
     44 
     45 /* Initialize the hashtable iterator HTI to point to hashtable TABLE */
     46 
     47 static inline void *
     48 first_htab_element (htab_iterator *hti, htab_t table)
     49 {
     50   hti->htab = table;
     51   hti->slot = table->entries;
     52   hti->limit = hti->slot + htab_size (table);
     53   do
     54     {
     55       PTR x = *(hti->slot);
     56       if (x != HTAB_EMPTY_ENTRY && x != HTAB_DELETED_ENTRY)
     57 	break;
     58     } while (++(hti->slot) < hti->limit);
     59 
     60   if (hti->slot < hti->limit)
     61     return *(hti->slot);
     62   return NULL;
     63 }
     64 
     65 /* Return current non-empty/deleted slot of the hashtable pointed to by HTI,
     66    or NULL if we have  reached the end.  */
     67 
     68 static inline bool
     69 end_htab_p (const htab_iterator *hti)
     70 {
     71   if (hti->slot >= hti->limit)
     72     return true;
     73   return false;
     74 }
     75 
     76 /* Advance the hashtable iterator pointed to by HTI to the next element of the
     77    hashtable.  */
     78 
     79 static inline void *
     80 next_htab_element (htab_iterator *hti)
     81 {
     82   while (++(hti->slot) < hti->limit)
     83     {
     84       PTR x = *(hti->slot);
     85       if (x != HTAB_EMPTY_ENTRY && x != HTAB_DELETED_ENTRY)
     86 	return x;
     87     };
     88   return NULL;
     89 }
     90 
     91 /* Get the number of the next statement uid to be allocated.  */
     92 static inline unsigned int
     93 gimple_stmt_max_uid (struct function *fn)
     94 {
     95   return fn->last_stmt_uid;
     96 }
     97 
     98 /* Set the number of the next statement uid to be allocated.  */
     99 static inline void
    100 set_gimple_stmt_max_uid (struct function *fn, unsigned int maxid)
    101 {
    102   fn->last_stmt_uid = maxid;
    103 }
    104 
    105 /* Set the number of the next statement uid to be allocated.  */
    106 static inline unsigned int
    107 inc_gimple_stmt_max_uid (struct function *fn)
    108 {
    109   return fn->last_stmt_uid++;
    110 }
    111 
    112 /* Return the line number for EXPR, or return -1 if we have no line
    113    number information for it.  */
    114 static inline int
    115 get_lineno (const_gimple stmt)
    116 {
    117   location_t loc;
    118 
    119   if (!stmt)
    120     return -1;
    121 
    122   loc = gimple_location (stmt);
    123   if (loc == UNKNOWN_LOCATION)
    124     return -1;
    125 
    126   return LOCATION_LINE (loc);
    127 }
    128 
    129 /* Delink an immediate_uses node from its chain.  */
    130 static inline void
    131 delink_imm_use (ssa_use_operand_t *linknode)
    132 {
    133   /* Return if this node is not in a list.  */
    134   if (linknode->prev == NULL)
    135     return;
    136 
    137   linknode->prev->next = linknode->next;
    138   linknode->next->prev = linknode->prev;
    139   linknode->prev = NULL;
    140   linknode->next = NULL;
    141 }
    142 
    143 /* Link ssa_imm_use node LINKNODE into the chain for LIST.  */
    144 static inline void
    145 link_imm_use_to_list (ssa_use_operand_t *linknode, ssa_use_operand_t *list)
    146 {
    147   /* Link the new node at the head of the list.  If we are in the process of
    148      traversing the list, we won't visit any new nodes added to it.  */
    149   linknode->prev = list;
    150   linknode->next = list->next;
    151   list->next->prev = linknode;
    152   list->next = linknode;
    153 }
    154 
    155 /* Link ssa_imm_use node LINKNODE into the chain for DEF.  */
    156 static inline void
    157 link_imm_use (ssa_use_operand_t *linknode, tree def)
    158 {
    159   ssa_use_operand_t *root;
    160 
    161   if (!def || TREE_CODE (def) != SSA_NAME)
    162     linknode->prev = NULL;
    163   else
    164     {
    165       root = &(SSA_NAME_IMM_USE_NODE (def));
    166       if (linknode->use)
    167         gcc_checking_assert (*(linknode->use) == def);
    168       link_imm_use_to_list (linknode, root);
    169     }
    170 }
    171 
    172 /* Set the value of a use pointed to by USE to VAL.  */
    173 static inline void
    174 set_ssa_use_from_ptr (use_operand_p use, tree val)
    175 {
    176   delink_imm_use (use);
    177   *(use->use) = val;
    178   link_imm_use (use, val);
    179 }
    180 
    181 /* Link ssa_imm_use node LINKNODE into the chain for DEF, with use occurring
    182    in STMT.  */
    183 static inline void
    184 link_imm_use_stmt (ssa_use_operand_t *linknode, tree def, gimple stmt)
    185 {
    186   if (stmt)
    187     link_imm_use (linknode, def);
    188   else
    189     link_imm_use (linknode, NULL);
    190   linknode->loc.stmt = stmt;
    191 }
    192 
    193 /* Relink a new node in place of an old node in the list.  */
    194 static inline void
    195 relink_imm_use (ssa_use_operand_t *node, ssa_use_operand_t *old)
    196 {
    197   /* The node one had better be in the same list.  */
    198   gcc_checking_assert (*(old->use) == *(node->use));
    199   node->prev = old->prev;
    200   node->next = old->next;
    201   if (old->prev)
    202     {
    203       old->prev->next = node;
    204       old->next->prev = node;
    205       /* Remove the old node from the list.  */
    206       old->prev = NULL;
    207     }
    208 }
    209 
    210 /* Relink ssa_imm_use node LINKNODE into the chain for OLD, with use occurring
    211    in STMT.  */
    212 static inline void
    213 relink_imm_use_stmt (ssa_use_operand_t *linknode, ssa_use_operand_t *old,
    214 		     gimple stmt)
    215 {
    216   if (stmt)
    217     relink_imm_use (linknode, old);
    218   else
    219     link_imm_use (linknode, NULL);
    220   linknode->loc.stmt = stmt;
    221 }
    222 
    223 
    224 /* Return true is IMM has reached the end of the immediate use list.  */
    225 static inline bool
    226 end_readonly_imm_use_p (const imm_use_iterator *imm)
    227 {
    228   return (imm->imm_use == imm->end_p);
    229 }
    230 
    231 /* Initialize iterator IMM to process the list for VAR.  */
    232 static inline use_operand_p
    233 first_readonly_imm_use (imm_use_iterator *imm, tree var)
    234 {
    235   imm->end_p = &(SSA_NAME_IMM_USE_NODE (var));
    236   imm->imm_use = imm->end_p->next;
    237 #ifdef ENABLE_CHECKING
    238   imm->iter_node.next = imm->imm_use->next;
    239 #endif
    240   if (end_readonly_imm_use_p (imm))
    241     return NULL_USE_OPERAND_P;
    242   return imm->imm_use;
    243 }
    244 
    245 /* Bump IMM to the next use in the list.  */
    246 static inline use_operand_p
    247 next_readonly_imm_use (imm_use_iterator *imm)
    248 {
    249   use_operand_p old = imm->imm_use;
    250 
    251 #ifdef ENABLE_CHECKING
    252   /* If this assertion fails, it indicates the 'next' pointer has changed
    253      since the last bump.  This indicates that the list is being modified
    254      via stmt changes, or SET_USE, or somesuch thing, and you need to be
    255      using the SAFE version of the iterator.  */
    256   gcc_assert (imm->iter_node.next == old->next);
    257   imm->iter_node.next = old->next->next;
    258 #endif
    259 
    260   imm->imm_use = old->next;
    261   if (end_readonly_imm_use_p (imm))
    262     return NULL_USE_OPERAND_P;
    263   return imm->imm_use;
    264 }
    265 
    266 /* tree-cfg.c */
    267 extern bool has_zero_uses_1 (const ssa_use_operand_t *head);
    268 extern bool single_imm_use_1 (const ssa_use_operand_t *head,
    269 			      use_operand_p *use_p, gimple *stmt);
    270 
    271 /* Return true if VAR has no nondebug uses.  */
    272 static inline bool
    273 has_zero_uses (const_tree var)
    274 {
    275   const ssa_use_operand_t *const ptr = &(SSA_NAME_IMM_USE_NODE (var));
    276 
    277   /* A single use_operand means there is no items in the list.  */
    278   if (ptr == ptr->next)
    279     return true;
    280 
    281   /* If there are debug stmts, we have to look at each use and see
    282      whether there are any nondebug uses.  */
    283   if (!MAY_HAVE_DEBUG_STMTS)
    284     return false;
    285 
    286   return has_zero_uses_1 (ptr);
    287 }
    288 
    289 /* Return true if VAR has a single nondebug use.  */
    290 static inline bool
    291 has_single_use (const_tree var)
    292 {
    293   const ssa_use_operand_t *const ptr = &(SSA_NAME_IMM_USE_NODE (var));
    294 
    295   /* If there aren't any uses whatsoever, we're done.  */
    296   if (ptr == ptr->next)
    297     return false;
    298 
    299   /* If there's a single use, check that it's not a debug stmt.  */
    300   if (ptr == ptr->next->next)
    301     return !is_gimple_debug (USE_STMT (ptr->next));
    302 
    303   /* If there are debug stmts, we have to look at each of them.  */
    304   if (!MAY_HAVE_DEBUG_STMTS)
    305     return false;
    306 
    307   return single_imm_use_1 (ptr, NULL, NULL);
    308 }
    309 
    310 
    311 /* If VAR has only a single immediate nondebug use, return true, and
    312    set USE_P and STMT to the use pointer and stmt of occurrence.  */
    313 static inline bool
    314 single_imm_use (const_tree var, use_operand_p *use_p, gimple *stmt)
    315 {
    316   const ssa_use_operand_t *const ptr = &(SSA_NAME_IMM_USE_NODE (var));
    317 
    318   /* If there aren't any uses whatsoever, we're done.  */
    319   if (ptr == ptr->next)
    320     {
    321     return_false:
    322       *use_p = NULL_USE_OPERAND_P;
    323       *stmt = NULL;
    324       return false;
    325     }
    326 
    327   /* If there's a single use, check that it's not a debug stmt.  */
    328   if (ptr == ptr->next->next)
    329     {
    330       if (!is_gimple_debug (USE_STMT (ptr->next)))
    331 	{
    332 	  *use_p = ptr->next;
    333 	  *stmt = ptr->next->loc.stmt;
    334 	  return true;
    335 	}
    336       else
    337 	goto return_false;
    338     }
    339 
    340   /* If there are debug stmts, we have to look at each of them.  */
    341   if (!MAY_HAVE_DEBUG_STMTS)
    342     goto return_false;
    343 
    344   return single_imm_use_1 (ptr, use_p, stmt);
    345 }
    346 
    347 /* Return the number of nondebug immediate uses of VAR.  */
    348 static inline unsigned int
    349 num_imm_uses (const_tree var)
    350 {
    351   const ssa_use_operand_t *const start = &(SSA_NAME_IMM_USE_NODE (var));
    352   const ssa_use_operand_t *ptr;
    353   unsigned int num = 0;
    354 
    355   if (!MAY_HAVE_DEBUG_STMTS)
    356     for (ptr = start->next; ptr != start; ptr = ptr->next)
    357       num++;
    358   else
    359     for (ptr = start->next; ptr != start; ptr = ptr->next)
    360       if (!is_gimple_debug (USE_STMT (ptr)))
    361 	num++;
    362 
    363   return num;
    364 }
    365 
    366 /* Return the tree pointed-to by USE.  */
    367 static inline tree
    368 get_use_from_ptr (use_operand_p use)
    369 {
    370   return *(use->use);
    371 }
    372 
    373 /* Return the tree pointed-to by DEF.  */
    374 static inline tree
    375 get_def_from_ptr (def_operand_p def)
    376 {
    377   return *def;
    378 }
    379 
    380 /* Return a use_operand_p pointer for argument I of PHI node GS.  */
    381 
    382 static inline use_operand_p
    383 gimple_phi_arg_imm_use_ptr (gimple gs, int i)
    384 {
    385   return &gimple_phi_arg (gs, i)->imm_use;
    386 }
    387 
    388 /* Return the tree operand for argument I of PHI node GS.  */
    389 
    390 static inline tree
    391 gimple_phi_arg_def (gimple gs, size_t index)
    392 {
    393   struct phi_arg_d *pd = gimple_phi_arg (gs, index);
    394   return get_use_from_ptr (&pd->imm_use);
    395 }
    396 
    397 /* Return a pointer to the tree operand for argument I of PHI node GS.  */
    398 
    399 static inline tree *
    400 gimple_phi_arg_def_ptr (gimple gs, size_t index)
    401 {
    402   return &gimple_phi_arg (gs, index)->def;
    403 }
    404 
    405 /* Return the edge associated with argument I of phi node GS.  */
    406 
    407 static inline edge
    408 gimple_phi_arg_edge (gimple gs, size_t i)
    409 {
    410   return EDGE_PRED (gimple_bb (gs), i);
    411 }
    412 
    413 /* Return the source location of gimple argument I of phi node GS.  */
    414 
    415 static inline source_location
    416 gimple_phi_arg_location (gimple gs, size_t i)
    417 {
    418   return gimple_phi_arg (gs, i)->locus;
    419 }
    420 
    421 /* Return the source location of the argument on edge E of phi node GS.  */
    422 
    423 static inline source_location
    424 gimple_phi_arg_location_from_edge (gimple gs, edge e)
    425 {
    426   return gimple_phi_arg (gs, e->dest_idx)->locus;
    427 }
    428 
    429 /* Set the source location of gimple argument I of phi node GS to LOC.  */
    430 
    431 static inline void
    432 gimple_phi_arg_set_location (gimple gs, size_t i, source_location loc)
    433 {
    434   gimple_phi_arg (gs, i)->locus = loc;
    435 }
    436 
    437 /* Return TRUE if argument I of phi node GS has a location record.  */
    438 
    439 static inline bool
    440 gimple_phi_arg_has_location (gimple gs, size_t i)
    441 {
    442   return gimple_phi_arg_location (gs, i) != UNKNOWN_LOCATION;
    443 }
    444 
    445 
    446 /* Return the PHI nodes for basic block BB, or NULL if there are no
    447    PHI nodes.  */
    448 static inline gimple_seq
    449 phi_nodes (const_basic_block bb)
    450 {
    451   gcc_checking_assert (!(bb->flags & BB_RTL));
    452   return bb->il.gimple.phi_nodes;
    453 }
    454 
    455 static inline gimple_seq *
    456 phi_nodes_ptr (basic_block bb)
    457 {
    458   gcc_checking_assert (!(bb->flags & BB_RTL));
    459   return &bb->il.gimple.phi_nodes;
    460 }
    461 
    462 /* Set PHI nodes of a basic block BB to SEQ.  */
    463 
    464 static inline void
    465 set_phi_nodes (basic_block bb, gimple_seq seq)
    466 {
    467   gimple_stmt_iterator i;
    468 
    469   gcc_checking_assert (!(bb->flags & BB_RTL));
    470   bb->il.gimple.phi_nodes = seq;
    471   if (seq)
    472     for (i = gsi_start (seq); !gsi_end_p (i); gsi_next (&i))
    473       gimple_set_bb (gsi_stmt (i), bb);
    474 }
    475 
    476 /* Return the phi argument which contains the specified use.  */
    477 
    478 static inline int
    479 phi_arg_index_from_use (use_operand_p use)
    480 {
    481   struct phi_arg_d *element, *root;
    482   size_t index;
    483   gimple phi;
    484 
    485   /* Since the use is the first thing in a PHI argument element, we can
    486      calculate its index based on casting it to an argument, and performing
    487      pointer arithmetic.  */
    488 
    489   phi = USE_STMT (use);
    490 
    491   element = (struct phi_arg_d *)use;
    492   root = gimple_phi_arg (phi, 0);
    493   index = element - root;
    494 
    495   /* Make sure the calculation doesn't have any leftover bytes.  If it does,
    496      then imm_use is likely not the first element in phi_arg_d.  */
    497   gcc_checking_assert ((((char *)element - (char *)root)
    498 			% sizeof (struct phi_arg_d)) == 0
    499 		       && index < gimple_phi_capacity (phi));
    500 
    501  return index;
    502 }
    503 
    504 /* Return true if T (assumed to be a DECL) is a global variable.
    505    A variable is considered global if its storage is not automatic.  */
    506 
    507 static inline bool
    508 is_global_var (const_tree t)
    509 {
    510   return (TREE_STATIC (t) || DECL_EXTERNAL (t));
    511 }
    512 
    513 
    514 /* Return true if VAR may be aliased.  A variable is considered as
    515    maybe aliased if it has its address taken by the local TU
    516    or possibly by another TU and might be modified through a pointer.  */
    517 
    518 static inline bool
    519 may_be_aliased (const_tree var)
    520 {
    521   return (TREE_CODE (var) != CONST_DECL
    522 	  && !((TREE_STATIC (var) || TREE_PUBLIC (var) || DECL_EXTERNAL (var))
    523 	       && TREE_READONLY (var)
    524 	       && !TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (var)))
    525 	  && (TREE_PUBLIC (var)
    526 	      || DECL_EXTERNAL (var)
    527 	      || TREE_ADDRESSABLE (var)));
    528 }
    529 
    530 
    531 /* PHI nodes should contain only ssa_names and invariants.  A test
    532    for ssa_name is definitely simpler; don't let invalid contents
    533    slip in in the meantime.  */
    534 
    535 static inline bool
    536 phi_ssa_name_p (const_tree t)
    537 {
    538   if (TREE_CODE (t) == SSA_NAME)
    539     return true;
    540   gcc_checking_assert (is_gimple_min_invariant (t));
    541   return false;
    542 }
    543 
    544 
    545 /* Returns the loop of the statement STMT.  */
    546 
    547 static inline struct loop *
    548 loop_containing_stmt (gimple stmt)
    549 {
    550   basic_block bb = gimple_bb (stmt);
    551   if (!bb)
    552     return NULL;
    553 
    554   return bb->loop_father;
    555 }
    556 
    557 
    558 /*  -----------------------------------------------------------------------  */
    559 
    560 /* The following set of routines are used to iterator over various type of
    561    SSA operands.  */
    562 
    563 /* Return true if PTR is finished iterating.  */
    564 static inline bool
    565 op_iter_done (const ssa_op_iter *ptr)
    566 {
    567   return ptr->done;
    568 }
    569 
    570 /* Get the next iterator use value for PTR.  */
    571 static inline use_operand_p
    572 op_iter_next_use (ssa_op_iter *ptr)
    573 {
    574   use_operand_p use_p;
    575   gcc_checking_assert (ptr->iter_type == ssa_op_iter_use);
    576   if (ptr->uses)
    577     {
    578       use_p = USE_OP_PTR (ptr->uses);
    579       ptr->uses = ptr->uses->next;
    580       return use_p;
    581     }
    582   if (ptr->i < ptr->numops)
    583     {
    584       return PHI_ARG_DEF_PTR (ptr->stmt, (ptr->i)++);
    585     }
    586   ptr->done = true;
    587   return NULL_USE_OPERAND_P;
    588 }
    589 
    590 /* Get the next iterator def value for PTR.  */
    591 static inline def_operand_p
    592 op_iter_next_def (ssa_op_iter *ptr)
    593 {
    594   gcc_checking_assert (ptr->iter_type == ssa_op_iter_def);
    595   if (ptr->flags & SSA_OP_VDEF)
    596     {
    597       tree *p;
    598       ptr->flags &= ~SSA_OP_VDEF;
    599       p = gimple_vdef_ptr (ptr->stmt);
    600       if (p && *p)
    601 	return p;
    602     }
    603   if (ptr->flags & SSA_OP_DEF)
    604     {
    605       while (ptr->i < ptr->numops)
    606 	{
    607 	  tree *val = gimple_op_ptr (ptr->stmt, ptr->i);
    608 	  ptr->i++;
    609 	  if (*val)
    610 	    {
    611 	      if (TREE_CODE (*val) == TREE_LIST)
    612 		val = &TREE_VALUE (*val);
    613 	      if (TREE_CODE (*val) == SSA_NAME
    614 		  || is_gimple_reg (*val))
    615 		return val;
    616 	    }
    617 	}
    618       ptr->flags &= ~SSA_OP_DEF;
    619     }
    620 
    621   ptr->done = true;
    622   return NULL_DEF_OPERAND_P;
    623 }
    624 
    625 /* Get the next iterator tree value for PTR.  */
    626 static inline tree
    627 op_iter_next_tree (ssa_op_iter *ptr)
    628 {
    629   tree val;
    630   gcc_checking_assert (ptr->iter_type == ssa_op_iter_tree);
    631   if (ptr->uses)
    632     {
    633       val = USE_OP (ptr->uses);
    634       ptr->uses = ptr->uses->next;
    635       return val;
    636     }
    637   if (ptr->flags & SSA_OP_VDEF)
    638     {
    639       ptr->flags &= ~SSA_OP_VDEF;
    640       if ((val = gimple_vdef (ptr->stmt)))
    641 	return val;
    642     }
    643   if (ptr->flags & SSA_OP_DEF)
    644     {
    645       while (ptr->i < ptr->numops)
    646 	{
    647 	  val = gimple_op (ptr->stmt, ptr->i);
    648 	  ptr->i++;
    649 	  if (val)
    650 	    {
    651 	      if (TREE_CODE (val) == TREE_LIST)
    652 		val = TREE_VALUE (val);
    653 	      if (TREE_CODE (val) == SSA_NAME
    654 		  || is_gimple_reg (val))
    655 		return val;
    656 	    }
    657 	}
    658       ptr->flags &= ~SSA_OP_DEF;
    659     }
    660 
    661   ptr->done = true;
    662   return NULL_TREE;
    663 }
    664 
    665 
    666 /* This functions clears the iterator PTR, and marks it done.  This is normally
    667    used to prevent warnings in the compile about might be uninitialized
    668    components.  */
    669 
    670 static inline void
    671 clear_and_done_ssa_iter (ssa_op_iter *ptr)
    672 {
    673   ptr->i = 0;
    674   ptr->numops = 0;
    675   ptr->uses = NULL;
    676   ptr->iter_type = ssa_op_iter_none;
    677   ptr->stmt = NULL;
    678   ptr->done = true;
    679   ptr->flags = 0;
    680 }
    681 
    682 /* Initialize the iterator PTR to the virtual defs in STMT.  */
    683 static inline void
    684 op_iter_init (ssa_op_iter *ptr, gimple stmt, int flags)
    685 {
    686   /* PHI nodes require a different iterator initialization path.  We
    687      do not support iterating over virtual defs or uses without
    688      iterating over defs or uses at the same time.  */
    689   gcc_checking_assert (gimple_code (stmt) != GIMPLE_PHI
    690 		       && (!(flags & SSA_OP_VDEF) || (flags & SSA_OP_DEF))
    691 		       && (!(flags & SSA_OP_VUSE) || (flags & SSA_OP_USE)));
    692   ptr->numops = 0;
    693   if (flags & (SSA_OP_DEF | SSA_OP_VDEF))
    694     {
    695       switch (gimple_code (stmt))
    696 	{
    697 	  case GIMPLE_ASSIGN:
    698 	  case GIMPLE_CALL:
    699 	    ptr->numops = 1;
    700 	    break;
    701 	  case GIMPLE_ASM:
    702 	    ptr->numops = gimple_asm_noutputs (stmt);
    703 	    break;
    704 	  default:
    705 	    ptr->numops = 0;
    706 	    flags &= ~(SSA_OP_DEF | SSA_OP_VDEF);
    707 	    break;
    708 	}
    709     }
    710   ptr->uses = (flags & (SSA_OP_USE|SSA_OP_VUSE)) ? gimple_use_ops (stmt) : NULL;
    711   if (!(flags & SSA_OP_VUSE)
    712       && ptr->uses
    713       && gimple_vuse (stmt) != NULL_TREE)
    714     ptr->uses = ptr->uses->next;
    715   ptr->done = false;
    716   ptr->i = 0;
    717 
    718   ptr->stmt = stmt;
    719   ptr->flags = flags;
    720 }
    721 
    722 /* Initialize iterator PTR to the use operands in STMT based on FLAGS. Return
    723    the first use.  */
    724 static inline use_operand_p
    725 op_iter_init_use (ssa_op_iter *ptr, gimple stmt, int flags)
    726 {
    727   gcc_checking_assert ((flags & SSA_OP_ALL_DEFS) == 0
    728 		       && (flags & SSA_OP_USE));
    729   op_iter_init (ptr, stmt, flags);
    730   ptr->iter_type = ssa_op_iter_use;
    731   return op_iter_next_use (ptr);
    732 }
    733 
    734 /* Initialize iterator PTR to the def operands in STMT based on FLAGS. Return
    735    the first def.  */
    736 static inline def_operand_p
    737 op_iter_init_def (ssa_op_iter *ptr, gimple stmt, int flags)
    738 {
    739   gcc_checking_assert ((flags & SSA_OP_ALL_USES) == 0
    740 		       && (flags & SSA_OP_DEF));
    741   op_iter_init (ptr, stmt, flags);
    742   ptr->iter_type = ssa_op_iter_def;
    743   return op_iter_next_def (ptr);
    744 }
    745 
    746 /* Initialize iterator PTR to the operands in STMT based on FLAGS. Return
    747    the first operand as a tree.  */
    748 static inline tree
    749 op_iter_init_tree (ssa_op_iter *ptr, gimple stmt, int flags)
    750 {
    751   op_iter_init (ptr, stmt, flags);
    752   ptr->iter_type = ssa_op_iter_tree;
    753   return op_iter_next_tree (ptr);
    754 }
    755 
    756 
    757 /* If there is a single operand in STMT matching FLAGS, return it.  Otherwise
    758    return NULL.  */
    759 static inline tree
    760 single_ssa_tree_operand (gimple stmt, int flags)
    761 {
    762   tree var;
    763   ssa_op_iter iter;
    764 
    765   var = op_iter_init_tree (&iter, stmt, flags);
    766   if (op_iter_done (&iter))
    767     return NULL_TREE;
    768   op_iter_next_tree (&iter);
    769   if (op_iter_done (&iter))
    770     return var;
    771   return NULL_TREE;
    772 }
    773 
    774 
    775 /* If there is a single operand in STMT matching FLAGS, return it.  Otherwise
    776    return NULL.  */
    777 static inline use_operand_p
    778 single_ssa_use_operand (gimple stmt, int flags)
    779 {
    780   use_operand_p var;
    781   ssa_op_iter iter;
    782 
    783   var = op_iter_init_use (&iter, stmt, flags);
    784   if (op_iter_done (&iter))
    785     return NULL_USE_OPERAND_P;
    786   op_iter_next_use (&iter);
    787   if (op_iter_done (&iter))
    788     return var;
    789   return NULL_USE_OPERAND_P;
    790 }
    791 
    792 
    793 
    794 /* If there is a single operand in STMT matching FLAGS, return it.  Otherwise
    795    return NULL.  */
    796 static inline def_operand_p
    797 single_ssa_def_operand (gimple stmt, int flags)
    798 {
    799   def_operand_p var;
    800   ssa_op_iter iter;
    801 
    802   var = op_iter_init_def (&iter, stmt, flags);
    803   if (op_iter_done (&iter))
    804     return NULL_DEF_OPERAND_P;
    805   op_iter_next_def (&iter);
    806   if (op_iter_done (&iter))
    807     return var;
    808   return NULL_DEF_OPERAND_P;
    809 }
    810 
    811 
    812 /* Return true if there are zero operands in STMT matching the type
    813    given in FLAGS.  */
    814 static inline bool
    815 zero_ssa_operands (gimple stmt, int flags)
    816 {
    817   ssa_op_iter iter;
    818 
    819   op_iter_init_tree (&iter, stmt, flags);
    820   return op_iter_done (&iter);
    821 }
    822 
    823 
    824 /* Return the number of operands matching FLAGS in STMT.  */
    825 static inline int
    826 num_ssa_operands (gimple stmt, int flags)
    827 {
    828   ssa_op_iter iter;
    829   tree t;
    830   int num = 0;
    831 
    832   gcc_checking_assert (gimple_code (stmt) != GIMPLE_PHI);
    833   FOR_EACH_SSA_TREE_OPERAND (t, stmt, iter, flags)
    834     num++;
    835   return num;
    836 }
    837 
    838 static inline use_operand_p
    839 op_iter_init_phiuse (ssa_op_iter *ptr, gimple phi, int flags);
    840 
    841 /* Delink all immediate_use information for STMT.  */
    842 static inline void
    843 delink_stmt_imm_use (gimple stmt)
    844 {
    845    ssa_op_iter iter;
    846    use_operand_p use_p;
    847 
    848    if (ssa_operands_active (cfun))
    849      FOR_EACH_PHI_OR_STMT_USE (use_p, stmt, iter, SSA_OP_ALL_USES)
    850        delink_imm_use (use_p);
    851 }
    852 
    853 
    854 /* If there is a single DEF in the PHI node which matches FLAG, return it.
    855    Otherwise return NULL_DEF_OPERAND_P.  */
    856 static inline tree
    857 single_phi_def (gimple stmt, int flags)
    858 {
    859   tree def = PHI_RESULT (stmt);
    860   if ((flags & SSA_OP_DEF) && is_gimple_reg (def))
    861     return def;
    862   if ((flags & SSA_OP_VIRTUAL_DEFS) && !is_gimple_reg (def))
    863     return def;
    864   return NULL_TREE;
    865 }
    866 
    867 /* Initialize the iterator PTR for uses matching FLAGS in PHI.  FLAGS should
    868    be either SSA_OP_USES or SSA_OP_VIRTUAL_USES.  */
    869 static inline use_operand_p
    870 op_iter_init_phiuse (ssa_op_iter *ptr, gimple phi, int flags)
    871 {
    872   tree phi_def = gimple_phi_result (phi);
    873   int comp;
    874 
    875   clear_and_done_ssa_iter (ptr);
    876   ptr->done = false;
    877 
    878   gcc_checking_assert ((flags & (SSA_OP_USE | SSA_OP_VIRTUAL_USES)) != 0);
    879 
    880   comp = (is_gimple_reg (phi_def) ? SSA_OP_USE : SSA_OP_VIRTUAL_USES);
    881 
    882   /* If the PHI node doesn't the operand type we care about, we're done.  */
    883   if ((flags & comp) == 0)
    884     {
    885       ptr->done = true;
    886       return NULL_USE_OPERAND_P;
    887     }
    888 
    889   ptr->stmt = phi;
    890   ptr->numops = gimple_phi_num_args (phi);
    891   ptr->iter_type = ssa_op_iter_use;
    892   ptr->flags = flags;
    893   return op_iter_next_use (ptr);
    894 }
    895 
    896 
    897 /* Start an iterator for a PHI definition.  */
    898 
    899 static inline def_operand_p
    900 op_iter_init_phidef (ssa_op_iter *ptr, gimple phi, int flags)
    901 {
    902   tree phi_def = PHI_RESULT (phi);
    903   int comp;
    904 
    905   clear_and_done_ssa_iter (ptr);
    906   ptr->done = false;
    907 
    908   gcc_checking_assert ((flags & (SSA_OP_DEF | SSA_OP_VIRTUAL_DEFS)) != 0);
    909 
    910   comp = (is_gimple_reg (phi_def) ? SSA_OP_DEF : SSA_OP_VIRTUAL_DEFS);
    911 
    912   /* If the PHI node doesn't have the operand type we care about,
    913      we're done.  */
    914   if ((flags & comp) == 0)
    915     {
    916       ptr->done = true;
    917       return NULL_DEF_OPERAND_P;
    918     }
    919 
    920   ptr->iter_type = ssa_op_iter_def;
    921   /* The first call to op_iter_next_def will terminate the iterator since
    922      all the fields are NULL.  Simply return the result here as the first and
    923      therefore only result.  */
    924   return PHI_RESULT_PTR (phi);
    925 }
    926 
    927 /* Return true is IMM has reached the end of the immediate use stmt list.  */
    928 
    929 static inline bool
    930 end_imm_use_stmt_p (const imm_use_iterator *imm)
    931 {
    932   return (imm->imm_use == imm->end_p);
    933 }
    934 
    935 /* Finished the traverse of an immediate use stmt list IMM by removing the
    936    placeholder node from the list.  */
    937 
    938 static inline void
    939 end_imm_use_stmt_traverse (imm_use_iterator *imm)
    940 {
    941   delink_imm_use (&(imm->iter_node));
    942 }
    943 
    944 /* Immediate use traversal of uses within a stmt require that all the
    945    uses on a stmt be sequentially listed.  This routine is used to build up
    946    this sequential list by adding USE_P to the end of the current list
    947    currently delimited by HEAD and LAST_P.  The new LAST_P value is
    948    returned.  */
    949 
    950 static inline use_operand_p
    951 move_use_after_head (use_operand_p use_p, use_operand_p head,
    952 		      use_operand_p last_p)
    953 {
    954   gcc_checking_assert (USE_FROM_PTR (use_p) == USE_FROM_PTR (head));
    955   /* Skip head when we find it.  */
    956   if (use_p != head)
    957     {
    958       /* If use_p is already linked in after last_p, continue.  */
    959       if (last_p->next == use_p)
    960 	last_p = use_p;
    961       else
    962 	{
    963 	  /* Delink from current location, and link in at last_p.  */
    964 	  delink_imm_use (use_p);
    965 	  link_imm_use_to_list (use_p, last_p);
    966 	  last_p = use_p;
    967 	}
    968     }
    969   return last_p;
    970 }
    971 
    972 
    973 /* This routine will relink all uses with the same stmt as HEAD into the list
    974    immediately following HEAD for iterator IMM.  */
    975 
    976 static inline void
    977 link_use_stmts_after (use_operand_p head, imm_use_iterator *imm)
    978 {
    979   use_operand_p use_p;
    980   use_operand_p last_p = head;
    981   gimple head_stmt = USE_STMT (head);
    982   tree use = USE_FROM_PTR (head);
    983   ssa_op_iter op_iter;
    984   int flag;
    985 
    986   /* Only look at virtual or real uses, depending on the type of HEAD.  */
    987   flag = (is_gimple_reg (use) ? SSA_OP_USE : SSA_OP_VIRTUAL_USES);
    988 
    989   if (gimple_code (head_stmt) == GIMPLE_PHI)
    990     {
    991       FOR_EACH_PHI_ARG (use_p, head_stmt, op_iter, flag)
    992 	if (USE_FROM_PTR (use_p) == use)
    993 	  last_p = move_use_after_head (use_p, head, last_p);
    994     }
    995   else
    996     {
    997       if (flag == SSA_OP_USE)
    998 	{
    999 	  FOR_EACH_SSA_USE_OPERAND (use_p, head_stmt, op_iter, flag)
   1000 	    if (USE_FROM_PTR (use_p) == use)
   1001 	      last_p = move_use_after_head (use_p, head, last_p);
   1002 	}
   1003       else if ((use_p = gimple_vuse_op (head_stmt)) != NULL_USE_OPERAND_P)
   1004 	{
   1005 	  if (USE_FROM_PTR (use_p) == use)
   1006 	    last_p = move_use_after_head (use_p, head, last_p);
   1007 	}
   1008     }
   1009   /* Link iter node in after last_p.  */
   1010   if (imm->iter_node.prev != NULL)
   1011     delink_imm_use (&imm->iter_node);
   1012   link_imm_use_to_list (&(imm->iter_node), last_p);
   1013 }
   1014 
   1015 /* Initialize IMM to traverse over uses of VAR.  Return the first statement.  */
   1016 static inline gimple
   1017 first_imm_use_stmt (imm_use_iterator *imm, tree var)
   1018 {
   1019   imm->end_p = &(SSA_NAME_IMM_USE_NODE (var));
   1020   imm->imm_use = imm->end_p->next;
   1021   imm->next_imm_name = NULL_USE_OPERAND_P;
   1022 
   1023   /* iter_node is used as a marker within the immediate use list to indicate
   1024      where the end of the current stmt's uses are.  Initialize it to NULL
   1025      stmt and use, which indicates a marker node.  */
   1026   imm->iter_node.prev = NULL_USE_OPERAND_P;
   1027   imm->iter_node.next = NULL_USE_OPERAND_P;
   1028   imm->iter_node.loc.stmt = NULL;
   1029   imm->iter_node.use = NULL;
   1030 
   1031   if (end_imm_use_stmt_p (imm))
   1032     return NULL;
   1033 
   1034   link_use_stmts_after (imm->imm_use, imm);
   1035 
   1036   return USE_STMT (imm->imm_use);
   1037 }
   1038 
   1039 /* Bump IMM to the next stmt which has a use of var.  */
   1040 
   1041 static inline gimple
   1042 next_imm_use_stmt (imm_use_iterator *imm)
   1043 {
   1044   imm->imm_use = imm->iter_node.next;
   1045   if (end_imm_use_stmt_p (imm))
   1046     {
   1047       if (imm->iter_node.prev != NULL)
   1048 	delink_imm_use (&imm->iter_node);
   1049       return NULL;
   1050     }
   1051 
   1052   link_use_stmts_after (imm->imm_use, imm);
   1053   return USE_STMT (imm->imm_use);
   1054 }
   1055 
   1056 /* This routine will return the first use on the stmt IMM currently refers
   1057    to.  */
   1058 
   1059 static inline use_operand_p
   1060 first_imm_use_on_stmt (imm_use_iterator *imm)
   1061 {
   1062   imm->next_imm_name = imm->imm_use->next;
   1063   return imm->imm_use;
   1064 }
   1065 
   1066 /*  Return TRUE if the last use on the stmt IMM refers to has been visited.  */
   1067 
   1068 static inline bool
   1069 end_imm_use_on_stmt_p (const imm_use_iterator *imm)
   1070 {
   1071   return (imm->imm_use == &(imm->iter_node));
   1072 }
   1073 
   1074 /* Bump to the next use on the stmt IMM refers to, return NULL if done.  */
   1075 
   1076 static inline use_operand_p
   1077 next_imm_use_on_stmt (imm_use_iterator *imm)
   1078 {
   1079   imm->imm_use = imm->next_imm_name;
   1080   if (end_imm_use_on_stmt_p (imm))
   1081     return NULL_USE_OPERAND_P;
   1082   else
   1083     {
   1084       imm->next_imm_name = imm->imm_use->next;
   1085       return imm->imm_use;
   1086     }
   1087 }
   1088 
   1089 /* Return true if VAR cannot be modified by the program.  */
   1090 
   1091 static inline bool
   1092 unmodifiable_var_p (const_tree var)
   1093 {
   1094   if (TREE_CODE (var) == SSA_NAME)
   1095     var = SSA_NAME_VAR (var);
   1096 
   1097   return TREE_READONLY (var) && (TREE_STATIC (var) || DECL_EXTERNAL (var));
   1098 }
   1099 
   1100 /* Return true if REF, a handled component reference, has an ARRAY_REF
   1101    somewhere in it.  */
   1102 
   1103 static inline bool
   1104 ref_contains_array_ref (const_tree ref)
   1105 {
   1106   gcc_checking_assert (handled_component_p (ref));
   1107 
   1108   do {
   1109     if (TREE_CODE (ref) == ARRAY_REF)
   1110       return true;
   1111     ref = TREE_OPERAND (ref, 0);
   1112   } while (handled_component_p (ref));
   1113 
   1114   return false;
   1115 }
   1116 
   1117 /* Return true if REF has an VIEW_CONVERT_EXPR somewhere in it.  */
   1118 
   1119 static inline bool
   1120 contains_view_convert_expr_p (const_tree ref)
   1121 {
   1122   while (handled_component_p (ref))
   1123     {
   1124       if (TREE_CODE (ref) == VIEW_CONVERT_EXPR)
   1125 	return true;
   1126       ref = TREE_OPERAND (ref, 0);
   1127     }
   1128 
   1129   return false;
   1130 }
   1131 
   1132 /* Return true, if the two ranges [POS1, SIZE1] and [POS2, SIZE2]
   1133    overlap.  SIZE1 and/or SIZE2 can be (unsigned)-1 in which case the
   1134    range is open-ended.  Otherwise return false.  */
   1135 
   1136 static inline bool
   1137 ranges_overlap_p (unsigned HOST_WIDE_INT pos1,
   1138 		  unsigned HOST_WIDE_INT size1,
   1139 		  unsigned HOST_WIDE_INT pos2,
   1140 		  unsigned HOST_WIDE_INT size2)
   1141 {
   1142   if (pos1 >= pos2
   1143       && (size2 == (unsigned HOST_WIDE_INT)-1
   1144 	  || pos1 < (pos2 + size2)))
   1145     return true;
   1146   if (pos2 >= pos1
   1147       && (size1 == (unsigned HOST_WIDE_INT)-1
   1148 	  || pos2 < (pos1 + size1)))
   1149     return true;
   1150 
   1151   return false;
   1152 }
   1153 
   1154 /* Accessor to tree-ssa-operands.c caches.  */
   1155 static inline struct ssa_operands *
   1156 gimple_ssa_operands (const struct function *fun)
   1157 {
   1158   return &fun->gimple_df->ssa_operands;
   1159 }
   1160 
   1161 /* Given an edge_var_map V, return the PHI arg definition.  */
   1162 
   1163 static inline tree
   1164 redirect_edge_var_map_def (edge_var_map *v)
   1165 {
   1166   return v->def;
   1167 }
   1168 
   1169 /* Given an edge_var_map V, return the PHI result.  */
   1170 
   1171 static inline tree
   1172 redirect_edge_var_map_result (edge_var_map *v)
   1173 {
   1174   return v->result;
   1175 }
   1176 
   1177 /* Given an edge_var_map V, return the PHI arg location.  */
   1178 
   1179 static inline source_location
   1180 redirect_edge_var_map_location (edge_var_map *v)
   1181 {
   1182   return v->locus;
   1183 }
   1184 
   1185 
   1186 /* Return an SSA_NAME node for variable VAR defined in statement STMT
   1187    in function cfun.  */
   1188 
   1189 static inline tree
   1190 make_ssa_name (tree var, gimple stmt)
   1191 {
   1192   return make_ssa_name_fn (cfun, var, stmt);
   1193 }
   1194 
   1195 /* Return an SSA_NAME node using the template SSA name NAME defined in
   1196    statement STMT in function cfun.  */
   1197 
   1198 static inline tree
   1199 copy_ssa_name (tree var, gimple stmt)
   1200 {
   1201   return copy_ssa_name_fn (cfun, var, stmt);
   1202 }
   1203 
   1204 /*  Creates a duplicate of a SSA name NAME tobe defined by statement STMT
   1205     in function cfun.  */
   1206 
   1207 static inline tree
   1208 duplicate_ssa_name (tree var, gimple stmt)
   1209 {
   1210   return duplicate_ssa_name_fn (cfun, var, stmt);
   1211 }
   1212 
   1213 /* Return an anonymous SSA_NAME node for type TYPE defined in statement STMT
   1214    in function cfun.  Arrange so that it uses NAME in dumps.  */
   1215 
   1216 static inline tree
   1217 make_temp_ssa_name (tree type, gimple stmt, const char *name)
   1218 {
   1219   tree ssa_name;
   1220   gcc_checking_assert (TYPE_P (type));
   1221   ssa_name = make_ssa_name_fn (cfun, type, stmt);
   1222   SET_SSA_NAME_VAR_OR_IDENTIFIER (ssa_name, get_identifier (name));
   1223   return ssa_name;
   1224 }
   1225 
   1226 /* Returns the base object and a constant BITS_PER_UNIT offset in *POFFSET that
   1227    denotes the starting address of the memory access EXP.
   1228    Returns NULL_TREE if the offset is not constant or any component
   1229    is not BITS_PER_UNIT-aligned.
   1230    VALUEIZE if non-NULL is used to valueize SSA names.  It should return
   1231    its argument or a constant if the argument is known to be constant.  */
   1232 /* ??? This is a static inline here to avoid the overhead of the indirect calls
   1233    to VALUEIZE.  But is this overhead really that significant?  And should we
   1234    perhaps just rely on WHOPR to specialize the function?  */
   1235 
   1236 static inline tree
   1237 get_addr_base_and_unit_offset_1 (tree exp, HOST_WIDE_INT *poffset,
   1238 				 tree (*valueize) (tree))
   1239 {
   1240   HOST_WIDE_INT byte_offset = 0;
   1241 
   1242   /* Compute cumulative byte-offset for nested component-refs and array-refs,
   1243      and find the ultimate containing object.  */
   1244   while (1)
   1245     {
   1246       switch (TREE_CODE (exp))
   1247 	{
   1248 	case BIT_FIELD_REF:
   1249 	  return NULL_TREE;
   1250 
   1251 	case COMPONENT_REF:
   1252 	  {
   1253 	    tree field = TREE_OPERAND (exp, 1);
   1254 	    tree this_offset = component_ref_field_offset (exp);
   1255 	    HOST_WIDE_INT hthis_offset;
   1256 
   1257 	    if (!this_offset
   1258 		|| TREE_CODE (this_offset) != INTEGER_CST
   1259 		|| (TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (field))
   1260 		    % BITS_PER_UNIT))
   1261 	      return NULL_TREE;
   1262 
   1263 	    hthis_offset = TREE_INT_CST_LOW (this_offset);
   1264 	    hthis_offset += (TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (field))
   1265 			     / BITS_PER_UNIT);
   1266 	    byte_offset += hthis_offset;
   1267 	  }
   1268 	  break;
   1269 
   1270 	case ARRAY_REF:
   1271 	case ARRAY_RANGE_REF:
   1272 	  {
   1273 	    tree index = TREE_OPERAND (exp, 1);
   1274 	    tree low_bound, unit_size;
   1275 
   1276 	    if (valueize
   1277 		&& TREE_CODE (index) == SSA_NAME)
   1278 	      index = (*valueize) (index);
   1279 
   1280 	    /* If the resulting bit-offset is constant, track it.  */
   1281 	    if (TREE_CODE (index) == INTEGER_CST
   1282 		&& (low_bound = array_ref_low_bound (exp),
   1283 		    TREE_CODE (low_bound) == INTEGER_CST)
   1284 		&& (unit_size = array_ref_element_size (exp),
   1285 		    TREE_CODE (unit_size) == INTEGER_CST))
   1286 	      {
   1287 		HOST_WIDE_INT hindex = TREE_INT_CST_LOW (index);
   1288 
   1289 		hindex -= TREE_INT_CST_LOW (low_bound);
   1290 		hindex *= TREE_INT_CST_LOW (unit_size);
   1291 		byte_offset += hindex;
   1292 	      }
   1293 	    else
   1294 	      return NULL_TREE;
   1295 	  }
   1296 	  break;
   1297 
   1298 	case REALPART_EXPR:
   1299 	  break;
   1300 
   1301 	case IMAGPART_EXPR:
   1302 	  byte_offset += TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (exp)));
   1303 	  break;
   1304 
   1305 	case VIEW_CONVERT_EXPR:
   1306 	  break;
   1307 
   1308 	case MEM_REF:
   1309 	  {
   1310 	    tree base = TREE_OPERAND (exp, 0);
   1311 	    if (valueize
   1312 		&& TREE_CODE (base) == SSA_NAME)
   1313 	      base = (*valueize) (base);
   1314 
   1315 	    /* Hand back the decl for MEM[&decl, off].  */
   1316 	    if (TREE_CODE (base) == ADDR_EXPR)
   1317 	      {
   1318 		if (!integer_zerop (TREE_OPERAND (exp, 1)))
   1319 		  {
   1320 		    double_int off = mem_ref_offset (exp);
   1321 		    gcc_assert (off.high == -1 || off.high == 0);
   1322 		    byte_offset += off.to_shwi ();
   1323 		  }
   1324 		exp = TREE_OPERAND (base, 0);
   1325 	      }
   1326 	    goto done;
   1327 	  }
   1328 
   1329 	case TARGET_MEM_REF:
   1330 	  {
   1331 	    tree base = TREE_OPERAND (exp, 0);
   1332 	    if (valueize
   1333 		&& TREE_CODE (base) == SSA_NAME)
   1334 	      base = (*valueize) (base);
   1335 
   1336 	    /* Hand back the decl for MEM[&decl, off].  */
   1337 	    if (TREE_CODE (base) == ADDR_EXPR)
   1338 	      {
   1339 		if (TMR_INDEX (exp) || TMR_INDEX2 (exp))
   1340 		  return NULL_TREE;
   1341 		if (!integer_zerop (TMR_OFFSET (exp)))
   1342 		  {
   1343 		    double_int off = mem_ref_offset (exp);
   1344 		    gcc_assert (off.high == -1 || off.high == 0);
   1345 		    byte_offset += off.to_shwi ();
   1346 		  }
   1347 		exp = TREE_OPERAND (base, 0);
   1348 	      }
   1349 	    goto done;
   1350 	  }
   1351 
   1352 	default:
   1353 	  goto done;
   1354 	}
   1355 
   1356       exp = TREE_OPERAND (exp, 0);
   1357     }
   1358 done:
   1359 
   1360   *poffset = byte_offset;
   1361   return exp;
   1362 }
   1363 
   1364 #endif /* _TREE_FLOW_INLINE_H  */
   1365