1  /* Routines for expanding from SSA form to RTL.
       2     Copyright (C) 2009-2023 Free Software Foundation, Inc.
       3  
       4  This file is part of GCC.
       5  
       6  GCC is free software; you can redistribute it and/or modify
       7  it under the terms of the GNU General Public License as published by
       8  the Free Software Foundation; either version 3, or (at your option)
       9  any later version.
      10  
      11  GCC is distributed in the hope that it will be useful,
      12  but WITHOUT ANY WARRANTY; without even the implied warranty of
      13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14  GNU General Public License for more details.
      15  
      16  You should have received a copy of the GNU General Public License
      17  along with GCC; see the file COPYING3.  If not see
      18  <http://www.gnu.org/licenses/>.  */
      19  
      20  
      21  #ifndef GCC_TREE_OUTOF_SSA_H
      22  #define GCC_TREE_OUTOF_SSA_H
      23  
      24  
      25  /* This structure (of which only a singleton SA exists) is used to
      26     pass around information between the outof-SSA functions, cfgexpand
      27     and expand itself.  */
      28  struct ssaexpand
      29  {
      30    /* The computed partitions of SSA names are stored here.  */
      31    var_map map;
      32  
      33    /* For an SSA name version V bit V is set iff TER decided that
      34       its definition should be forwarded.  */
      35    bitmap values;
      36  
      37    /* For a partition number I partition_to_pseudo[I] contains the
      38       RTL expression of the allocated space of it (either a MEM or
      39       a pseudos REG).  */
      40    rtx *partition_to_pseudo;
      41  
      42    /* If partition I contains an SSA name that has a default def for a
      43       parameter, bit I will be set in this bitmap.  */
      44    bitmap partitions_for_parm_default_defs;
      45  
      46    /* If partition I contains an SSA name that has an undefined value,
      47       bit I will be set in this bitmap.  */
      48    bitmap partitions_for_undefined_values;
      49  };
      50  
      51  /* This is the singleton described above.  */
      52  extern struct ssaexpand SA;
      53  
      54  /* Returns the RTX expression representing the storage of the outof-SSA
      55     partition that the SSA name EXP is a member of.  */
      56  inline rtx
      57  get_rtx_for_ssa_name (tree exp)
      58  {
      59    int p = partition_find (SA.map->var_partition, SSA_NAME_VERSION (exp));
      60    if (SA.map->partition_to_view)
      61      p = SA.map->partition_to_view[p];
      62    gcc_assert (p != NO_PARTITION);
      63    return SA.partition_to_pseudo[p];
      64  }
      65  
      66  /* If TER decided to forward the definition of SSA name EXP this function
      67     returns the defining statement, otherwise NULL.  */
      68  inline gimple *
      69  get_gimple_for_ssa_name (tree exp)
      70  {
      71    int v = SSA_NAME_VERSION (exp);
      72    if (SA.values && bitmap_bit_p (SA.values, v))
      73      return SSA_NAME_DEF_STMT (exp);
      74    return NULL;
      75  }
      76  
      77  extern bool ssa_is_replaceable_p (gimple *stmt);
      78  extern void finish_out_of_ssa (struct ssaexpand *sa);
      79  extern unsigned int rewrite_out_of_ssa (struct ssaexpand *sa);
      80  extern void expand_phi_nodes (struct ssaexpand *sa);
      81  
      82  #endif /* GCC_TREE_OUTOF_SSA_H */