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