Home | History | Annotate | Line # | Download | only in gcc
      1  1.1  mrg /* Routines for performing Temporary Expression Replacement (TER) in SSA trees.
      2  1.1  mrg    Copyright (C) 2003-2022 Free Software Foundation, Inc.
      3  1.1  mrg    Contributed by Andrew MacLeod  <amacleod (at) redhat.com>
      4  1.1  mrg 
      5  1.1  mrg This file is part of GCC.
      6  1.1  mrg 
      7  1.1  mrg GCC is free software; you can redistribute it and/or modify
      8  1.1  mrg it under the terms of the GNU General Public License as published by
      9  1.1  mrg the Free Software Foundation; either version 3, or (at your option)
     10  1.1  mrg any later version.
     11  1.1  mrg 
     12  1.1  mrg GCC is distributed in the hope that it will be useful,
     13  1.1  mrg but WITHOUT ANY WARRANTY; without even the implied warranty of
     14  1.1  mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15  1.1  mrg GNU General Public License for more details.
     16  1.1  mrg 
     17  1.1  mrg You should have received a copy of the GNU General Public License
     18  1.1  mrg along with GCC; see the file COPYING3.  If not see
     19  1.1  mrg <http://www.gnu.org/licenses/>.  */
     20  1.1  mrg 
     21  1.1  mrg 
     22  1.1  mrg #include "config.h"
     23  1.1  mrg #include "system.h"
     24  1.1  mrg #include "coretypes.h"
     25  1.1  mrg #include "backend.h"
     26  1.1  mrg #include "tree.h"
     27  1.1  mrg #include "gimple.h"
     28  1.1  mrg #include "ssa.h"
     29  1.1  mrg #include "gimple-pretty-print.h"
     30  1.1  mrg #include "gimple-iterator.h"
     31  1.1  mrg #include "dumpfile.h"
     32  1.1  mrg #include "tree-ssa-live.h"
     33  1.1  mrg #include "tree-ssa-ter.h"
     34  1.1  mrg #include "tree-outof-ssa.h"
     35  1.1  mrg #include "gimple-walk.h"
     36  1.1  mrg 
     37  1.1  mrg 
     38  1.1  mrg /* Temporary Expression Replacement (TER)
     39  1.1  mrg 
     40  1.1  mrg    Replace SSA version variables during out-of-ssa with their defining
     41  1.1  mrg    expression if there is only one use of the variable.
     42  1.1  mrg 
     43  1.1  mrg    This pass is required in order for the RTL expansion pass to see larger
     44  1.1  mrg    chunks of code.  This allows it to make better choices on RTL pattern
     45  1.1  mrg    selection.  When expand is rewritten and merged with out-of-ssa, and
     46  1.1  mrg    understands SSA, this should be eliminated.
     47  1.1  mrg 
     48  1.1  mrg    A pass is made through the function, one block at a time.  No cross block
     49  1.1  mrg    information is tracked.
     50  1.1  mrg 
     51  1.1  mrg    Variables which only have one use, and whose defining stmt is considered
     52  1.1  mrg    a replaceable expression (see ssa_is_replaceable_p) are tracked to see whether
     53  1.1  mrg    they can be replaced at their use location.
     54  1.1  mrg 
     55  1.1  mrg    n_12 = C * 10
     56  1.1  mrg    a_2 = b_5 + 6
     57  1.1  mrg    v_9 = a_2 * n_12
     58  1.1  mrg 
     59  1.1  mrg    if there are the only use of n_12 and a_2, TER will substitute in their
     60  1.1  mrg    expressions in v_9, and end up with:
     61  1.1  mrg 
     62  1.1  mrg    v_9 = (b_5 + 6) * (C * 10)
     63  1.1  mrg 
     64  1.1  mrg    which will then have the ssa_name assigned to regular variables, and the
     65  1.1  mrg    resulting code which will be passed to the expander looks something like:
     66  1.1  mrg 
     67  1.1  mrg    v = (b + 6) * (C * 10)
     68  1.1  mrg 
     69  1.1  mrg 
     70  1.1  mrg    This requires ensuring that none of the variables used by the expression
     71  1.1  mrg    change between the def point and where it is used.  Furthermore, if any
     72  1.1  mrg    of the ssa_names used in this expression are themselves replaceable, we
     73  1.1  mrg    have to ensure none of that expressions' arguments change either.
     74  1.1  mrg    Although SSA_NAMES themselves don't change, this pass is performed after
     75  1.1  mrg    coalescing has coalesced different SSA_NAMES together, so there could be a
     76  1.1  mrg    definition of an SSA_NAME which is coalesced with a use that causes a
     77  1.1  mrg    problem, i.e.,
     78  1.1  mrg 
     79  1.1  mrg    PHI b_5 = <b_8(2), b_14(1)>
     80  1.1  mrg    <...>
     81  1.1  mrg    a_2 = b_5 + 6
     82  1.1  mrg    b_8 = c_4 + 4
     83  1.1  mrg    v_9 = a_2 * n_12
     84  1.1  mrg    <...>
     85  1.1  mrg 
     86  1.1  mrg    If b_5, b_8 and b_14 are all coalesced together...
     87  1.1  mrg    The expression b_5 + 6 CANNOT replace the use in the statement defining v_9
     88  1.1  mrg    because b_8 is in fact killing the value of b_5 since they share a partition
     89  1.1  mrg    and will be assigned the same memory or register location.
     90  1.1  mrg 
     91  1.1  mrg    TER implements this but stepping through the instructions in a block and
     92  1.1  mrg    tracking potential expressions for replacement, and the partitions they are
     93  1.1  mrg    dependent on.  Expressions are represented by the SSA_NAME_VERSION of the
     94  1.1  mrg    DEF on the LHS of a GIMPLE_ASSIGN and the expression is the RHS.
     95  1.1  mrg 
     96  1.1  mrg    When a stmt is determined to be a possible replacement expression, the
     97  1.1  mrg    following steps are taken:
     98  1.1  mrg 
     99  1.1  mrg    EXPR_DECL_UID bitmap is allocated and set to the base variable UID of the
    100  1.1  mrg    def and any uses in the expression.  non-NULL means the expression is being
    101  1.1  mrg    tracked.  The UID's themselves are used to prevent TER substitution into
    102  1.1  mrg    accumulating sequences, i.e.,
    103  1.1  mrg 
    104  1.1  mrg    x = x + y
    105  1.1  mrg    x = x + z
    106  1.1  mrg    x = x + w
    107  1.1  mrg    etc.
    108  1.1  mrg    this can result in very large expressions which don't accomplish anything
    109  1.1  mrg    see PR tree-optimization/17549.
    110  1.1  mrg 
    111  1.1  mrg    PARTITION_DEPENDENCIES is another bitmap array, and it has a bit set for any
    112  1.1  mrg    partition which is used in the expression.  This is primarily used to remove
    113  1.1  mrg    an expression from the partition kill lists when a decision is made whether
    114  1.1  mrg    to replace it or not.  This is indexed by ssa version number as well, and
    115  1.1  mrg    indicates a partition number.  virtual operands are not tracked individually,
    116  1.1  mrg    but they are summarized by an artificial partition called VIRTUAL_PARTITION.
    117  1.1  mrg    This means a MAY or MUST def will kill *ALL* expressions that are dependent
    118  1.1  mrg    on a virtual operand.
    119  1.1  mrg    Note that the EXPR_DECL_UID and this bitmap represent very similar
    120  1.1  mrg    information, but the info in one is not easy to obtain from the other.
    121  1.1  mrg 
    122  1.1  mrg    KILL_LIST is yet another bitmap array, this time it is indexed by partition
    123  1.1  mrg    number, and represents a list of active expressions which will no
    124  1.1  mrg    longer be valid if a definition into this partition takes place.
    125  1.1  mrg 
    126  1.1  mrg    PARTITION_IN_USE is simply a bitmap which is used to track which partitions
    127  1.1  mrg    currently have something in their kill list.  This is used at the end of
    128  1.1  mrg    a block to clear out the KILL_LIST bitmaps at the end of each block.
    129  1.1  mrg 
    130  1.1  mrg    NEW_REPLACEABLE_DEPENDENCIES is used as a temporary place to store
    131  1.1  mrg    dependencies which will be reused by the current definition. All the uses
    132  1.1  mrg    on an expression are processed before anything else is done. If a use is
    133  1.1  mrg    determined to be a replaceable expression AND the current stmt is also going
    134  1.1  mrg    to be replaceable, all the dependencies of this replaceable use will be
    135  1.1  mrg    picked up by the current stmt's expression. Rather than recreate them, they
    136  1.1  mrg    are simply copied here and then copied into the new expression when it is
    137  1.1  mrg    processed.
    138  1.1  mrg 
    139  1.1  mrg    a_2 = b_5 + 6
    140  1.1  mrg    v_8 = a_2 + c_4
    141  1.1  mrg 
    142  1.1  mrg    a_2's expression 'b_5 + 6' is determined to be replaceable at the use
    143  1.1  mrg    location. It is dependent on the partition 'b_5' is in. This is cached into
    144  1.1  mrg    the NEW_REPLACEABLE_DEPENDENCIES bitmap, and when v_8 is examined for
    145  1.1  mrg    replaceability, it is a candidate, and it is dependent on the partition
    146  1.1  mrg    b_5 is in *NOT* a_2, as well as c_4's partition.
    147  1.1  mrg 
    148  1.1  mrg    if v_8 is also replaceable:
    149  1.1  mrg 
    150  1.1  mrg    x_9 = v_8 * 5
    151  1.1  mrg 
    152  1.1  mrg    x_9 is dependent on partitions b_5, and c_4
    153  1.1  mrg 
    154  1.1  mrg    if a statement is found which has either of those partitions written to
    155  1.1  mrg    before x_9 is used, then x_9 itself is NOT replaceable.  */
    156  1.1  mrg 
    157  1.1  mrg 
    158  1.1  mrg /* Temporary Expression Replacement (TER) table information.  */
    159  1.1  mrg 
    160  1.1  mrg struct temp_expr_table
    161  1.1  mrg {
    162  1.1  mrg   var_map map;
    163  1.1  mrg   bitmap *partition_dependencies;	/* Partitions expr is dependent on.  */
    164  1.1  mrg   bitmap replaceable_expressions;	/* Replacement expression table.  */
    165  1.1  mrg   bitmap *expr_decl_uids;		/* Base uids of exprs.  */
    166  1.1  mrg   bitmap *kill_list;			/* Expr's killed by a partition.  */
    167  1.1  mrg   int virtual_partition;		/* Pseudo partition for virtual ops.  */
    168  1.1  mrg   bitmap partition_in_use;		/* Partitions with kill entries.  */
    169  1.1  mrg   bitmap new_replaceable_dependencies;	/* Holding place for pending dep's.  */
    170  1.1  mrg   int *num_in_part;			/* # of ssa_names in a partition.  */
    171  1.1  mrg   int *call_cnt;			/* Call count at definition.  */
    172  1.1  mrg   int *reg_vars_cnt;			/* Number of register variable
    173  1.1  mrg 					   definitions encountered.  */
    174  1.1  mrg };
    175  1.1  mrg 
    176  1.1  mrg /* Used to indicate a dependency on VDEFs.  */
    177  1.1  mrg #define VIRTUAL_PARTITION(table)	(table->virtual_partition)
    178  1.1  mrg 
    179  1.1  mrg /* A place for the many, many bitmaps we create.  */
    180  1.1  mrg static bitmap_obstack ter_bitmap_obstack;
    181  1.1  mrg 
    182  1.1  mrg extern void debug_ter (FILE *, temp_expr_table *);
    183  1.1  mrg 
    184  1.1  mrg 
    185  1.1  mrg /* Create a new TER table for MAP.  */
    186  1.1  mrg 
    187  1.1  mrg static temp_expr_table *
    188  1.1  mrg new_temp_expr_table (var_map map)
    189  1.1  mrg {
    190  1.1  mrg   temp_expr_table *t = XNEW (struct temp_expr_table);
    191  1.1  mrg   t->map = map;
    192  1.1  mrg 
    193  1.1  mrg   t->partition_dependencies = XCNEWVEC (bitmap, num_ssa_names + 1);
    194  1.1  mrg   t->expr_decl_uids = XCNEWVEC (bitmap, num_ssa_names + 1);
    195  1.1  mrg   t->kill_list = XCNEWVEC (bitmap, num_var_partitions (map) + 1);
    196  1.1  mrg 
    197  1.1  mrg   t->partition_in_use = BITMAP_ALLOC (&ter_bitmap_obstack);
    198  1.1  mrg 
    199  1.1  mrg   t->virtual_partition = num_var_partitions (map);
    200  1.1  mrg   t->new_replaceable_dependencies = BITMAP_ALLOC (&ter_bitmap_obstack);
    201  1.1  mrg 
    202  1.1  mrg   t->replaceable_expressions = NULL;
    203  1.1  mrg   t->num_in_part = XCNEWVEC (int, num_var_partitions (map));
    204  1.1  mrg 
    205  1.1  mrg   unsigned x;
    206  1.1  mrg   tree name;
    207  1.1  mrg 
    208  1.1  mrg   FOR_EACH_SSA_NAME (x, name, cfun)
    209  1.1  mrg     {
    210  1.1  mrg       int p;
    211  1.1  mrg       p = var_to_partition (map, name);
    212  1.1  mrg       if (p != NO_PARTITION)
    213  1.1  mrg         t->num_in_part[p]++;
    214  1.1  mrg     }
    215  1.1  mrg   t->call_cnt = XCNEWVEC (int, num_ssa_names + 1);
    216  1.1  mrg   t->reg_vars_cnt = XCNEWVEC (int, num_ssa_names + 1);
    217  1.1  mrg 
    218  1.1  mrg   return t;
    219  1.1  mrg }
    220  1.1  mrg 
    221  1.1  mrg 
    222  1.1  mrg /* Free TER table T.  If there are valid replacements, return the expression
    223  1.1  mrg    vector.  */
    224  1.1  mrg 
    225  1.1  mrg static bitmap
    226  1.1  mrg free_temp_expr_table (temp_expr_table *t)
    227  1.1  mrg {
    228  1.1  mrg   bitmap ret = NULL;
    229  1.1  mrg 
    230  1.1  mrg   if (flag_checking)
    231  1.1  mrg     {
    232  1.1  mrg       for (unsigned x = 0; x <= num_var_partitions (t->map); x++)
    233  1.1  mrg 	gcc_assert (!t->kill_list[x]);
    234  1.1  mrg       for (unsigned x = 0; x < num_ssa_names; x++)
    235  1.1  mrg 	{
    236  1.1  mrg 	  gcc_assert (t->expr_decl_uids[x] == NULL);
    237  1.1  mrg 	  gcc_assert (t->partition_dependencies[x] == NULL);
    238  1.1  mrg 	}
    239  1.1  mrg     }
    240  1.1  mrg 
    241  1.1  mrg   BITMAP_FREE (t->partition_in_use);
    242  1.1  mrg   BITMAP_FREE (t->new_replaceable_dependencies);
    243  1.1  mrg 
    244  1.1  mrg   free (t->expr_decl_uids);
    245  1.1  mrg   free (t->kill_list);
    246  1.1  mrg   free (t->partition_dependencies);
    247  1.1  mrg   free (t->num_in_part);
    248  1.1  mrg   free (t->call_cnt);
    249  1.1  mrg   free (t->reg_vars_cnt);
    250  1.1  mrg 
    251  1.1  mrg   if (t->replaceable_expressions)
    252  1.1  mrg     ret = t->replaceable_expressions;
    253  1.1  mrg 
    254  1.1  mrg   free (t);
    255  1.1  mrg   return ret;
    256  1.1  mrg }
    257  1.1  mrg 
    258  1.1  mrg 
    259  1.1  mrg /* Return TRUE if VERSION is to be replaced by an expression in TAB.  */
    260  1.1  mrg 
    261  1.1  mrg static inline bool
    262  1.1  mrg version_to_be_replaced_p (temp_expr_table *tab, int version)
    263  1.1  mrg {
    264  1.1  mrg   if (!tab->replaceable_expressions)
    265  1.1  mrg     return false;
    266  1.1  mrg   return bitmap_bit_p (tab->replaceable_expressions, version);
    267  1.1  mrg }
    268  1.1  mrg 
    269  1.1  mrg 
    270  1.1  mrg /* Add partition P to the list if partitions VERSION is dependent on.  TAB is
    271  1.1  mrg    the expression table */
    272  1.1  mrg 
    273  1.1  mrg static inline void
    274  1.1  mrg make_dependent_on_partition (temp_expr_table *tab, int version, int p)
    275  1.1  mrg {
    276  1.1  mrg   if (!tab->partition_dependencies[version])
    277  1.1  mrg     tab->partition_dependencies[version] = BITMAP_ALLOC (&ter_bitmap_obstack);
    278  1.1  mrg 
    279  1.1  mrg   bitmap_set_bit (tab->partition_dependencies[version], p);
    280  1.1  mrg }
    281  1.1  mrg 
    282  1.1  mrg 
    283  1.1  mrg /* Add VER to the kill list for P.  TAB is the expression table */
    284  1.1  mrg 
    285  1.1  mrg static inline void
    286  1.1  mrg add_to_partition_kill_list (temp_expr_table *tab, int p, int ver)
    287  1.1  mrg {
    288  1.1  mrg   if (!tab->kill_list[p])
    289  1.1  mrg     {
    290  1.1  mrg       tab->kill_list[p] = BITMAP_ALLOC (&ter_bitmap_obstack);
    291  1.1  mrg       bitmap_set_bit (tab->partition_in_use, p);
    292  1.1  mrg     }
    293  1.1  mrg   bitmap_set_bit (tab->kill_list[p], ver);
    294  1.1  mrg }
    295  1.1  mrg 
    296  1.1  mrg 
    297  1.1  mrg /* Remove VER from the partition kill list for P.  TAB is the expression
    298  1.1  mrg    table.  */
    299  1.1  mrg 
    300  1.1  mrg static inline void
    301  1.1  mrg remove_from_partition_kill_list (temp_expr_table *tab, int p, int version)
    302  1.1  mrg {
    303  1.1  mrg   gcc_checking_assert (tab->kill_list[p]);
    304  1.1  mrg   bitmap_clear_bit (tab->kill_list[p], version);
    305  1.1  mrg   if (bitmap_empty_p (tab->kill_list[p]))
    306  1.1  mrg     {
    307  1.1  mrg       bitmap_clear_bit (tab->partition_in_use, p);
    308  1.1  mrg       BITMAP_FREE (tab->kill_list[p]);
    309  1.1  mrg     }
    310  1.1  mrg }
    311  1.1  mrg 
    312  1.1  mrg 
    313  1.1  mrg /* Add a dependency between the def of ssa VERSION and VAR.  If VAR is
    314  1.1  mrg    replaceable by an expression, add a dependence each of the elements of the
    315  1.1  mrg    expression.  These are contained in the new_replaceable list.  TAB is the
    316  1.1  mrg    expression table.  */
    317  1.1  mrg 
    318  1.1  mrg static void
    319  1.1  mrg add_dependence (temp_expr_table *tab, int version, tree var)
    320  1.1  mrg {
    321  1.1  mrg   int i;
    322  1.1  mrg   bitmap_iterator bi;
    323  1.1  mrg   unsigned x;
    324  1.1  mrg 
    325  1.1  mrg   i = SSA_NAME_VERSION (var);
    326  1.1  mrg   if (version_to_be_replaced_p (tab, i))
    327  1.1  mrg     {
    328  1.1  mrg       if (!bitmap_empty_p (tab->new_replaceable_dependencies))
    329  1.1  mrg         {
    330  1.1  mrg 	  /* Version will now be killed by a write to any partition the
    331  1.1  mrg 	     substituted expression would have been killed by.  */
    332  1.1  mrg 	  EXECUTE_IF_SET_IN_BITMAP (tab->new_replaceable_dependencies, 0, x, bi)
    333  1.1  mrg 	    add_to_partition_kill_list (tab, x, version);
    334  1.1  mrg 
    335  1.1  mrg 	  /* Rather than set partition_dependencies and in_use lists bit by
    336  1.1  mrg 	     bit, simply OR in the new_replaceable_dependencies bits.  */
    337  1.1  mrg 	  if (!tab->partition_dependencies[version])
    338  1.1  mrg 	    tab->partition_dependencies[version] =
    339  1.1  mrg 	      BITMAP_ALLOC (&ter_bitmap_obstack);
    340  1.1  mrg 	  bitmap_ior_into (tab->partition_dependencies[version],
    341  1.1  mrg 			   tab->new_replaceable_dependencies);
    342  1.1  mrg 	  bitmap_ior_into (tab->partition_in_use,
    343  1.1  mrg 			   tab->new_replaceable_dependencies);
    344  1.1  mrg 	  /* It is only necessary to add these once.  */
    345  1.1  mrg 	  bitmap_clear (tab->new_replaceable_dependencies);
    346  1.1  mrg 	}
    347  1.1  mrg     }
    348  1.1  mrg   else
    349  1.1  mrg     {
    350  1.1  mrg       i = var_to_partition (tab->map, var);
    351  1.1  mrg       gcc_checking_assert (i != NO_PARTITION);
    352  1.1  mrg       gcc_checking_assert (tab->num_in_part[i] != 0);
    353  1.1  mrg       /* Only dependencies on ssa_names which are coalesced with something need
    354  1.1  mrg          to be tracked.  Partitions with containing only a single SSA_NAME
    355  1.1  mrg 	 *cannot* have their value changed.  */
    356  1.1  mrg       if (tab->num_in_part[i] > 1)
    357  1.1  mrg         {
    358  1.1  mrg 	  add_to_partition_kill_list (tab, i, version);
    359  1.1  mrg 	  make_dependent_on_partition (tab, version, i);
    360  1.1  mrg 	}
    361  1.1  mrg     }
    362  1.1  mrg }
    363  1.1  mrg 
    364  1.1  mrg 
    365  1.1  mrg /* This function will remove the expression for VERSION from replacement
    366  1.1  mrg    consideration in table TAB.  If FREE_EXPR is true, then remove the
    367  1.1  mrg    expression from consideration as well by freeing the decl uid bitmap.  */
    368  1.1  mrg 
    369  1.1  mrg static void
    370  1.1  mrg finished_with_expr (temp_expr_table *tab, int version, bool free_expr)
    371  1.1  mrg {
    372  1.1  mrg   unsigned i;
    373  1.1  mrg   bitmap_iterator bi;
    374  1.1  mrg 
    375  1.1  mrg   /* Remove this expression from its dependent lists.  The partition dependence
    376  1.1  mrg      list is retained and transferred later to whomever uses this version.  */
    377  1.1  mrg   if (tab->partition_dependencies[version])
    378  1.1  mrg     {
    379  1.1  mrg       EXECUTE_IF_SET_IN_BITMAP (tab->partition_dependencies[version], 0, i, bi)
    380  1.1  mrg 	remove_from_partition_kill_list (tab, i, version);
    381  1.1  mrg       BITMAP_FREE (tab->partition_dependencies[version]);
    382  1.1  mrg     }
    383  1.1  mrg   if (free_expr)
    384  1.1  mrg     BITMAP_FREE (tab->expr_decl_uids[version]);
    385  1.1  mrg }
    386  1.1  mrg 
    387  1.1  mrg 
    388  1.1  mrg /* Return TRUE if expression STMT is suitable for replacement.
    389  1.1  mrg    In addition to ssa_is_replaceable_p, require the same bb, and for -O0
    390  1.1  mrg    same locus and same BLOCK), Considers memory loads as replaceable if aliasing
    391  1.1  mrg    is available.  */
    392  1.1  mrg 
    393  1.1  mrg static inline bool
    394  1.1  mrg ter_is_replaceable_p (gimple *stmt)
    395  1.1  mrg {
    396  1.1  mrg 
    397  1.1  mrg   if (ssa_is_replaceable_p (stmt))
    398  1.1  mrg     {
    399  1.1  mrg       use_operand_p use_p;
    400  1.1  mrg       tree def;
    401  1.1  mrg       gimple *use_stmt;
    402  1.1  mrg       location_t locus1, locus2;
    403  1.1  mrg       tree block1, block2;
    404  1.1  mrg 
    405  1.1  mrg       /* Only consider definitions which have a single use.  ssa_is_replaceable_p
    406  1.1  mrg 	 already performed this check, but the use stmt pointer is required for
    407  1.1  mrg 	 further checks.  */
    408  1.1  mrg       def = SINGLE_SSA_TREE_OPERAND (stmt, SSA_OP_DEF);
    409  1.1  mrg       if (!single_imm_use (def, &use_p, &use_stmt))
    410  1.1  mrg 	  return false;
    411  1.1  mrg 
    412  1.1  mrg       /* If the use isn't in this block, it wont be replaced either.  */
    413  1.1  mrg       if (gimple_bb (use_stmt) != gimple_bb (stmt))
    414  1.1  mrg         return false;
    415  1.1  mrg 
    416  1.1  mrg       locus1 = gimple_location (stmt);
    417  1.1  mrg       block1 = LOCATION_BLOCK (locus1);
    418  1.1  mrg       locus1 = LOCATION_LOCUS (locus1);
    419  1.1  mrg 
    420  1.1  mrg       if (gphi *phi = dyn_cast <gphi *> (use_stmt))
    421  1.1  mrg 	locus2 = gimple_phi_arg_location (phi,
    422  1.1  mrg 					  PHI_ARG_INDEX_FROM_USE (use_p));
    423  1.1  mrg       else
    424  1.1  mrg 	locus2 = gimple_location (use_stmt);
    425  1.1  mrg       block2 = LOCATION_BLOCK (locus2);
    426  1.1  mrg       locus2 = LOCATION_LOCUS (locus2);
    427  1.1  mrg 
    428  1.1  mrg       if ((!optimize || optimize_debug)
    429  1.1  mrg 	  && ((locus1 != UNKNOWN_LOCATION && locus1 != locus2)
    430  1.1  mrg 	      || (block1 != NULL_TREE && block1 != block2)))
    431  1.1  mrg 	return false;
    432  1.1  mrg 
    433  1.1  mrg       return true;
    434  1.1  mrg     }
    435  1.1  mrg   return false;
    436  1.1  mrg }
    437  1.1  mrg 
    438  1.1  mrg 
    439  1.1  mrg /* Create an expression entry for a replaceable expression.  */
    440  1.1  mrg 
    441  1.1  mrg static void
    442  1.1  mrg process_replaceable (temp_expr_table *tab, gimple *stmt, int call_cnt,
    443  1.1  mrg 		     int reg_vars_cnt)
    444  1.1  mrg {
    445  1.1  mrg   tree var, def, basevar;
    446  1.1  mrg   int version;
    447  1.1  mrg   ssa_op_iter iter;
    448  1.1  mrg   bitmap def_vars, use_vars;
    449  1.1  mrg 
    450  1.1  mrg   gcc_checking_assert (ter_is_replaceable_p (stmt));
    451  1.1  mrg 
    452  1.1  mrg   def = SINGLE_SSA_TREE_OPERAND (stmt, SSA_OP_DEF);
    453  1.1  mrg   version = SSA_NAME_VERSION (def);
    454  1.1  mrg   def_vars = BITMAP_ALLOC (&ter_bitmap_obstack);
    455  1.1  mrg 
    456  1.1  mrg   basevar = SSA_NAME_VAR (def);
    457  1.1  mrg   if (basevar)
    458  1.1  mrg     bitmap_set_bit (def_vars, DECL_UID (basevar));
    459  1.1  mrg 
    460  1.1  mrg   /* Add this expression to the dependency list for each use partition.  */
    461  1.1  mrg   FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, SSA_OP_USE)
    462  1.1  mrg     {
    463  1.1  mrg       int var_version = SSA_NAME_VERSION (var);
    464  1.1  mrg 
    465  1.1  mrg       use_vars = tab->expr_decl_uids[var_version];
    466  1.1  mrg       add_dependence (tab, version, var);
    467  1.1  mrg       if (use_vars)
    468  1.1  mrg         {
    469  1.1  mrg 	  bitmap_ior_into (def_vars, use_vars);
    470  1.1  mrg 	  BITMAP_FREE (tab->expr_decl_uids[var_version]);
    471  1.1  mrg 	}
    472  1.1  mrg       else if (SSA_NAME_VAR (var))
    473  1.1  mrg 	bitmap_set_bit (def_vars, DECL_UID (SSA_NAME_VAR (var)));
    474  1.1  mrg     }
    475  1.1  mrg   tab->expr_decl_uids[version] = def_vars;
    476  1.1  mrg 
    477  1.1  mrg   /* If there are VUSES, add a dependence on virtual defs.  */
    478  1.1  mrg   if (gimple_vuse (stmt))
    479  1.1  mrg     {
    480  1.1  mrg       make_dependent_on_partition (tab, version, VIRTUAL_PARTITION (tab));
    481  1.1  mrg       add_to_partition_kill_list (tab, VIRTUAL_PARTITION (tab), version);
    482  1.1  mrg     }
    483  1.1  mrg 
    484  1.1  mrg   tab->call_cnt[version] = call_cnt;
    485  1.1  mrg   tab->reg_vars_cnt[version] = reg_vars_cnt;
    486  1.1  mrg }
    487  1.1  mrg 
    488  1.1  mrg 
    489  1.1  mrg /* This function removes any expression in TAB which is dependent on PARTITION
    490  1.1  mrg    from consideration, making it not replaceable.  */
    491  1.1  mrg 
    492  1.1  mrg static inline void
    493  1.1  mrg kill_expr (temp_expr_table *tab, int partition)
    494  1.1  mrg {
    495  1.1  mrg   unsigned version;
    496  1.1  mrg 
    497  1.1  mrg   /* Mark every active expr dependent on this var as not replaceable.
    498  1.1  mrg      finished_with_expr can modify the bitmap, so we can't execute over it.  */
    499  1.1  mrg   while (tab->kill_list[partition])
    500  1.1  mrg     {
    501  1.1  mrg       version = bitmap_first_set_bit (tab->kill_list[partition]);
    502  1.1  mrg       finished_with_expr (tab, version, true);
    503  1.1  mrg     }
    504  1.1  mrg 
    505  1.1  mrg   gcc_checking_assert (!tab->kill_list[partition]);
    506  1.1  mrg }
    507  1.1  mrg 
    508  1.1  mrg 
    509  1.1  mrg /* This function kills all expressions in TAB which are dependent on virtual
    510  1.1  mrg    partitions.  */
    511  1.1  mrg 
    512  1.1  mrg static inline void
    513  1.1  mrg kill_virtual_exprs (temp_expr_table *tab)
    514  1.1  mrg {
    515  1.1  mrg   kill_expr (tab, VIRTUAL_PARTITION (tab));
    516  1.1  mrg }
    517  1.1  mrg 
    518  1.1  mrg 
    519  1.1  mrg /* Mark the expression associated with VAR as replaceable, and enter
    520  1.1  mrg    the defining stmt into the partition_dependencies table TAB.  If
    521  1.1  mrg    MORE_REPLACING is true, accumulate the pending partition dependencies.  */
    522  1.1  mrg 
    523  1.1  mrg static void
    524  1.1  mrg mark_replaceable (temp_expr_table *tab, tree var, bool more_replacing)
    525  1.1  mrg {
    526  1.1  mrg   int version = SSA_NAME_VERSION (var);
    527  1.1  mrg 
    528  1.1  mrg   /* Move the dependence list to the pending listpending.  */
    529  1.1  mrg   if (more_replacing && tab->partition_dependencies[version])
    530  1.1  mrg     bitmap_ior_into (tab->new_replaceable_dependencies,
    531  1.1  mrg 		     tab->partition_dependencies[version]);
    532  1.1  mrg 
    533  1.1  mrg   finished_with_expr (tab, version, !more_replacing);
    534  1.1  mrg 
    535  1.1  mrg   /* Set the replaceable expression.
    536  1.1  mrg      The bitmap for this "escapes" from this file so it's allocated
    537  1.1  mrg      on the default obstack.  */
    538  1.1  mrg   if (!tab->replaceable_expressions)
    539  1.1  mrg     tab->replaceable_expressions = BITMAP_ALLOC (NULL);
    540  1.1  mrg   bitmap_set_bit (tab->replaceable_expressions, version);
    541  1.1  mrg }
    542  1.1  mrg 
    543  1.1  mrg 
    544  1.1  mrg /* Helper function for find_ssaname_in_stores.  Called via walk_tree to
    545  1.1  mrg    find a SSA_NAME DATA somewhere in *TP.  */
    546  1.1  mrg 
    547  1.1  mrg static tree
    548  1.1  mrg find_ssaname (tree *tp, int *walk_subtrees, void *data)
    549  1.1  mrg {
    550  1.1  mrg   tree var = (tree) data;
    551  1.1  mrg   if (*tp == var)
    552  1.1  mrg     return var;
    553  1.1  mrg   else if (IS_TYPE_OR_DECL_P (*tp))
    554  1.1  mrg     *walk_subtrees = 0;
    555  1.1  mrg   return NULL_TREE;
    556  1.1  mrg }
    557  1.1  mrg 
    558  1.1  mrg /* Helper function for find_replaceable_in_bb.  Return true if SSA_NAME DATA
    559  1.1  mrg    is used somewhere in T, which is a store in the statement.  Called via
    560  1.1  mrg    walk_stmt_load_store_addr_ops.  */
    561  1.1  mrg 
    562  1.1  mrg static bool
    563  1.1  mrg find_ssaname_in_store (gimple *, tree, tree t, void *data)
    564  1.1  mrg {
    565  1.1  mrg   return walk_tree (&t, find_ssaname, data, NULL) != NULL_TREE;
    566  1.1  mrg }
    567  1.1  mrg 
    568  1.1  mrg /* This function processes basic block BB, and looks for variables which can
    569  1.1  mrg    be replaced by their expressions.  Results are stored in the table TAB.  */
    570  1.1  mrg 
    571  1.1  mrg static void
    572  1.1  mrg find_replaceable_in_bb (temp_expr_table *tab, basic_block bb)
    573  1.1  mrg {
    574  1.1  mrg   gimple_stmt_iterator bsi;
    575  1.1  mrg   gimple *stmt;
    576  1.1  mrg   tree def, use, fndecl;
    577  1.1  mrg   int partition;
    578  1.1  mrg   var_map map = tab->map;
    579  1.1  mrg   ssa_op_iter iter;
    580  1.1  mrg   bool stmt_replaceable;
    581  1.1  mrg   int cur_call_cnt = 0;
    582  1.1  mrg   int cur_reg_vars_cnt = 0;
    583  1.1  mrg 
    584  1.1  mrg   for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
    585  1.1  mrg     {
    586  1.1  mrg       stmt = gsi_stmt (bsi);
    587  1.1  mrg 
    588  1.1  mrg       if (is_gimple_debug (stmt))
    589  1.1  mrg 	continue;
    590  1.1  mrg 
    591  1.1  mrg       stmt_replaceable = ter_is_replaceable_p (stmt);
    592  1.1  mrg 
    593  1.1  mrg       /* Determine if this stmt finishes an existing expression.  */
    594  1.1  mrg       FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE)
    595  1.1  mrg 	{
    596  1.1  mrg 	  unsigned ver = SSA_NAME_VERSION (use);
    597  1.1  mrg 
    598  1.1  mrg 	  /* If this use is a potential replacement variable, process it.  */
    599  1.1  mrg 	  if (tab->expr_decl_uids[ver])
    600  1.1  mrg 	    {
    601  1.1  mrg 	      bool same_root_var = false;
    602  1.1  mrg 	      ssa_op_iter iter2;
    603  1.1  mrg 	      bitmap vars = tab->expr_decl_uids[ver];
    604  1.1  mrg 
    605  1.1  mrg 	      /* See if the root variables are the same.  If they are, we
    606  1.1  mrg 		 do not want to do the replacement to avoid problems with
    607  1.1  mrg 		 code size, see PR tree-optimization/17549.  */
    608  1.1  mrg 	      if (!bitmap_empty_p (vars))
    609  1.1  mrg 		FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter2, SSA_OP_DEF)
    610  1.1  mrg 		  {
    611  1.1  mrg 		    if (SSA_NAME_VAR (def)
    612  1.1  mrg 			&& bitmap_bit_p (vars, DECL_UID (SSA_NAME_VAR (def))))
    613  1.1  mrg 		      {
    614  1.1  mrg 			same_root_var = true;
    615  1.1  mrg 			break;
    616  1.1  mrg 		      }
    617  1.1  mrg 		  }
    618  1.1  mrg 
    619  1.1  mrg 	      /* If the stmt does a memory store and the replacement
    620  1.1  mrg 	         is a load aliasing it avoid creating overlapping
    621  1.1  mrg 		 assignments which we cannot expand correctly.  */
    622  1.1  mrg 	      if (gimple_vdef (stmt))
    623  1.1  mrg 		{
    624  1.1  mrg 		  gimple *def_stmt = SSA_NAME_DEF_STMT (use);
    625  1.1  mrg 		  while (is_gimple_assign (def_stmt)
    626  1.1  mrg 			 && gimple_assign_rhs_code (def_stmt) == SSA_NAME)
    627  1.1  mrg 		    def_stmt
    628  1.1  mrg 		      = SSA_NAME_DEF_STMT (gimple_assign_rhs1 (def_stmt));
    629  1.1  mrg 		  if (gimple_vuse (def_stmt)
    630  1.1  mrg 		      && gimple_assign_single_p (def_stmt)
    631  1.1  mrg 		      && stmt_may_clobber_ref_p (stmt,
    632  1.1  mrg 						 gimple_assign_rhs1 (def_stmt)))
    633  1.1  mrg 		    {
    634  1.1  mrg 		      /* For calls, it is not a problem if USE is among
    635  1.1  mrg 			 call's arguments or say OBJ_TYPE_REF argument,
    636  1.1  mrg 			 all those necessarily need to be evaluated before
    637  1.1  mrg 			 the call that may clobber the memory.  But if
    638  1.1  mrg 			 LHS of the call refers to USE, expansion might
    639  1.1  mrg 			 evaluate it after the call, prevent TER in that
    640  1.1  mrg 			 case.
    641  1.1  mrg 			 For inline asm, allow TER of loads into input
    642  1.1  mrg 			 arguments, but disallow TER for USEs that occur
    643  1.1  mrg 			 somewhere in outputs.  */
    644  1.1  mrg 		      if (is_gimple_call (stmt)
    645  1.1  mrg 			  || gimple_code (stmt) == GIMPLE_ASM)
    646  1.1  mrg 			{
    647  1.1  mrg 			  if (walk_stmt_load_store_ops (stmt, use, NULL,
    648  1.1  mrg 							find_ssaname_in_store))
    649  1.1  mrg 			    same_root_var = true;
    650  1.1  mrg 			}
    651  1.1  mrg 		      else
    652  1.1  mrg 			same_root_var = true;
    653  1.1  mrg 		    }
    654  1.1  mrg 		}
    655  1.1  mrg 
    656  1.1  mrg 	      /* Mark expression as replaceable unless stmt is volatile, or the
    657  1.1  mrg 		 def variable has the same root variable as something in the
    658  1.1  mrg 		 substitution list, or the def and use span a call such that
    659  1.1  mrg 		 we'll expand lifetimes across a call.  We also don't want to
    660  1.1  mrg 		 replace across these expressions that may call libcalls that
    661  1.1  mrg 		 clobber the register involved.  See PR 70184.  Neither
    662  1.1  mrg 		 do we want to move possibly trapping expressions across
    663  1.1  mrg 		 a call.  See PRs 102129 and 33593.  */
    664  1.1  mrg 	      if (gimple_has_volatile_ops (stmt) || same_root_var
    665  1.1  mrg 		  || (tab->call_cnt[ver] != cur_call_cnt
    666  1.1  mrg 		      && (SINGLE_SSA_USE_OPERAND (SSA_NAME_DEF_STMT (use),
    667  1.1  mrg 						  SSA_OP_USE)
    668  1.1  mrg 			    == NULL_USE_OPERAND_P
    669  1.1  mrg 			  || gimple_could_trap_p (SSA_NAME_DEF_STMT (use))))
    670  1.1  mrg 		  || tab->reg_vars_cnt[ver] != cur_reg_vars_cnt)
    671  1.1  mrg 		finished_with_expr (tab, ver, true);
    672  1.1  mrg 	      else
    673  1.1  mrg 		mark_replaceable (tab, use, stmt_replaceable);
    674  1.1  mrg 	    }
    675  1.1  mrg 	}
    676  1.1  mrg 
    677  1.1  mrg       /* Next, see if this stmt kills off an active expression.  */
    678  1.1  mrg       FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF)
    679  1.1  mrg 	{
    680  1.1  mrg 	  partition = var_to_partition (map, def);
    681  1.1  mrg 	  if (partition != NO_PARTITION && tab->kill_list[partition])
    682  1.1  mrg 	    kill_expr (tab, partition);
    683  1.1  mrg 	}
    684  1.1  mrg 
    685  1.1  mrg       /* Increment counter if this is a non BUILT_IN call. We allow
    686  1.1  mrg 	 replacement over BUILT_IN calls since many will expand to inline
    687  1.1  mrg 	 insns instead of a true call.  */
    688  1.1  mrg       if (is_gimple_call (stmt)
    689  1.1  mrg 	  && !((fndecl = gimple_call_fndecl (stmt))
    690  1.1  mrg 	       && fndecl_built_in_p (fndecl)))
    691  1.1  mrg 	cur_call_cnt++;
    692  1.1  mrg 
    693  1.1  mrg       /* Increment counter if this statement sets a local
    694  1.1  mrg 	 register variable.  */
    695  1.1  mrg       if (gimple_assign_single_p (stmt)
    696  1.1  mrg 	  && (TREE_CODE (gimple_assign_lhs (stmt)) == VAR_DECL
    697  1.1  mrg 	  && DECL_HARD_REGISTER (gimple_assign_lhs (stmt))))
    698  1.1  mrg 	cur_reg_vars_cnt++;
    699  1.1  mrg 
    700  1.1  mrg       /* Now see if we are creating a new expression or not.  */
    701  1.1  mrg       if (stmt_replaceable)
    702  1.1  mrg 	process_replaceable (tab, stmt, cur_call_cnt, cur_reg_vars_cnt);
    703  1.1  mrg 
    704  1.1  mrg       /* Free any unused dependency lists.  */
    705  1.1  mrg       bitmap_clear (tab->new_replaceable_dependencies);
    706  1.1  mrg 
    707  1.1  mrg       /* A V_{MAY,MUST}_DEF kills any expression using a virtual operand,
    708  1.1  mrg 	 including the current stmt.  */
    709  1.1  mrg       if (gimple_vdef (stmt))
    710  1.1  mrg         kill_virtual_exprs (tab);
    711  1.1  mrg     }
    712  1.1  mrg }
    713  1.1  mrg 
    714  1.1  mrg 
    715  1.1  mrg /* This function is the driver routine for replacement of temporary expressions
    716  1.1  mrg    in the SSA->normal phase, operating on MAP.  If there are replaceable
    717  1.1  mrg    expressions, a table is returned which maps SSA versions to the
    718  1.1  mrg    expressions they should be replaced with.  A NULL_TREE indicates no
    719  1.1  mrg    replacement should take place.  If there are no replacements at all,
    720  1.1  mrg    NULL is returned by the function, otherwise an expression vector indexed
    721  1.1  mrg    by SSA_NAME version numbers.  */
    722  1.1  mrg 
    723  1.1  mrg bitmap
    724  1.1  mrg find_replaceable_exprs (var_map map)
    725  1.1  mrg {
    726  1.1  mrg   basic_block bb;
    727  1.1  mrg   temp_expr_table *table;
    728  1.1  mrg   bitmap ret;
    729  1.1  mrg 
    730  1.1  mrg   bitmap_obstack_initialize (&ter_bitmap_obstack);
    731  1.1  mrg   table = new_temp_expr_table (map);
    732  1.1  mrg   FOR_EACH_BB_FN (bb, cfun)
    733  1.1  mrg     {
    734  1.1  mrg       find_replaceable_in_bb (table, bb);
    735  1.1  mrg       gcc_checking_assert (bitmap_empty_p (table->partition_in_use));
    736  1.1  mrg     }
    737  1.1  mrg   ret = free_temp_expr_table (table);
    738  1.1  mrg   bitmap_obstack_release (&ter_bitmap_obstack);
    739  1.1  mrg   return ret;
    740  1.1  mrg }
    741  1.1  mrg 
    742  1.1  mrg /* Dump TER expression table EXPR to file F.  */
    743  1.1  mrg 
    744  1.1  mrg void
    745  1.1  mrg dump_replaceable_exprs (FILE *f, bitmap expr)
    746  1.1  mrg {
    747  1.1  mrg   tree var;
    748  1.1  mrg   unsigned x;
    749  1.1  mrg 
    750  1.1  mrg   fprintf (f, "\nReplacing Expressions\n");
    751  1.1  mrg   for (x = 0; x < num_ssa_names; x++)
    752  1.1  mrg     if (bitmap_bit_p (expr, x))
    753  1.1  mrg       {
    754  1.1  mrg 	var = ssa_name (x);
    755  1.1  mrg 	print_generic_expr (f, var, TDF_SLIM);
    756  1.1  mrg 	fprintf (f, " replace with --> ");
    757  1.1  mrg 	print_gimple_stmt (f, SSA_NAME_DEF_STMT (var), 0, TDF_SLIM);
    758  1.1  mrg 	fprintf (f, "\n");
    759  1.1  mrg       }
    760  1.1  mrg   fprintf (f, "\n");
    761  1.1  mrg }
    762  1.1  mrg 
    763  1.1  mrg 
    764  1.1  mrg /* Dump the status of the various tables in the expression table.  This is used
    765  1.1  mrg    exclusively to debug TER.  F is the place to send debug info and T is the
    766  1.1  mrg    table being debugged.  */
    767  1.1  mrg 
    768  1.1  mrg DEBUG_FUNCTION void
    769  1.1  mrg debug_ter (FILE *f, temp_expr_table *t)
    770  1.1  mrg {
    771  1.1  mrg   unsigned x, y;
    772  1.1  mrg   bitmap_iterator bi;
    773  1.1  mrg 
    774  1.1  mrg   fprintf (f, "\nDumping current state of TER\n virtual partition = %d\n",
    775  1.1  mrg 	   VIRTUAL_PARTITION (t));
    776  1.1  mrg   if (t->replaceable_expressions)
    777  1.1  mrg     dump_replaceable_exprs (f, t->replaceable_expressions);
    778  1.1  mrg   fprintf (f, "Currently tracking the following expressions:\n");
    779  1.1  mrg 
    780  1.1  mrg   for (x = 1; x < num_ssa_names; x++)
    781  1.1  mrg     if (t->expr_decl_uids[x])
    782  1.1  mrg       {
    783  1.1  mrg         print_generic_expr (f, ssa_name (x), TDF_SLIM);
    784  1.1  mrg         fprintf (f, " dep-parts : ");
    785  1.1  mrg 	if (t->partition_dependencies[x]
    786  1.1  mrg 	    && !bitmap_empty_p (t->partition_dependencies[x]))
    787  1.1  mrg 	  {
    788  1.1  mrg 	    EXECUTE_IF_SET_IN_BITMAP (t->partition_dependencies[x], 0, y, bi)
    789  1.1  mrg 	      fprintf (f, "P%d ",y);
    790  1.1  mrg 	  }
    791  1.1  mrg 	fprintf (f, "   basedecls: ");
    792  1.1  mrg 	EXECUTE_IF_SET_IN_BITMAP (t->expr_decl_uids[x], 0, y, bi)
    793  1.1  mrg 	  fprintf (f, "%d ",y);
    794  1.1  mrg 	fprintf (f, "   call_cnt : %d",t->call_cnt[x]);
    795  1.1  mrg 	fprintf (f, "\n");
    796  1.1  mrg       }
    797  1.1  mrg 
    798  1.1  mrg   bitmap_print (f, t->partition_in_use, "Partitions in use ",
    799  1.1  mrg 		"\npartition KILL lists:\n");
    800  1.1  mrg 
    801  1.1  mrg   for (x = 0; x <= num_var_partitions (t->map); x++)
    802  1.1  mrg     if (t->kill_list[x])
    803  1.1  mrg       {
    804  1.1  mrg         fprintf (f, "Partition %d : ", x);
    805  1.1  mrg 	EXECUTE_IF_SET_IN_BITMAP (t->kill_list[x], 0, y, bi)
    806  1.1  mrg 	  fprintf (f, "_%d ",y);
    807  1.1  mrg       }
    808  1.1  mrg 
    809  1.1  mrg   fprintf (f, "\n----------\n");
    810  1.1  mrg }
    811