1 /* Convert a program in SSA form into Normal form.
2    Copyright (C) 2004-2020 Free Software Foundation, Inc.
3    Contributed by Andrew Macleod <amacleod@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 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "backend.h"
25 #include "rtl.h"
26 #include "tree.h"
27 #include "gimple.h"
28 #include "cfghooks.h"
29 #include "ssa.h"
30 #include "tree-ssa.h"
31 #include "memmodel.h"
32 #include "emit-rtl.h"
33 #include "gimple-pretty-print.h"
34 #include "diagnostic-core.h"
35 #include "tree-dfa.h"
36 #include "stor-layout.h"
37 #include "cfgrtl.h"
38 #include "cfganal.h"
39 #include "tree-eh.h"
40 #include "gimple-iterator.h"
41 #include "tree-cfg.h"
42 #include "dumpfile.h"
43 #include "tree-ssa-live.h"
44 #include "tree-ssa-ter.h"
45 #include "tree-ssa-coalesce.h"
46 #include "tree-outof-ssa.h"
47 #include "dojump.h"
48 
49 /* FIXME: A lot of code here deals with expanding to RTL.  All that code
50    should be in cfgexpand.c.  */
51 #include "explow.h"
52 #include "expr.h"
53 
54 /* Return TRUE if expression STMT is suitable for replacement.  */
55 
56 bool
ssa_is_replaceable_p(gimple * stmt)57 ssa_is_replaceable_p (gimple *stmt)
58 {
59   use_operand_p use_p;
60   tree def;
61   gimple *use_stmt;
62 
63   /* Only consider modify stmts.  */
64   if (!is_gimple_assign (stmt))
65     return false;
66 
67   /* If the statement may throw an exception, it cannot be replaced.  */
68   if (stmt_could_throw_p (cfun, stmt))
69     return false;
70 
71   /* Punt if there is more than 1 def.  */
72   def = SINGLE_SSA_TREE_OPERAND (stmt, SSA_OP_DEF);
73   if (!def)
74     return false;
75 
76   /* Only consider definitions which have a single use.  */
77   if (!single_imm_use (def, &use_p, &use_stmt))
78     return false;
79 
80   /* Used in this block, but at the TOP of the block, not the end.  */
81   if (gimple_code (use_stmt) == GIMPLE_PHI)
82     return false;
83 
84   /* There must be no VDEFs.  */
85   if (gimple_vdef (stmt))
86     return false;
87 
88   /* Float expressions must go through memory if float-store is on.  */
89   if (flag_float_store
90       && FLOAT_TYPE_P (gimple_expr_type (stmt)))
91     return false;
92 
93   /* An assignment with a register variable on the RHS is not
94      replaceable.  */
95   if (gimple_assign_rhs_code (stmt) == VAR_DECL
96       && DECL_HARD_REGISTER (gimple_assign_rhs1 (stmt)))
97     return false;
98 
99   /* No function calls can be replaced.  */
100   if (is_gimple_call (stmt))
101     return false;
102 
103   /* Leave any stmt with volatile operands alone as well.  */
104   if (gimple_has_volatile_ops (stmt))
105     return false;
106 
107   return true;
108 }
109 
110 
111 /* Used to hold all the components required to do SSA PHI elimination.
112    The node and pred/succ list is a simple linear list of nodes and
113    edges represented as pairs of nodes.
114 
115    The predecessor and successor list:  Nodes are entered in pairs, where
116    [0] ->PRED, [1]->SUCC.  All the even indexes in the array represent
117    predecessors, all the odd elements are successors.
118 
119    Rationale:
120    When implemented as bitmaps, very large programs SSA->Normal times were
121    being dominated by clearing the interference graph.
122 
123    Typically this list of edges is extremely small since it only includes
124    PHI results and uses from a single edge which have not coalesced with
125    each other.  This means that no virtual PHI nodes are included, and
126    empirical evidence suggests that the number of edges rarely exceed
127    3, and in a bootstrap of GCC, the maximum size encountered was 7.
128    This also limits the number of possible nodes that are involved to
129    rarely more than 6, and in the bootstrap of gcc, the maximum number
130    of nodes encountered was 12.  */
131 
132 class elim_graph
133 {
134 public:
135   elim_graph (var_map map);
136 
137   /* Size of the elimination vectors.  */
138   int size;
139 
140   /* List of nodes in the elimination graph.  */
141   auto_vec<int> nodes;
142 
143   /*  The predecessor and successor edge list.  */
144   auto_vec<int> edge_list;
145 
146   /* Source locus on each edge */
147   auto_vec<location_t> edge_locus;
148 
149   /* Visited vector.  */
150   auto_sbitmap visited;
151 
152   /* Stack for visited nodes.  */
153   auto_vec<int> stack;
154 
155   /* The variable partition map.  */
156   var_map map;
157 
158   /* Edge being eliminated by this graph.  */
159   edge e;
160 
161   /* List of constant copies to emit.  These are pushed on in pairs.  */
162   auto_vec<int> const_dests;
163   auto_vec<tree> const_copies;
164 
165   /* Source locations for any constant copies.  */
166   auto_vec<location_t> copy_locus;
167 };
168 
169 
170 /* For an edge E find out a good source location to associate with
171    instructions inserted on edge E.  If E has an implicit goto set,
172    use its location.  Otherwise search instructions in predecessors
173    of E for a location, and use that one.  That makes sense because
174    we insert on edges for PHI nodes, and effects of PHIs happen on
175    the end of the predecessor conceptually.  An exception is made
176    for EH edges because we don't want to drag the source location
177    of unrelated statements at the beginning of handlers; they would
178    be further reused for various EH constructs, which would damage
179    the coverage information.  */
180 
181 static void
set_location_for_edge(edge e)182 set_location_for_edge (edge e)
183 {
184   if (e->goto_locus)
185     set_curr_insn_location (e->goto_locus);
186   else if (e->flags & EDGE_EH)
187     {
188       basic_block bb = e->dest;
189       gimple_stmt_iterator gsi;
190 
191       do
192 	{
193 	  for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
194 	    {
195 	      gimple *stmt = gsi_stmt (gsi);
196 	      if (is_gimple_debug (stmt))
197 		continue;
198 	      if (gimple_has_location (stmt) || gimple_block (stmt))
199 		{
200 		  set_curr_insn_location (gimple_location (stmt));
201 		  return;
202 		}
203 	    }
204 	  /* Nothing found in this basic block.  Make a half-assed attempt
205 	     to continue with another block.  */
206 	  if (single_succ_p (bb))
207 	    bb = single_succ (bb);
208 	  else
209 	    bb = e->dest;
210 	}
211       while (bb != e->dest);
212     }
213   else
214     {
215       basic_block bb = e->src;
216       gimple_stmt_iterator gsi;
217 
218       do
219 	{
220 	  for (gsi = gsi_last_bb (bb); !gsi_end_p (gsi); gsi_prev (&gsi))
221 	    {
222 	      gimple *stmt = gsi_stmt (gsi);
223 	      if (is_gimple_debug (stmt))
224 		continue;
225 	      if (gimple_has_location (stmt) || gimple_block (stmt))
226 		{
227 		  set_curr_insn_location (gimple_location (stmt));
228 		  return;
229 		}
230 	    }
231 	  /* Nothing found in this basic block.  Make a half-assed attempt
232 	     to continue with another block.  */
233 	  if (single_pred_p (bb))
234 	    bb = single_pred (bb);
235 	  else
236 	    bb = e->src;
237 	}
238       while (bb != e->src);
239     }
240 }
241 
242 /* Emit insns to copy SRC into DEST converting SRC if necessary.  As
243    SRC/DEST might be BLKmode memory locations SIZEEXP is a tree from
244    which we deduce the size to copy in that case.  */
245 
246 static inline rtx_insn *
emit_partition_copy(rtx dest,rtx src,int unsignedsrcp,tree sizeexp)247 emit_partition_copy (rtx dest, rtx src, int unsignedsrcp, tree sizeexp)
248 {
249   start_sequence ();
250 
251   if (GET_MODE (src) != VOIDmode && GET_MODE (src) != GET_MODE (dest))
252     src = convert_to_mode (GET_MODE (dest), src, unsignedsrcp);
253   if (GET_MODE (src) == BLKmode)
254     {
255       gcc_assert (GET_MODE (dest) == BLKmode);
256       emit_block_move (dest, src, expr_size (sizeexp), BLOCK_OP_NORMAL);
257     }
258   else
259     emit_move_insn (dest, src);
260   do_pending_stack_adjust ();
261 
262   rtx_insn *seq = get_insns ();
263   end_sequence ();
264 
265   return seq;
266 }
267 
268 /* Insert a copy instruction from partition SRC to DEST onto edge E.  */
269 
270 static void
insert_partition_copy_on_edge(edge e,int dest,int src,location_t locus)271 insert_partition_copy_on_edge (edge e, int dest, int src, location_t locus)
272 {
273   tree var;
274   if (dump_file && (dump_flags & TDF_DETAILS))
275     {
276       fprintf (dump_file,
277 	       "Inserting a partition copy on edge BB%d->BB%d : "
278 	       "PART.%d = PART.%d",
279 	       e->src->index,
280 	       e->dest->index, dest, src);
281       fprintf (dump_file, "\n");
282     }
283 
284   gcc_assert (SA.partition_to_pseudo[dest]);
285   gcc_assert (SA.partition_to_pseudo[src]);
286 
287   set_location_for_edge (e);
288   /* If a locus is provided, override the default.  */
289   if (locus)
290     set_curr_insn_location (locus);
291 
292   var = partition_to_var (SA.map, src);
293   rtx_insn *seq = emit_partition_copy (copy_rtx (SA.partition_to_pseudo[dest]),
294 				       copy_rtx (SA.partition_to_pseudo[src]),
295 				       TYPE_UNSIGNED (TREE_TYPE (var)),
296 				       var);
297 
298   insert_insn_on_edge (seq, e);
299 }
300 
301 /* Insert a copy instruction from expression SRC to partition DEST
302    onto edge E.  */
303 
304 static void
insert_value_copy_on_edge(edge e,int dest,tree src,location_t locus)305 insert_value_copy_on_edge (edge e, int dest, tree src, location_t locus)
306 {
307   rtx dest_rtx, seq, x;
308   machine_mode dest_mode, src_mode;
309   int unsignedp;
310 
311   if (dump_file && (dump_flags & TDF_DETAILS))
312     {
313       fprintf (dump_file,
314 	       "Inserting a value copy on edge BB%d->BB%d : PART.%d = ",
315 	       e->src->index,
316 	       e->dest->index, dest);
317       print_generic_expr (dump_file, src, TDF_SLIM);
318       fprintf (dump_file, "\n");
319     }
320 
321   dest_rtx = copy_rtx (SA.partition_to_pseudo[dest]);
322   gcc_assert (dest_rtx);
323 
324   set_location_for_edge (e);
325   /* If a locus is provided, override the default.  */
326   if (locus)
327     set_curr_insn_location (locus);
328 
329   start_sequence ();
330 
331   tree name = partition_to_var (SA.map, dest);
332   src_mode = TYPE_MODE (TREE_TYPE (src));
333   dest_mode = GET_MODE (dest_rtx);
334   gcc_assert (src_mode == TYPE_MODE (TREE_TYPE (name)));
335   gcc_assert (!REG_P (dest_rtx)
336 	      || dest_mode == promote_ssa_mode (name, &unsignedp));
337 
338   if (src_mode != dest_mode)
339     {
340       x = expand_expr (src, NULL, src_mode, EXPAND_NORMAL);
341       x = convert_modes (dest_mode, src_mode, x, unsignedp);
342     }
343   else if (src_mode == BLKmode)
344     {
345       x = dest_rtx;
346       store_expr (src, x, 0, false, false);
347     }
348   else
349     x = expand_expr (src, dest_rtx, dest_mode, EXPAND_NORMAL);
350 
351   if (x != dest_rtx)
352     emit_move_insn (dest_rtx, x);
353   do_pending_stack_adjust ();
354 
355   seq = get_insns ();
356   end_sequence ();
357 
358   insert_insn_on_edge (seq, e);
359 }
360 
361 /* Insert a copy instruction from RTL expression SRC to partition DEST
362    onto edge E.  */
363 
364 static void
insert_rtx_to_part_on_edge(edge e,int dest,rtx src,int unsignedsrcp,location_t locus)365 insert_rtx_to_part_on_edge (edge e, int dest, rtx src, int unsignedsrcp,
366 			    location_t locus)
367 {
368   if (dump_file && (dump_flags & TDF_DETAILS))
369     {
370       fprintf (dump_file,
371 	       "Inserting a temp copy on edge BB%d->BB%d : PART.%d = ",
372 	       e->src->index,
373 	       e->dest->index, dest);
374       print_simple_rtl (dump_file, src);
375       fprintf (dump_file, "\n");
376     }
377 
378   gcc_assert (SA.partition_to_pseudo[dest]);
379 
380   set_location_for_edge (e);
381   /* If a locus is provided, override the default.  */
382   if (locus)
383     set_curr_insn_location (locus);
384 
385   /* We give the destination as sizeexp in case src/dest are BLKmode
386      mems.  Usually we give the source.  As we result from SSA names
387      the left and right size should be the same (and no WITH_SIZE_EXPR
388      involved), so it doesn't matter.  */
389   rtx_insn *seq = emit_partition_copy (copy_rtx (SA.partition_to_pseudo[dest]),
390 				       src, unsignedsrcp,
391 				       partition_to_var (SA.map, dest));
392 
393   insert_insn_on_edge (seq, e);
394 }
395 
396 /* Insert a copy instruction from partition SRC to RTL lvalue DEST
397    onto edge E.  */
398 
399 static void
insert_part_to_rtx_on_edge(edge e,rtx dest,int src,location_t locus)400 insert_part_to_rtx_on_edge (edge e, rtx dest, int src, location_t locus)
401 {
402   tree var;
403   if (dump_file && (dump_flags & TDF_DETAILS))
404     {
405       fprintf (dump_file,
406 	       "Inserting a temp copy on edge BB%d->BB%d : ",
407 	       e->src->index,
408 	       e->dest->index);
409       print_simple_rtl (dump_file, dest);
410       fprintf (dump_file, "= PART.%d\n", src);
411     }
412 
413   gcc_assert (SA.partition_to_pseudo[src]);
414 
415   set_location_for_edge (e);
416   /* If a locus is provided, override the default.  */
417   if (locus)
418     set_curr_insn_location (locus);
419 
420   var = partition_to_var (SA.map, src);
421   rtx_insn *seq = emit_partition_copy (dest,
422 				       copy_rtx (SA.partition_to_pseudo[src]),
423 				       TYPE_UNSIGNED (TREE_TYPE (var)),
424 				       var);
425 
426   insert_insn_on_edge (seq, e);
427 }
428 
429 
430 /* Create an elimination graph for map.  */
431 
elim_graph(var_map map)432 elim_graph::elim_graph (var_map map) :
433   nodes (30), edge_list (20), edge_locus (10), visited (map->num_partitions),
434   stack (30), map (map), const_dests (20), const_copies (20), copy_locus (10)
435 {
436 }
437 
438 
439 /* Empty elimination graph G.  */
440 
441 static inline void
clear_elim_graph(elim_graph * g)442 clear_elim_graph (elim_graph *g)
443 {
444   g->nodes.truncate (0);
445   g->edge_list.truncate (0);
446   g->edge_locus.truncate (0);
447 }
448 
449 
450 /* Return the number of nodes in graph G.  */
451 
452 static inline int
elim_graph_size(elim_graph * g)453 elim_graph_size (elim_graph *g)
454 {
455   return g->nodes.length ();
456 }
457 
458 
459 /* Add NODE to graph G, if it doesn't exist already.  */
460 
461 static inline void
elim_graph_add_node(elim_graph * g,int node)462 elim_graph_add_node (elim_graph *g, int node)
463 {
464   int x;
465   int t;
466 
467   FOR_EACH_VEC_ELT (g->nodes, x, t)
468     if (t == node)
469       return;
470   g->nodes.safe_push (node);
471 }
472 
473 
474 /* Add the edge PRED->SUCC to graph G.  */
475 
476 static inline void
elim_graph_add_edge(elim_graph * g,int pred,int succ,location_t locus)477 elim_graph_add_edge (elim_graph *g, int pred, int succ, location_t locus)
478 {
479   g->edge_list.safe_push (pred);
480   g->edge_list.safe_push (succ);
481   g->edge_locus.safe_push (locus);
482 }
483 
484 
485 /* Remove an edge from graph G for which NODE is the predecessor, and
486    return the successor node.  -1 is returned if there is no such edge.  */
487 
488 static inline int
elim_graph_remove_succ_edge(elim_graph * g,int node,location_t * locus)489 elim_graph_remove_succ_edge (elim_graph *g, int node, location_t *locus)
490 {
491   int y;
492   unsigned x;
493   for (x = 0; x < g->edge_list.length (); x += 2)
494     if (g->edge_list[x] == node)
495       {
496         g->edge_list[x] = -1;
497 	y = g->edge_list[x + 1];
498 	g->edge_list[x + 1] = -1;
499 	*locus = g->edge_locus[x / 2];
500 	g->edge_locus[x / 2] = UNKNOWN_LOCATION;
501 	return y;
502       }
503   *locus = UNKNOWN_LOCATION;
504   return -1;
505 }
506 
507 
508 /* Find all the nodes in GRAPH which are successors to NODE in the
509    edge list.  VAR will hold the partition number found.  CODE is the
510    code fragment executed for every node found.  */
511 
512 #define FOR_EACH_ELIM_GRAPH_SUCC(GRAPH, NODE, VAR, LOCUS, CODE)		\
513 do {									\
514   unsigned x_;								\
515   int y_;								\
516   for (x_ = 0; x_ < (GRAPH)->edge_list.length (); x_ += 2)	\
517     {									\
518       y_ = (GRAPH)->edge_list[x_];					\
519       if (y_ != (NODE))							\
520         continue;							\
521       (void) ((VAR) = (GRAPH)->edge_list[x_ + 1]);			\
522       (void) ((LOCUS) = (GRAPH)->edge_locus[x_ / 2]);			\
523       CODE;								\
524     }									\
525 } while (0)
526 
527 
528 /* Find all the nodes which are predecessors of NODE in the edge list for
529    GRAPH.  VAR will hold the partition number found.  CODE is the
530    code fragment executed for every node found.  */
531 
532 #define FOR_EACH_ELIM_GRAPH_PRED(GRAPH, NODE, VAR, LOCUS, CODE)		\
533 do {									\
534   unsigned x_;								\
535   int y_;								\
536   for (x_ = 0; x_ < (GRAPH)->edge_list.length (); x_ += 2)	\
537     {									\
538       y_ = (GRAPH)->edge_list[x_ + 1];					\
539       if (y_ != (NODE))							\
540         continue;							\
541       (void) ((VAR) = (GRAPH)->edge_list[x_]);				\
542       (void) ((LOCUS) = (GRAPH)->edge_locus[x_ / 2]);			\
543       CODE;								\
544     }									\
545 } while (0)
546 
547 
548 /* Add T to elimination graph G.  */
549 
550 static inline void
eliminate_name(elim_graph * g,int T)551 eliminate_name (elim_graph *g, int T)
552 {
553   elim_graph_add_node (g, T);
554 }
555 
556 /* Return true if this phi argument T should have a copy queued when using
557    var_map MAP.  PHI nodes should contain only ssa_names and invariants.  A
558    test for ssa_name is definitely simpler, but don't let invalid contents
559    slip through in the meantime.  */
560 
561 static inline bool
queue_phi_copy_p(var_map map,tree t)562 queue_phi_copy_p (var_map map, tree t)
563 {
564   if (TREE_CODE (t) == SSA_NAME)
565     {
566       if (var_to_partition (map, t) == NO_PARTITION)
567         return true;
568       return false;
569     }
570   gcc_checking_assert (is_gimple_min_invariant (t));
571   return true;
572 }
573 
574 /* Build elimination graph G for basic block BB on incoming PHI edge
575    G->e.  */
576 
577 static void
eliminate_build(elim_graph * g)578 eliminate_build (elim_graph *g)
579 {
580   tree Ti;
581   int p0, pi;
582   gphi_iterator gsi;
583 
584   clear_elim_graph (g);
585 
586   for (gsi = gsi_start_phis (g->e->dest); !gsi_end_p (gsi); gsi_next (&gsi))
587     {
588       gphi *phi = gsi.phi ();
589       location_t locus;
590 
591       p0 = var_to_partition (g->map, gimple_phi_result (phi));
592       /* Ignore results which are not in partitions.  */
593       if (p0 == NO_PARTITION)
594 	continue;
595 
596       Ti = PHI_ARG_DEF (phi, g->e->dest_idx);
597       /* See set_location_for_edge for the rationale.  */
598       if (g->e->flags & EDGE_EH)
599 	locus = UNKNOWN_LOCATION;
600       else
601 	locus = gimple_phi_arg_location_from_edge (phi, g->e);
602 
603       /* If this argument is a constant, or a SSA_NAME which is being
604 	 left in SSA form, just queue a copy to be emitted on this
605 	 edge.  */
606       if (queue_phi_copy_p (g->map, Ti))
607         {
608 	  /* Save constant copies until all other copies have been emitted
609 	     on this edge.  */
610 	  g->const_dests.safe_push (p0);
611 	  g->const_copies.safe_push (Ti);
612 	  g->copy_locus.safe_push (locus);
613 	}
614       else
615         {
616 	  pi = var_to_partition (g->map, Ti);
617 	  if (p0 != pi)
618 	    {
619 	      eliminate_name (g, p0);
620 	      eliminate_name (g, pi);
621 	      elim_graph_add_edge (g, p0, pi, locus);
622 	    }
623 	}
624     }
625 }
626 
627 
628 /* Push successors of T onto the elimination stack for G.  */
629 
630 static void
elim_forward(elim_graph * g,int T)631 elim_forward (elim_graph *g, int T)
632 {
633   int S;
634   location_t locus;
635 
636   bitmap_set_bit (g->visited, T);
637   FOR_EACH_ELIM_GRAPH_SUCC (g, T, S, locus,
638     {
639       if (!bitmap_bit_p (g->visited, S))
640         elim_forward (g, S);
641     });
642   g->stack.safe_push (T);
643 }
644 
645 
646 /* Return 1 if there unvisited predecessors of T in graph G.  */
647 
648 static int
elim_unvisited_predecessor(elim_graph * g,int T)649 elim_unvisited_predecessor (elim_graph *g, int T)
650 {
651   int P;
652   location_t locus;
653 
654   FOR_EACH_ELIM_GRAPH_PRED (g, T, P, locus,
655     {
656       if (!bitmap_bit_p (g->visited, P))
657         return 1;
658     });
659   return 0;
660 }
661 
662 /* Process predecessors first, and insert a copy.  */
663 
664 static void
elim_backward(elim_graph * g,int T)665 elim_backward (elim_graph *g, int T)
666 {
667   int P;
668   location_t locus;
669 
670   bitmap_set_bit (g->visited, T);
671   FOR_EACH_ELIM_GRAPH_PRED (g, T, P, locus,
672     {
673       if (!bitmap_bit_p (g->visited, P))
674         {
675 	  elim_backward (g, P);
676 	  insert_partition_copy_on_edge (g->e, P, T, locus);
677 	}
678     });
679 }
680 
681 /* Allocate a new pseudo register usable for storing values sitting
682    in NAME (a decl or SSA name), i.e. with matching mode and attributes.  */
683 
684 static rtx
get_temp_reg(tree name)685 get_temp_reg (tree name)
686 {
687   tree type = TREE_TYPE (name);
688   int unsignedp;
689   machine_mode reg_mode = promote_ssa_mode (name, &unsignedp);
690   if (reg_mode == BLKmode)
691     return assign_temp (type, 0, 0);
692   rtx x = gen_reg_rtx (reg_mode);
693   if (POINTER_TYPE_P (type))
694     mark_reg_pointer (x, TYPE_ALIGN (TREE_TYPE (type)));
695   return x;
696 }
697 
698 /* Insert required copies for T in graph G.  Check for a strongly connected
699    region, and create a temporary to break the cycle if one is found.  */
700 
701 static void
elim_create(elim_graph * g,int T)702 elim_create (elim_graph *g, int T)
703 {
704   int P, S;
705   location_t locus;
706 
707   if (elim_unvisited_predecessor (g, T))
708     {
709       tree var = partition_to_var (g->map, T);
710       rtx U = get_temp_reg (var);
711       int unsignedsrcp = TYPE_UNSIGNED (TREE_TYPE (var));
712 
713       insert_part_to_rtx_on_edge (g->e, U, T, UNKNOWN_LOCATION);
714       FOR_EACH_ELIM_GRAPH_PRED (g, T, P, locus,
715 	{
716 	  if (!bitmap_bit_p (g->visited, P))
717 	    {
718 	      elim_backward (g, P);
719 	      insert_rtx_to_part_on_edge (g->e, P, U, unsignedsrcp, locus);
720 	    }
721 	});
722     }
723   else
724     {
725       S = elim_graph_remove_succ_edge (g, T, &locus);
726       if (S != -1)
727 	{
728 	  bitmap_set_bit (g->visited, T);
729 	  insert_partition_copy_on_edge (g->e, T, S, locus);
730 	}
731     }
732 }
733 
734 
735 /* Eliminate all the phi nodes on edge E in graph G.  */
736 
737 static void
eliminate_phi(edge e,elim_graph * g)738 eliminate_phi (edge e, elim_graph *g)
739 {
740   int x;
741 
742   gcc_assert (g->const_copies.length () == 0);
743   gcc_assert (g->copy_locus.length () == 0);
744 
745   /* Abnormal edges already have everything coalesced.  */
746   if (e->flags & EDGE_ABNORMAL)
747     return;
748 
749   g->e = e;
750 
751   eliminate_build (g);
752 
753   if (elim_graph_size (g) != 0)
754     {
755       int part;
756 
757       bitmap_clear (g->visited);
758       g->stack.truncate (0);
759 
760       FOR_EACH_VEC_ELT (g->nodes, x, part)
761         {
762 	  if (!bitmap_bit_p (g->visited, part))
763 	    elim_forward (g, part);
764 	}
765 
766       bitmap_clear (g->visited);
767       while (g->stack.length () > 0)
768 	{
769 	  x = g->stack.pop ();
770 	  if (!bitmap_bit_p (g->visited, x))
771 	    elim_create (g, x);
772 	}
773     }
774 
775   /* If there are any pending constant copies, issue them now.  */
776   while (g->const_copies.length () > 0)
777     {
778       int dest;
779       tree src;
780       location_t locus;
781 
782       src = g->const_copies.pop ();
783       dest = g->const_dests.pop ();
784       locus = g->copy_locus.pop ();
785       insert_value_copy_on_edge (e, dest, src, locus);
786     }
787 }
788 
789 
790 /* Remove each argument from PHI.  If an arg was the last use of an SSA_NAME,
791    check to see if this allows another PHI node to be removed.  */
792 
793 static void
remove_gimple_phi_args(gphi * phi)794 remove_gimple_phi_args (gphi *phi)
795 {
796   use_operand_p arg_p;
797   ssa_op_iter iter;
798 
799   if (dump_file && (dump_flags & TDF_DETAILS))
800     {
801       fprintf (dump_file, "Removing Dead PHI definition: ");
802       print_gimple_stmt (dump_file, phi, 0, TDF_SLIM);
803     }
804 
805   FOR_EACH_PHI_ARG (arg_p, phi, iter, SSA_OP_USE)
806     {
807       tree arg = USE_FROM_PTR (arg_p);
808       if (TREE_CODE (arg) == SSA_NAME)
809         {
810 	  /* Remove the reference to the existing argument.  */
811 	  SET_USE (arg_p, NULL_TREE);
812 	  if (has_zero_uses (arg))
813 	    {
814 	      gimple *stmt;
815 	      gimple_stmt_iterator gsi;
816 
817 	      stmt = SSA_NAME_DEF_STMT (arg);
818 
819 	      /* Also remove the def if it is a PHI node.  */
820 	      if (gimple_code (stmt) == GIMPLE_PHI)
821 		{
822 		  remove_gimple_phi_args (as_a <gphi *> (stmt));
823 		  gsi = gsi_for_stmt (stmt);
824 		  remove_phi_node (&gsi, true);
825 		}
826 
827 	    }
828 	}
829     }
830 }
831 
832 /* Remove any PHI node which is a virtual PHI, or a PHI with no uses.  */
833 
834 static void
eliminate_useless_phis(void)835 eliminate_useless_phis (void)
836 {
837   basic_block bb;
838   gphi_iterator gsi;
839   tree result;
840 
841   FOR_EACH_BB_FN (bb, cfun)
842     {
843       for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); )
844         {
845 	  gphi *phi = gsi.phi ();
846 	  result = gimple_phi_result (phi);
847 	  if (virtual_operand_p (result))
848 	    remove_phi_node (&gsi, true);
849           else
850 	    {
851 	      /* Also remove real PHIs with no uses.  */
852 	      if (has_zero_uses (result))
853 	        {
854 		  remove_gimple_phi_args (phi);
855 		  remove_phi_node (&gsi, true);
856 		}
857 	      else
858 		gsi_next (&gsi);
859 	    }
860 	}
861     }
862 }
863 
864 
865 /* This function will rewrite the current program using the variable mapping
866    found in MAP.  If the replacement vector VALUES is provided, any
867    occurrences of partitions with non-null entries in the vector will be
868    replaced with the expression in the vector instead of its mapped
869    variable.  */
870 
871 static void
rewrite_trees(var_map map)872 rewrite_trees (var_map map)
873 {
874   if (!flag_checking)
875     return;
876 
877   basic_block bb;
878   /* Search for PHIs where the destination has no partition, but one
879      or more arguments has a partition.  This should not happen and can
880      create incorrect code.  */
881   FOR_EACH_BB_FN (bb, cfun)
882     {
883       gphi_iterator gsi;
884       for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
885 	{
886 	  gphi *phi = gsi.phi ();
887 	  tree T0 = var_to_partition_to_var (map, gimple_phi_result (phi));
888 	  if (T0 == NULL_TREE)
889 	    {
890 	      size_t i;
891 	      for (i = 0; i < gimple_phi_num_args (phi); i++)
892 		{
893 		  tree arg = PHI_ARG_DEF (phi, i);
894 
895 		  if (TREE_CODE (arg) == SSA_NAME
896 		      && var_to_partition (map, arg) != NO_PARTITION)
897 		    {
898 		      fprintf (stderr, "Argument of PHI is in a partition :(");
899 		      print_generic_expr (stderr, arg, TDF_SLIM);
900 		      fprintf (stderr, "), but the result is not :");
901 		      print_gimple_stmt (stderr, phi, 0, TDF_SLIM);
902 		      internal_error ("SSA corruption");
903 		    }
904 		}
905 	    }
906 	}
907     }
908 }
909 
910 /* Create a default def for VAR.  */
911 
912 static void
create_default_def(tree var,void * arg ATTRIBUTE_UNUSED)913 create_default_def (tree var, void *arg ATTRIBUTE_UNUSED)
914 {
915   if (!is_gimple_reg (var))
916     return;
917 
918   tree ssa = get_or_create_ssa_default_def (cfun, var);
919   gcc_assert (ssa);
920 }
921 
922 /* Call CALLBACK for all PARM_DECLs and RESULT_DECLs for which
923    assign_parms may ask for a default partition.  */
924 
925 static void
for_all_parms(void (* callback)(tree var,void * arg),void * arg)926 for_all_parms (void (*callback)(tree var, void *arg), void *arg)
927 {
928   for (tree var = DECL_ARGUMENTS (current_function_decl); var;
929        var = DECL_CHAIN (var))
930     callback (var, arg);
931   if (!VOID_TYPE_P (TREE_TYPE (DECL_RESULT (current_function_decl))))
932     callback (DECL_RESULT (current_function_decl), arg);
933   if (cfun->static_chain_decl)
934     callback (cfun->static_chain_decl, arg);
935 }
936 
937 /* We need to pass two arguments to set_parm_default_def_partition,
938    but for_all_parms only supports one.  Use a pair.  */
939 
940 typedef std::pair<var_map, bitmap> parm_default_def_partition_arg;
941 
942 /* Set in ARG's PARTS bitmap the bit corresponding to the partition in
943    ARG's MAP containing VAR's default def.  */
944 
945 static void
set_parm_default_def_partition(tree var,void * arg_)946 set_parm_default_def_partition (tree var, void *arg_)
947 {
948   parm_default_def_partition_arg *arg = (parm_default_def_partition_arg *)arg_;
949   var_map map = arg->first;
950   bitmap parts = arg->second;
951 
952   if (!is_gimple_reg (var))
953     return;
954 
955   tree ssa = ssa_default_def (cfun, var);
956   gcc_assert (ssa);
957 
958   int version = var_to_partition (map, ssa);
959   gcc_assert (version != NO_PARTITION);
960 
961   bool changed = bitmap_set_bit (parts, version);
962   gcc_assert (changed);
963 }
964 
965 /* Allocate and return a bitmap that has a bit set for each partition
966    that contains a default def for a parameter.  */
967 
968 static bitmap
get_parm_default_def_partitions(var_map map)969 get_parm_default_def_partitions (var_map map)
970 {
971   bitmap parm_default_def_parts = BITMAP_ALLOC (NULL);
972 
973   parm_default_def_partition_arg
974     arg = std::make_pair (map, parm_default_def_parts);
975 
976   for_all_parms (set_parm_default_def_partition, &arg);
977 
978   return parm_default_def_parts;
979 }
980 
981 /* Allocate and return a bitmap that has a bit set for each partition
982    that contains an undefined value.  */
983 
984 static bitmap
get_undefined_value_partitions(var_map map)985 get_undefined_value_partitions (var_map map)
986 {
987   bitmap undefined_value_parts = BITMAP_ALLOC (NULL);
988 
989   for (unsigned int i = 1; i < num_ssa_names; i++)
990     {
991       tree var = ssa_name (i);
992       if (var
993 	  && !virtual_operand_p (var)
994 	  && !has_zero_uses (var)
995 	  && ssa_undefined_value_p (var))
996 	{
997 	  const int p = var_to_partition (map, var);
998 	  if (p != NO_PARTITION)
999 	    bitmap_set_bit (undefined_value_parts, p);
1000 	}
1001     }
1002 
1003   return undefined_value_parts;
1004 }
1005 
1006 /* Given the out-of-ssa info object SA (with prepared partitions)
1007    eliminate all phi nodes in all basic blocks.  Afterwards no
1008    basic block will have phi nodes anymore and there are possibly
1009    some RTL instructions inserted on edges.  */
1010 
1011 void
expand_phi_nodes(struct ssaexpand * sa)1012 expand_phi_nodes (struct ssaexpand *sa)
1013 {
1014   basic_block bb;
1015   elim_graph g (sa->map);
1016 
1017   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb,
1018 		  EXIT_BLOCK_PTR_FOR_FN (cfun), next_bb)
1019     if (!gimple_seq_empty_p (phi_nodes (bb)))
1020       {
1021 	edge e;
1022 	edge_iterator ei;
1023 	FOR_EACH_EDGE (e, ei, bb->preds)
1024 	  eliminate_phi (e, &g);
1025 	set_phi_nodes (bb, NULL);
1026 	/* We can't redirect EH edges in RTL land, so we need to do this
1027 	   here.  Redirection happens only when splitting is necessary,
1028 	   which it is only for critical edges, normally.  For EH edges
1029 	   it might also be necessary when the successor has more than
1030 	   one predecessor.  In that case the edge is either required to
1031 	   be fallthru (which EH edges aren't), or the predecessor needs
1032 	   to end with a jump (which again, isn't the case with EH edges).
1033 	   Hence, split all EH edges on which we inserted instructions
1034 	   and whose successor has multiple predecessors.  */
1035 	for (ei = ei_start (bb->preds); (e = ei_safe_edge (ei)); )
1036 	  {
1037 	    if (e->insns.r && (e->flags & EDGE_EH)
1038 		&& !single_pred_p (e->dest))
1039 	      {
1040 		rtx_insn *insns = e->insns.r;
1041 		basic_block bb;
1042 		e->insns.r = NULL;
1043 		bb = split_edge (e);
1044 		single_pred_edge (bb)->insns.r = insns;
1045 	      }
1046 	    else
1047 	      ei_next (&ei);
1048 	  }
1049       }
1050 }
1051 
1052 
1053 /* Remove the ssa-names in the current function and translate them into normal
1054    compiler variables.  PERFORM_TER is true if Temporary Expression Replacement
1055    should also be used.  */
1056 
1057 static void
remove_ssa_form(bool perform_ter,struct ssaexpand * sa)1058 remove_ssa_form (bool perform_ter, struct ssaexpand *sa)
1059 {
1060   bitmap values = NULL;
1061   var_map map;
1062 
1063   for_all_parms (create_default_def, NULL);
1064   map = init_var_map (num_ssa_names);
1065   coalesce_ssa_name (map);
1066 
1067   /* Return to viewing the variable list as just all reference variables after
1068      coalescing has been performed.  */
1069   partition_view_normal (map);
1070 
1071   if (dump_file && (dump_flags & TDF_DETAILS))
1072     {
1073       fprintf (dump_file, "After Coalescing:\n");
1074       dump_var_map (dump_file, map);
1075     }
1076 
1077   if (perform_ter)
1078     {
1079       values = find_replaceable_exprs (map);
1080       if (values && dump_file && (dump_flags & TDF_DETAILS))
1081 	dump_replaceable_exprs (dump_file, values);
1082     }
1083 
1084   rewrite_trees (map);
1085 
1086   sa->map = map;
1087   sa->values = values;
1088   sa->partitions_for_parm_default_defs = get_parm_default_def_partitions (map);
1089   sa->partitions_for_undefined_values = get_undefined_value_partitions (map);
1090 }
1091 
1092 
1093 /* If not already done so for basic block BB, assign increasing uids
1094    to each of its instructions.  */
1095 
1096 static void
maybe_renumber_stmts_bb(basic_block bb)1097 maybe_renumber_stmts_bb (basic_block bb)
1098 {
1099   unsigned i = 0;
1100   gimple_stmt_iterator gsi;
1101 
1102   if (!bb->aux)
1103     return;
1104   bb->aux = NULL;
1105   for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1106     {
1107       gimple *stmt = gsi_stmt (gsi);
1108       gimple_set_uid (stmt, i);
1109       i++;
1110     }
1111 }
1112 
1113 
1114 /* Return true if we can determine that the SSA_NAMEs RESULT (a result
1115    of a PHI node) and ARG (one of its arguments) conflict.  Return false
1116    otherwise, also when we simply aren't sure.  */
1117 
1118 static bool
trivially_conflicts_p(basic_block bb,tree result,tree arg)1119 trivially_conflicts_p (basic_block bb, tree result, tree arg)
1120 {
1121   use_operand_p use;
1122   imm_use_iterator imm_iter;
1123   gimple *defa = SSA_NAME_DEF_STMT (arg);
1124 
1125   /* If ARG isn't defined in the same block it's too complicated for
1126      our little mind.  */
1127   if (gimple_bb (defa) != bb)
1128     return false;
1129 
1130   FOR_EACH_IMM_USE_FAST (use, imm_iter, result)
1131     {
1132       gimple *use_stmt = USE_STMT (use);
1133       if (is_gimple_debug (use_stmt))
1134 	continue;
1135       /* Now, if there's a use of RESULT that lies outside this basic block,
1136 	 then there surely is a conflict with ARG.  */
1137       if (gimple_bb (use_stmt) != bb)
1138 	return true;
1139       if (gimple_code (use_stmt) == GIMPLE_PHI)
1140 	continue;
1141       /* The use now is in a real stmt of BB, so if ARG was defined
1142          in a PHI node (like RESULT) both conflict.  */
1143       if (gimple_code (defa) == GIMPLE_PHI)
1144 	return true;
1145       maybe_renumber_stmts_bb (bb);
1146       /* If the use of RESULT occurs after the definition of ARG,
1147          the two conflict too.  */
1148       if (gimple_uid (defa) < gimple_uid (use_stmt))
1149 	return true;
1150     }
1151 
1152   return false;
1153 }
1154 
1155 
1156 /* Search every PHI node for arguments associated with backedges which
1157    we can trivially determine will need a copy (the argument is either
1158    not an SSA_NAME or the argument has a different underlying variable
1159    than the PHI result).
1160 
1161    Insert a copy from the PHI argument to a new destination at the
1162    end of the block with the backedge to the top of the loop.  Update
1163    the PHI argument to reference this new destination.  */
1164 
1165 static void
insert_backedge_copies(void)1166 insert_backedge_copies (void)
1167 {
1168   basic_block bb;
1169   gphi_iterator gsi;
1170 
1171   mark_dfs_back_edges ();
1172 
1173   FOR_EACH_BB_FN (bb, cfun)
1174     {
1175       /* Mark block as possibly needing calculation of UIDs.  */
1176       bb->aux = &bb->aux;
1177 
1178       for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1179 	{
1180 	  gphi *phi = gsi.phi ();
1181 	  tree result = gimple_phi_result (phi);
1182 	  size_t i;
1183 
1184 	  if (virtual_operand_p (result))
1185 	    continue;
1186 
1187 	  for (i = 0; i < gimple_phi_num_args (phi); i++)
1188 	    {
1189 	      tree arg = gimple_phi_arg_def (phi, i);
1190 	      edge e = gimple_phi_arg_edge (phi, i);
1191 	      /* We are only interested in copies emitted on critical
1192                  backedges.  */
1193 	      if (!(e->flags & EDGE_DFS_BACK)
1194 		  || !EDGE_CRITICAL_P (e))
1195 		continue;
1196 
1197 	      /* If the argument is not an SSA_NAME, then we will need a
1198 		 constant initialization.  If the argument is an SSA_NAME then
1199 		 a copy statement may be needed.  First handle the case
1200 		 where we cannot insert before the argument definition.  */
1201 	      if (TREE_CODE (arg) != SSA_NAME
1202 		  || (gimple_code (SSA_NAME_DEF_STMT (arg)) == GIMPLE_PHI
1203 		      && trivially_conflicts_p (bb, result, arg)))
1204 		{
1205 		  tree name;
1206 		  gassign *stmt;
1207 		  gimple *last = NULL;
1208 		  gimple_stmt_iterator gsi2;
1209 
1210 		  gsi2 = gsi_last_bb (gimple_phi_arg_edge (phi, i)->src);
1211 		  if (!gsi_end_p (gsi2))
1212 		    last = gsi_stmt (gsi2);
1213 
1214 		  /* In theory the only way we ought to get back to the
1215 		     start of a loop should be with a COND_EXPR or GOTO_EXPR.
1216 		     However, better safe than sorry.
1217 		     If the block ends with a control statement or
1218 		     something that might throw, then we have to
1219 		     insert this assignment before the last
1220 		     statement.  Else insert it after the last statement.  */
1221 		  if (last && stmt_ends_bb_p (last))
1222 		    {
1223 		      /* If the last statement in the block is the definition
1224 			 site of the PHI argument, then we can't insert
1225 			 anything after it.  */
1226 		      if (TREE_CODE (arg) == SSA_NAME
1227 			  && SSA_NAME_DEF_STMT (arg) == last)
1228 			continue;
1229 		    }
1230 
1231 		  /* Create a new instance of the underlying variable of the
1232 		     PHI result.  */
1233 		  name = copy_ssa_name (result);
1234 		  stmt = gimple_build_assign (name,
1235 					      gimple_phi_arg_def (phi, i));
1236 
1237 		  /* copy location if present.  */
1238 		  if (gimple_phi_arg_has_location (phi, i))
1239 		    gimple_set_location (stmt,
1240 					 gimple_phi_arg_location (phi, i));
1241 
1242 		  /* Insert the new statement into the block and update
1243 		     the PHI node.  */
1244 		  if (last && stmt_ends_bb_p (last))
1245 		    gsi_insert_before (&gsi2, stmt, GSI_NEW_STMT);
1246 		  else
1247 		    gsi_insert_after (&gsi2, stmt, GSI_NEW_STMT);
1248 		  SET_PHI_ARG_DEF (phi, i, name);
1249 		}
1250 	      /* Insert a copy before the definition of the backedge value
1251 		 and adjust all conflicting uses.  */
1252 	      else if (trivially_conflicts_p (bb, result, arg))
1253 		{
1254 		  gimple *def = SSA_NAME_DEF_STMT (arg);
1255 		  if (gimple_nop_p (def)
1256 		      || gimple_code (def) == GIMPLE_PHI)
1257 		    continue;
1258 		  tree name = copy_ssa_name (result);
1259 		  gimple *stmt = gimple_build_assign (name, result);
1260 		  imm_use_iterator imm_iter;
1261 		  gimple *use_stmt;
1262 		  /* The following matches trivially_conflicts_p.  */
1263 		  FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, result)
1264 		    {
1265 		      if (gimple_bb (use_stmt) != bb
1266 			  || (gimple_code (use_stmt) != GIMPLE_PHI
1267 			      && (maybe_renumber_stmts_bb (bb), true)
1268 			      && gimple_uid (use_stmt) > gimple_uid (def)))
1269 			{
1270 			  use_operand_p use;
1271 			  FOR_EACH_IMM_USE_ON_STMT (use, imm_iter)
1272 			    SET_USE (use, name);
1273 			}
1274 		    }
1275 		  gimple_stmt_iterator gsi = gsi_for_stmt (def);
1276 		  gsi_insert_before (&gsi, stmt, GSI_SAME_STMT);
1277 		}
1278 	    }
1279 	}
1280 
1281       /* Unmark this block again.  */
1282       bb->aux = NULL;
1283     }
1284 }
1285 
1286 /* Free all memory associated with going out of SSA form.  SA is
1287    the outof-SSA info object.  */
1288 
1289 void
finish_out_of_ssa(struct ssaexpand * sa)1290 finish_out_of_ssa (struct ssaexpand *sa)
1291 {
1292   free (sa->partition_to_pseudo);
1293   if (sa->values)
1294     BITMAP_FREE (sa->values);
1295   delete_var_map (sa->map);
1296   BITMAP_FREE (sa->partitions_for_parm_default_defs);
1297   BITMAP_FREE (sa->partitions_for_undefined_values);
1298   memset (sa, 0, sizeof *sa);
1299 }
1300 
1301 /* Take the current function out of SSA form, translating PHIs as described in
1302    R. Morgan, ``Building an Optimizing Compiler'',
1303    Butterworth-Heinemann, Boston, MA, 1998. pp 176-186.  */
1304 
1305 unsigned int
rewrite_out_of_ssa(struct ssaexpand * sa)1306 rewrite_out_of_ssa (struct ssaexpand *sa)
1307 {
1308   /* If elimination of a PHI requires inserting a copy on a backedge,
1309      then we will have to split the backedge which has numerous
1310      undesirable performance effects.
1311 
1312      A significant number of such cases can be handled here by inserting
1313      copies into the loop itself.  */
1314   insert_backedge_copies ();
1315 
1316 
1317   /* Eliminate PHIs which are of no use, such as virtual or dead phis.  */
1318   eliminate_useless_phis ();
1319 
1320   if (dump_file && (dump_flags & TDF_DETAILS))
1321     gimple_dump_cfg (dump_file, dump_flags & ~TDF_DETAILS);
1322 
1323   remove_ssa_form (flag_tree_ter, sa);
1324 
1325   if (dump_file && (dump_flags & TDF_DETAILS))
1326     gimple_dump_cfg (dump_file, dump_flags & ~TDF_DETAILS);
1327 
1328   return 0;
1329 }
1330