gensupport.c: Include hashtab.h.
[gcc.git] / gcc / ssa-ccp.c
1 /* Conditional constant propagation pass for the GNU compiler.
2 Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
3 Original framework by Daniel Berlin <dan@cgsoftware.com>
4 Fleshed out and major cleanups by Jeff Law <law@redhat.com>
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING. If not, write to the Free
20 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
21 02111-1307, USA. */
22
23 /* Conditional constant propagation.
24
25 References:
26
27 Constant propagation with conditional branches,
28 Wegman and Zadeck, ACM TOPLAS 13(2):181-210.
29
30 Building an Optimizing Compiler,
31 Robert Morgan, Butterworth-Heinemann, 1998, Section 8.9.
32
33 Advanced Compiler Design and Implementation,
34 Steven Muchnick, Morgan Kaufmann, 1997, Section 12.6
35
36 The overall structure is as follows:
37
38 1. Run a simple SSA based DCE pass to remove any dead code.
39 2. Run CCP to compute what registers are known constants
40 and what edges are not executable. Remove unexecutable
41 edges from the CFG and simplify PHI nodes.
42 3. Replace registers with constants where possible.
43 4. Remove unreachable blocks computed in step #2.
44 5. Another simple SSA DCE pass to remove dead code exposed
45 by CCP.
46
47 When we exit, we are still in SSA form.
48
49
50 Potential further enhancements:
51
52 1. Handle SUBREGs, STRICT_LOW_PART, etc in destinations more
53 gracefully.
54
55 2. Handle insns with multiple outputs more gracefully.
56
57 3. Handle CONST_DOUBLE and symbolic constants.
58
59 4. Fold expressions after performing constant substitutions. */
60
61
62 #include "config.h"
63 #include "system.h"
64
65 #include "rtl.h"
66 #include "hard-reg-set.h"
67 #include "basic-block.h"
68 #include "ssa.h"
69 #include "insn-config.h"
70 #include "recog.h"
71 #include "output.h"
72 #include "errors.h"
73 #include "ggc.h"
74 #include "df.h"
75 #include "function.h"
76 \f
77 /* Possible lattice values. */
78
79 typedef enum
80 {
81 UNDEFINED,
82 CONSTANT,
83 VARYING
84 } latticevalue;
85
86 /* Main structure for CCP.
87
88 Contains the lattice value and, if it's a constant, the constant
89 value. */
90 typedef struct
91 {
92 latticevalue lattice_val;
93 rtx const_value;
94 } value;
95
96 /* Array of values indexed by register number. */
97 static value *values;
98
99 /* A bitmap to keep track of executable blocks in the CFG. */
100 static sbitmap executable_blocks;
101
102 /* A bitmap for all executable edges in the CFG. */
103 static sbitmap executable_edges;
104
105 /* Array of edges on the work list. */
106 static edge *edge_info;
107
108 /* We need an edge list to be able to get indexes easily. */
109 static struct edge_list *edges;
110
111 /* For building/following use-def and def-use chains. */
112 static struct df *df_analyzer;
113
114 /* Current edge we are operating on, from the worklist */
115 static edge flow_edges;
116
117 /* Bitmap of SSA edges which will need reexamination as their definition
118 has changed. */
119 static sbitmap ssa_edges;
120
121 /* Simple macros to simplify code */
122 #define SSA_NAME(x) REGNO (SET_DEST (x))
123 #define EIE(x,y) EDGE_INDEX (edges, x, y)
124
125 static void visit_phi_node PARAMS ((rtx, basic_block));
126 static void visit_expression PARAMS ((rtx, basic_block));
127 static void defs_to_undefined PARAMS ((rtx));
128 static void defs_to_varying PARAMS ((rtx));
129 static void examine_flow_edges PARAMS ((void));
130 static int mark_references PARAMS ((rtx *, void *));
131 static void follow_def_use_chains PARAMS ((void));
132 static void optimize_unexecutable_edges PARAMS ((struct edge_list *, sbitmap));
133 static void ssa_ccp_substitute_constants PARAMS ((void));
134 static void ssa_ccp_df_delete_unreachable_insns PARAMS ((void));
135 static void ssa_fast_dce PARAMS ((struct df *));
136
137 /* Loop through the PHI_NODE's parameters for BLOCK and compare their
138 lattice values to determine PHI_NODE's lattice value. */
139 static void
140 visit_phi_node (phi_node, block)
141 rtx phi_node;
142 basic_block block;
143 {
144 unsigned int i;
145 rtx phi_node_expr = NULL;
146 unsigned int phi_node_name = SSA_NAME (PATTERN (phi_node));
147 latticevalue phi_node_lattice_val = UNDEFINED;
148 rtx pat = PATTERN (phi_node);
149 rtvec phi_vec = XVEC (SET_SRC (pat), 0);
150 unsigned int num_elem = GET_NUM_ELEM (phi_vec);
151
152 for (i = 0; i < num_elem; i += 2)
153 {
154 if (TEST_BIT (executable_edges,
155 EIE (BASIC_BLOCK (INTVAL (RTVEC_ELT (phi_vec, i + 1))),
156 block)))
157 {
158 unsigned int current_parm
159 = REGNO (RTVEC_ELT (phi_vec, i));
160
161 latticevalue current_parm_lattice_val
162 = values[current_parm].lattice_val;
163
164 /* If any node is VARYING, then new value of PHI_NODE
165 is VARYING. */
166 if (current_parm_lattice_val == VARYING)
167 {
168 phi_node_lattice_val = VARYING;
169 phi_node_expr = NULL;
170 break;
171 }
172
173 /* If we have more than one distinct constant, then the new
174 value of PHI_NODE is VARYING. */
175 if (current_parm_lattice_val == CONSTANT
176 && phi_node_lattice_val == CONSTANT
177 && values[current_parm].const_value != phi_node_expr)
178 {
179 phi_node_lattice_val = VARYING;
180 phi_node_expr = NULL;
181 break;
182 }
183
184 /* If the current value of PHI_NODE is UNDEFINED and one
185 node in PHI_NODE is CONSTANT, then the new value of the
186 PHI is that CONSTANT. Note this can turn into VARYING
187 if we find another distinct constant later. */
188 if (phi_node_lattice_val == UNDEFINED
189 && phi_node_expr == NULL
190 && current_parm_lattice_val == CONSTANT)
191 {
192 phi_node_expr = values[current_parm].const_value;
193 phi_node_lattice_val = CONSTANT;
194 continue;
195 }
196 }
197 }
198
199 /* If the value of PHI_NODE changed, then we will need to
200 re-execute uses of the output of PHI_NODE. */
201 if (phi_node_lattice_val != values[phi_node_name].lattice_val)
202 {
203 values[phi_node_name].lattice_val = phi_node_lattice_val;
204 values[phi_node_name].const_value = phi_node_expr;
205 SET_BIT (ssa_edges, phi_node_name);
206 }
207 }
208
209 /* Sets all defs in an insn to UNDEFINED. */
210 static void
211 defs_to_undefined (insn)
212 rtx insn;
213 {
214 struct df_link *currdef;
215 for (currdef = DF_INSN_DEFS (df_analyzer, insn); currdef;
216 currdef = currdef->next)
217 {
218 if (values[DF_REF_REGNO (currdef->ref)].lattice_val != UNDEFINED)
219 SET_BIT (ssa_edges, DF_REF_REGNO (currdef->ref));
220 values[DF_REF_REGNO (currdef->ref)].lattice_val = UNDEFINED;
221 }
222 }
223
224 /* Sets all defs in an insn to VARYING. */
225 static void
226 defs_to_varying (insn)
227 rtx insn;
228 {
229 struct df_link *currdef;
230 for (currdef = DF_INSN_DEFS (df_analyzer, insn); currdef;
231 currdef = currdef->next)
232 {
233 if (values[DF_REF_REGNO (currdef->ref)].lattice_val != VARYING)
234 SET_BIT (ssa_edges, DF_REF_REGNO (currdef->ref));
235 values[DF_REF_REGNO (currdef->ref)].lattice_val = VARYING;
236 }
237 }
238
239 /* Go through the expression, call the appropriate evaluation routines
240 to attempt cprop */
241 static void
242 visit_expression (insn, block)
243 rtx insn;
244 basic_block block;
245 {
246 rtx src, dest, set;
247
248
249 /* Ugh. CALL_INSNs may end a basic block and have multiple edges
250 leading out from them.
251
252 Mark all the outgoing edges as executable, then fall into the
253 normal processing below. */
254 if (GET_CODE (insn) == CALL_INSN && block->end == insn)
255 {
256 edge curredge;
257
258 for (curredge = block->succ; curredge;
259 curredge = curredge->succ_next)
260 {
261 int index = EIE (curredge->src, curredge->dest);
262
263 if (TEST_BIT (executable_edges, index))
264 continue;
265
266 SET_BIT (executable_edges, index);
267 edge_info[index] = flow_edges;
268 flow_edges = curredge;
269 }
270 }
271
272 set = single_set (insn);
273 if (! set)
274 {
275 defs_to_varying (insn);
276 return;
277 }
278
279 src = SET_SRC (set);
280 dest = SET_DEST (set);
281
282 /* We may want to refine this some day. */
283 if (GET_CODE (dest) != REG && dest != pc_rtx)
284 {
285 defs_to_varying (insn);
286 return;
287 }
288
289 /* Hard registers are not put in SSA form and thus we must consider
290 them varying. All the more reason to avoid hard registers in
291 RTL until as late as possible in the compilation. */
292 if (GET_CODE (dest) == REG && REGNO (dest) < FIRST_PSEUDO_REGISTER)
293 {
294 defs_to_varying (insn);
295 return;
296 }
297
298 /* If this is assigning DEST to a constant, record that fact. */
299 if (GET_CODE (src) == CONST_INT && GET_CODE (insn) == INSN)
300 {
301 unsigned int resultreg = REGNO (dest);
302
303 values[resultreg].lattice_val = CONSTANT;
304 values[resultreg].const_value = SET_SRC (PATTERN (insn));
305 SET_BIT (ssa_edges, resultreg);
306 }
307
308 /* If this is a copy operation, then we can copy the lattice values. */
309 else if (GET_CODE (src) == REG && GET_CODE (dest) == REG)
310 {
311 unsigned int old_value = REGNO (src);
312 latticevalue old_lattice_value = values[old_value].lattice_val;
313 unsigned int new_value = REGNO (dest);
314
315 /* Unless the lattice value is going to change, don't bother
316 adding the "new value" into the worklist. */
317 if (values[new_value].lattice_val != old_lattice_value
318 || values[new_value].const_value != values[old_value].const_value)
319 SET_BIT (ssa_edges, new_value);
320
321 /* Copy the old lattice node info into the new value lattice node. */
322 values[new_value].lattice_val = old_lattice_value;
323 values[new_value].const_value = values[old_value].const_value;
324 }
325
326 /* Handle jumps. */
327 else if (GET_CODE (insn) == JUMP_INSN)
328 {
329 rtx x = pc_set (insn);
330 if (GET_CODE (src) != IF_THEN_ELSE)
331 {
332 edge curredge;
333
334 /* This is a computed jump, table jump, or an unconditional
335 jump. For all these cases we want to mark all successor
336 blocks as executable if they have not already been
337 marked.
338
339 One day we may try do better with swtich tables and
340 other computed jumps. */
341 for (curredge = block->succ; curredge;
342 curredge = curredge->succ_next)
343 {
344 int index = EIE (curredge->src, curredge->dest);
345
346 if (TEST_BIT (executable_edges, index))
347 continue;
348
349 SET_BIT (executable_edges, index);
350 edge_info[index] = flow_edges;
351 flow_edges = curredge;
352 }
353 }
354 else
355 {
356 edge curredge;
357 enum rtx_code comparison_code;
358 rtx comparison_src0;
359 rtx comparison_src1;
360
361 comparison_code = GET_CODE (XEXP (src, 0));
362 comparison_src0 = XEXP (XEXP (src, 0), 0);
363 comparison_src1 = XEXP (XEXP (src, 0), 1);
364
365 /* If either operand is undefined, then there is nothing to
366 do right now. If/when operands are later defined we will
367 revaluate the condition and take the appropriate action. */
368 if ((GET_CODE (comparison_src0) == REG
369 && values[REGNO (comparison_src0)].lattice_val == UNDEFINED)
370 || (GET_CODE (comparison_src1) == REG
371 && values[REGNO (comparison_src1)].lattice_val == UNDEFINED))
372 return;
373
374 /* If either operand is varying, then we must consider all
375 paths as executable. */
376 if ((GET_CODE (comparison_src0) == REG
377 && values[REGNO (comparison_src0)].lattice_val == VARYING)
378 || (GET_CODE (comparison_src1) == REG
379 && values[REGNO (comparison_src1)].lattice_val == VARYING))
380 {
381 for (curredge = block->succ; curredge;
382 curredge = curredge->succ_next)
383 {
384 int index = EIE (curredge->src, curredge->dest);
385
386 if (TEST_BIT (executable_edges, index))
387 continue;
388
389 SET_BIT (executable_edges, index);
390 edge_info[index] = flow_edges;
391 flow_edges = curredge;
392 }
393 return;
394 }
395
396 /* Try to simplify the comparison. */
397 if (GET_CODE (comparison_src0) == REG
398 && values[REGNO (comparison_src0)].lattice_val == CONSTANT)
399 comparison_src0 = values[REGNO (comparison_src0)].const_value;
400
401 if (GET_CODE (comparison_src1) == REG
402 && values[REGNO (comparison_src1)].lattice_val == CONSTANT)
403 comparison_src1 = values[REGNO (comparison_src1)].const_value;
404
405 x = simplify_ternary_operation (IF_THEN_ELSE,
406 VOIDmode,
407 GET_MODE (XEXP (src, 0)),
408 gen_rtx (comparison_code,
409 GET_MODE (XEXP (src, 0)),
410 comparison_src0,
411 comparison_src1),
412 XEXP (src, 1),
413 XEXP (src, 2));
414
415 /* Walk through all the outgoing edges from this block and see
416 which (if any) we should mark as executable. */
417 for (curredge = block->succ; curredge;
418 curredge = curredge->succ_next)
419 {
420 int index = EIE (curredge->src, curredge->dest);
421
422 if (TEST_BIT (executable_edges, index))
423 continue;
424
425 /* If we were unable to simplify the expression at this
426 point, it's highly unlikely we'll be able to simplify
427 it later. So consider all edges as executable if the
428 expression did not simplify.
429
430 If the expression simplified to (pc), then we know we
431 will take the fall-thru edge, so mark it. Similarly,
432 if the expression simplified to (label_ref ...), then
433 we know the branch will be taken and we mark that
434 edge as taken. */
435 if (!x
436 || (x == pc_rtx
437 && (curredge->flags & EDGE_FALLTHRU))
438 || (GET_CODE (x) == LABEL_REF
439 && ! (curredge->flags & EDGE_FALLTHRU)))
440 {
441 SET_BIT (executable_edges, index);
442 edge_info[index] = flow_edges;
443 flow_edges = curredge;
444 }
445 }
446 }
447 }
448 else if (!PHI_NODE_P (insn))
449 {
450 rtx simplified = NULL;
451
452 /* We've got some kind of INSN. If it's simple, try to evaluate
453 it and record the results.
454
455 We already know this insn is a single_set and that it sets
456 a pseudo register. So we just need to extract the source
457 arguments, simplify them to constants if possible, then
458 simplify the expression as a whole if possible. */
459 switch (GET_RTX_CLASS (GET_CODE (src)))
460 {
461 case '<':
462 {
463 rtx src0 = XEXP (src, 0);
464 rtx src1 = XEXP (src, 1);
465 enum machine_mode mode;
466
467 /* If either is undefined, then the result is undefined. */
468 if ((GET_CODE (src0) == REG
469 && values[REGNO (src0)].lattice_val == UNDEFINED)
470 || (GET_CODE (src1) == REG
471 && values[REGNO (src1)].lattice_val == UNDEFINED))
472 {
473 defs_to_undefined (insn);
474 break;
475 }
476
477 /* Determine the mode for the operation before we simplify
478 our arguments to constants. */
479 mode = GET_MODE (src0);
480 if (mode == VOIDmode)
481 mode = GET_MODE (src1);
482
483 /* Simplify source operands to whatever known values they
484 may have. */
485 if (GET_CODE (src0) == REG
486 && values[REGNO (src0)].lattice_val == CONSTANT)
487 src0 = values[REGNO (src0)].const_value;
488
489 if (GET_CODE (src1) == REG
490 && values[REGNO (src1)].lattice_val == CONSTANT)
491 src1 = values[REGNO (src1)].const_value;
492
493 /* See if the simplifier can determine if this operation
494 computes a constant value. */
495 simplified = simplify_relational_operation (GET_CODE (src),
496 mode, src0, src1);
497 break;
498
499 }
500
501 case '1':
502 {
503 rtx src0 = XEXP (src, 0);
504 enum machine_mode mode0 = GET_MODE (src0);
505
506 /* If the operand is undefined, then the result is undefined. */
507 if (GET_CODE (src0) == REG
508 && values[REGNO (src0)].lattice_val == UNDEFINED)
509 {
510 defs_to_undefined (insn);
511 break;
512 }
513
514 /* Simplify source operands to whatever known values they
515 may have. */
516 if (GET_CODE (src0) == REG
517 && values[REGNO (src0)].lattice_val == CONSTANT)
518 src0 = values[REGNO (src0)].const_value;
519
520 /* See if the simplifier can determine if this operation
521 computes a constant value. */
522 simplified = simplify_unary_operation (GET_CODE (src),
523 GET_MODE (src),
524 src0,
525 mode0);
526 break;
527 }
528
529 case '2':
530 case 'c':
531 {
532 rtx src0 = XEXP (src, 0);
533 rtx src1 = XEXP (src, 1);
534
535 /* If either is undefined, then the result is undefined. */
536 if ((GET_CODE (src0) == REG
537 && values[REGNO (src0)].lattice_val == UNDEFINED)
538 || (GET_CODE (src1) == REG
539 && values[REGNO (src1)].lattice_val == UNDEFINED))
540 {
541 defs_to_undefined (insn);
542 break;
543 }
544
545 /* Simplify source operands to whatever known values they
546 may have. */
547 if (GET_CODE (src0) == REG
548 && values[REGNO (src0)].lattice_val == CONSTANT)
549 src0 = values[REGNO (src0)].const_value;
550
551 if (GET_CODE (src1) == REG
552 && values[REGNO (src1)].lattice_val == CONSTANT)
553 src1 = values[REGNO (src1)].const_value;
554
555 /* See if the simplifier can determine if this operation
556 computes a constant value. */
557 simplified = simplify_binary_operation (GET_CODE (src),
558 GET_MODE (src),
559 src0, src1);
560 break;
561 }
562
563 case '3':
564 case 'b':
565 {
566 rtx src0 = XEXP (src, 0);
567 rtx src1 = XEXP (src, 1);
568 rtx src2 = XEXP (src, 2);
569
570 /* If either is undefined, then the result is undefined. */
571 if ((GET_CODE (src0) == REG
572 && values[REGNO (src0)].lattice_val == UNDEFINED)
573 || (GET_CODE (src1) == REG
574 && values[REGNO (src1)].lattice_val == UNDEFINED)
575 || (GET_CODE (src2) == REG
576 && values[REGNO (src2)].lattice_val == UNDEFINED))
577 {
578 defs_to_undefined (insn);
579 break;
580 }
581
582 /* Simplify source operands to whatever known values they
583 may have. */
584 if (GET_CODE (src0) == REG
585 && values[REGNO (src0)].lattice_val == CONSTANT)
586 src0 = values[REGNO (src0)].const_value;
587
588 if (GET_CODE (src1) == REG
589 && values[REGNO (src1)].lattice_val == CONSTANT)
590 src1 = values[REGNO (src1)].const_value;
591
592 if (GET_CODE (src2) == REG
593 && values[REGNO (src2)].lattice_val == CONSTANT)
594 src2 = values[REGNO (src2)].const_value;
595
596 /* See if the simplifier can determine if this operation
597 computes a constant value. */
598 simplified = simplify_ternary_operation (GET_CODE (src),
599 GET_MODE (src),
600 GET_MODE (src),
601 src0, src1, src2);
602 break;
603 }
604
605 default:
606 defs_to_varying (insn);
607 }
608
609 if (simplified && GET_CODE (simplified) == CONST_INT)
610 {
611 if (values[REGNO (dest)].lattice_val != CONSTANT
612 || values[REGNO (dest)].const_value != simplified)
613 SET_BIT (ssa_edges, REGNO (dest));
614
615 values[REGNO (dest)].lattice_val = CONSTANT;
616 values[REGNO (dest)].const_value = simplified;
617 }
618 else
619 defs_to_varying (insn);
620 }
621 }
622
623 /* Iterate over the FLOW_EDGES work list. Simulate the target block
624 for each edge. */
625 static void
626 examine_flow_edges ()
627 {
628 while (flow_edges != NULL)
629 {
630 basic_block succ_block;
631 rtx curr_phi_node;
632
633 /* Pull the next block to simulate off the worklist. */
634 succ_block = flow_edges->dest;
635 flow_edges = edge_info[EIE (flow_edges->src, flow_edges->dest)];
636
637 /* There is nothing to do for the exit block. */
638 if (succ_block == EXIT_BLOCK_PTR)
639 continue;
640
641 /* Always simulate PHI nodes, even if we have simulated this block
642 before. Note that all PHI nodes are consecutive within a block. */
643 for (curr_phi_node = first_insn_after_basic_block_note (succ_block);
644 PHI_NODE_P (curr_phi_node);
645 curr_phi_node = NEXT_INSN (curr_phi_node))
646 visit_phi_node (curr_phi_node, succ_block);
647
648 /* If this is the first time we've simulated this block, then we
649 must simulate each of its insns. */
650 if (!TEST_BIT (executable_blocks, succ_block->index))
651 {
652 rtx currinsn;
653 edge succ_edge = succ_block->succ;
654
655 /* Note that we have simulated this block. */
656 SET_BIT (executable_blocks, succ_block->index);
657
658 /* Simulate each insn within the block. */
659 currinsn = succ_block->head;
660 while (currinsn != succ_block->end)
661 {
662 if (INSN_P (currinsn))
663 visit_expression (currinsn, succ_block);
664
665 currinsn = NEXT_INSN (currinsn);
666 }
667
668 /* Don't forget the last insn in the block. */
669 if (INSN_P (currinsn))
670 visit_expression (currinsn, succ_block);
671
672 /* If we haven't looked at the next block, and it has a
673 single successor, add it onto the worklist. This is because
674 if we only have one successor, we know it gets executed,
675 so we don't have to wait for cprop to tell us. */
676 if (succ_edge != NULL
677 && succ_edge->succ_next == NULL
678 && !TEST_BIT (executable_edges,
679 EIE (succ_edge->src, succ_edge->dest)))
680 {
681 SET_BIT (executable_edges,
682 EIE (succ_edge->src, succ_edge->dest));
683 edge_info[EIE (succ_edge->src, succ_edge->dest)] = flow_edges;
684 flow_edges = succ_edge;
685 }
686 }
687 }
688 }
689
690 /* Follow the def-use chains for each definition on the worklist and
691 simulate the uses of the definition. */
692
693 static void
694 follow_def_use_chains ()
695 {
696 /* Iterate over all the entries on the SSA_EDGES worklist. */
697 while (sbitmap_first_set_bit (ssa_edges) >= 0)
698 {
699 int member;
700 struct df_link *curruse;
701
702 /* Pick an entry off the worklist (it does not matter which
703 entry we pick). */
704 member = sbitmap_first_set_bit (ssa_edges);
705 RESET_BIT (ssa_edges, member);
706
707 /* Iterate through all the uses of this entry. */
708 for (curruse = df_analyzer->regs[member].uses; curruse;
709 curruse = curruse->next)
710 {
711 rtx useinsn;
712
713 useinsn = DF_REF_INSN (curruse->ref);
714 if (PHI_NODE_P (useinsn))
715 {
716 if (TEST_BIT (executable_blocks, BLOCK_NUM (useinsn)))
717 visit_phi_node (useinsn, BLOCK_FOR_INSN (useinsn));
718 }
719 else
720 {
721 if (TEST_BIT (executable_blocks, BLOCK_NUM (useinsn)))
722 visit_expression (useinsn, BLOCK_FOR_INSN (useinsn));
723 }
724 }
725 }
726 }
727
728 /* Examine each edge to see if we were able to prove any were
729 not executable.
730
731 If an edge is not executable, then we can remove its alternative
732 in PHI nodes as the destination of the edge, we can simplify the
733 conditional branch at the source of the edge, and we can remove
734 the edge from the CFG. Note we do not delete unreachable blocks
735 yet as the DF analyzer can not deal with that yet. */
736 static void
737 optimize_unexecutable_edges (edges, executable_edges)
738 struct edge_list *edges;
739 sbitmap executable_edges;
740 {
741 int i;
742 basic_block bb;
743
744 for (i = 0; i < NUM_EDGES (edges); i++)
745 {
746 if (!TEST_BIT (executable_edges, i))
747 {
748 edge edge = INDEX_EDGE (edges, i);
749
750 if (edge->flags & EDGE_ABNORMAL)
751 continue;
752
753 /* We found an edge that is not executable. First simplify
754 the PHI nodes in the target block. */
755 if (edge->dest != EXIT_BLOCK_PTR)
756 {
757 rtx insn = first_insn_after_basic_block_note (edge->dest);
758
759 while (PHI_NODE_P (insn))
760 {
761 remove_phi_alternative (PATTERN (insn), edge->src);
762 if (rtl_dump_file)
763 fprintf (rtl_dump_file,
764 "Removing alternative for bb %d of phi %d\n",
765 edge->src->index, SSA_NAME (PATTERN (insn)));
766 insn = NEXT_INSN (insn);
767 }
768 }
769 if (rtl_dump_file)
770 fprintf (rtl_dump_file,
771 "Removing unexecutable edge from %d to %d\n",
772 edge->src->index, edge->dest->index);
773 /* Since the edge was not executable, remove it from the CFG. */
774 remove_edge (edge);
775 }
776 }
777
778 /* We have removed all the unexecutable edges from the CFG. Fix up
779 the conditional jumps at the end of any affected block.
780
781 We have three cases to deal with:
782
783 a. Both outgoing edges are not executable. This happens if the
784 source block is not reachable. We will deal with this by
785 deleting all the insns in the block later.
786
787 b. The fall-thru edge is not executable. In this case we
788 change the conditional jump into an unconditional jump and
789 add a BARRIER after the unconditional jump. Note that since
790 we are working on generic RTL we can change the jump in-place
791 instead of dealing with the headache of reemitting the jump.
792
793 c. The branch taken edge is not executable. In this case
794 we turn the jump into (set (pc) (pc)) which is a nop-jump
795 and we will remove the unrecognizable insn later.
796
797 In cases B & C we are removing uses of registers, so make sure
798 to note those changes for the DF analyzer. */
799
800 FOR_EACH_BB (bb)
801 {
802 rtx insn = bb->end;
803 edge edge = bb->succ;
804
805 /* If we have no predecessors, then this block is unreachable and
806 will be cleaned up when we remove unreachable blocks. */
807 if (bb->pred == NULL || GET_CODE (insn) != JUMP_INSN)
808 continue;
809
810 /* If this block ends in a conditional jump, but only has one
811 successor, then the jump needs adjustment. */
812 if (condjump_p (insn) && ! simplejump_p (insn)
813 && bb->succ && bb->succ->succ_next == NULL)
814 {
815 /* If the fallthru edge is the executable edge, then turn
816 this jump into a nop jump, otherwise make it an unconditinoal
817 jump to its target. */
818 if (edge->flags & EDGE_FALLTHRU)
819 {
820 PUT_CODE (insn, NOTE);
821 NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
822 }
823 else
824 {
825 SET_SRC (PATTERN (insn)) = gen_rtx_LABEL_REF (Pmode,
826 JUMP_LABEL (insn));
827 emit_barrier_after (insn);
828 INSN_CODE (insn) = -1;
829 }
830
831 /* Inform the DF analyzer that this insn changed. */
832 df_insn_modify (df_analyzer, BLOCK_FOR_INSN (insn), insn);
833 }
834 }
835 }
836
837 /* Perform substitution of known values for pseudo registers.
838
839 ??? Note we do not do simplifications or constant folding here, it
840 is unlikely that any significant simplifications can be done here
841 anyway. Consider that if the simplification would result in an
842 expression that produces a constant value that the value would
843 have been discovered and recorded already.
844
845 We perform two transformations. First, we initialize pseudos to their
846 known constant values at their definition point. Second, we try to
847 replace uses with the known constant value. */
848
849 static void
850 ssa_ccp_substitute_constants ()
851 {
852 unsigned int i;
853
854 for (i = FIRST_PSEUDO_REGISTER; i < VARRAY_SIZE (ssa_definition); i++)
855 {
856 if (values[i].lattice_val == CONSTANT)
857 {
858 rtx def = VARRAY_RTX (ssa_definition, i);
859 rtx set = single_set (def);
860 struct df_link *curruse;
861
862 if (! set)
863 continue;
864
865 /* Do not try to simplify PHI nodes down to a constant load.
866 That will be done later as we translate out of SSA. Also,
867 doing that here could violate the rule that all PHI nodes
868 are consecutive at the start of the basic block.
869
870 Don't do anything to nodes that were already sets to
871 constants. */
872 if (! PHI_NODE_P (def)
873 && ! ((GET_CODE (def) == INSN
874 && GET_CODE (SET_SRC (set)) == CONST_INT)))
875 {
876 if (rtl_dump_file)
877 fprintf (rtl_dump_file,
878 "Register %d is now set to a constant\n",
879 SSA_NAME (PATTERN (def)));
880 SET_SRC (set) = values[i].const_value;
881 INSN_CODE (def) = -1;
882 df_insn_modify (df_analyzer, BLOCK_FOR_INSN (def), def);
883 }
884
885 /* Iterate through all the uses of this entry and try replacements
886 there too. Note it is not particularly profitable to try
887 and fold/simplify expressions here as most of the common
888 cases were handled above. */
889 for (curruse = df_analyzer->regs[i].uses;
890 curruse;
891 curruse = curruse->next)
892 {
893 rtx useinsn;
894
895 useinsn = DF_REF_INSN (curruse->ref);
896
897 if (!INSN_DELETED_P (useinsn)
898 && ! (GET_CODE (useinsn) == NOTE
899 && NOTE_LINE_NUMBER (useinsn) == NOTE_INSN_DELETED)
900 && (GET_CODE (useinsn) == INSN
901 || GET_CODE (useinsn) == JUMP_INSN))
902 {
903
904 if (validate_replace_src (regno_reg_rtx [i],
905 values[i].const_value,
906 useinsn))
907 {
908 if (rtl_dump_file)
909 fprintf (rtl_dump_file,
910 "Register %d in insn %d replaced with constant\n",
911 i, INSN_UID (useinsn));
912 INSN_CODE (useinsn) = -1;
913 df_insn_modify (df_analyzer,
914 BLOCK_FOR_INSN (useinsn),
915 useinsn);
916 }
917
918 }
919 }
920 }
921 }
922 }
923
924 /* Now find all unreachable basic blocks. All the insns in those
925 blocks are unreachable, so delete them and mark any necessary
926 updates for the DF analyzer. */
927
928 static void
929 ssa_ccp_df_delete_unreachable_insns ()
930 {
931 basic_block b;
932
933 /* Use the CFG to find all the reachable blocks. */
934 find_unreachable_blocks ();
935
936 /* Now we know what blocks are not reachable. Mark all the insns
937 in those blocks as deleted for the DF analyzer. We'll let the
938 normal flow code actually remove the unreachable blocks. */
939 FOR_EACH_BB_REVERSE (b)
940 {
941 if (!(b->flags & BB_REACHABLE))
942 {
943 rtx start = b->head;
944 rtx end = b->end;
945 rtx tmp;
946
947 /* Include any jump table following the basic block. */
948 end = b->end;
949 if (GET_CODE (end) == JUMP_INSN
950 && (tmp = JUMP_LABEL (end)) != NULL_RTX
951 && (tmp = NEXT_INSN (tmp)) != NULL_RTX
952 && GET_CODE (tmp) == JUMP_INSN
953 && (GET_CODE (PATTERN (tmp)) == ADDR_VEC
954 || GET_CODE (PATTERN (tmp)) == ADDR_DIFF_VEC))
955 end = tmp;
956
957 while (1)
958 {
959 rtx next = NEXT_INSN (start);
960
961 if (GET_CODE (start) == INSN
962 || GET_CODE (start) == CALL_INSN
963 || GET_CODE (start) == JUMP_INSN)
964 df_insn_delete (df_analyzer, BLOCK_FOR_INSN (start), start);
965
966 if (start == end)
967 break;
968 start = next;
969 }
970 }
971 }
972 }
973
974
975 /* Main entry point for SSA Conditional Constant Propagation.
976
977 Long term it should accept as input the specific flow graph to
978 operate on so that it can be called for sub-graphs. */
979
980 void
981 ssa_const_prop ()
982 {
983 unsigned int i;
984 edge curredge;
985
986 /* We need alias analysis (for what?) */
987 init_alias_analysis ();
988
989 df_analyzer = df_init ();
990 df_analyse (df_analyzer, 0,
991 DF_RD_CHAIN | DF_RU_CHAIN | DF_REG_INFO | DF_HARD_REGS);
992
993 /* Perform a quick and dirty dead code elimination pass. This is not
994 as aggressive as it could be, but it's good enough to clean up a
995 lot of unwanted junk and it is fast. */
996 ssa_fast_dce (df_analyzer);
997
998 /* Build an edge list from the CFG. */
999 edges = create_edge_list ();
1000
1001 /* Initialize the values array with everything as undefined. */
1002 values = (value *) xmalloc (VARRAY_SIZE (ssa_definition) * sizeof (value));
1003 for (i = 0; i < VARRAY_SIZE (ssa_definition); i++)
1004 {
1005 if (i < FIRST_PSEUDO_REGISTER)
1006 values[i].lattice_val = VARYING;
1007 else
1008 values[i].lattice_val = UNDEFINED;
1009 values[i].const_value = NULL;
1010 }
1011
1012 ssa_edges = sbitmap_alloc (VARRAY_SIZE (ssa_definition));
1013 sbitmap_zero (ssa_edges);
1014
1015 executable_blocks = sbitmap_alloc (last_basic_block);
1016 sbitmap_zero (executable_blocks);
1017
1018 executable_edges = sbitmap_alloc (NUM_EDGES (edges));
1019 sbitmap_zero (executable_edges);
1020
1021 edge_info = (edge *) xmalloc (NUM_EDGES (edges) * sizeof (edge));
1022 flow_edges = ENTRY_BLOCK_PTR->succ;
1023
1024 /* Add the successors of the entry block to the edge worklist. That
1025 is enough of a seed to get SSA-CCP started. */
1026 for (curredge = ENTRY_BLOCK_PTR->succ; curredge;
1027 curredge = curredge->succ_next)
1028 {
1029 int index = EIE (curredge->src, curredge->dest);
1030 SET_BIT (executable_edges, index);
1031 edge_info[index] = curredge->succ_next;
1032 }
1033
1034 /* Iterate until until the worklists are empty. */
1035 do
1036 {
1037 examine_flow_edges ();
1038 follow_def_use_chains ();
1039 }
1040 while (flow_edges != NULL);
1041
1042 /* Now perform substitutions based on the known constant values. */
1043 ssa_ccp_substitute_constants ();
1044
1045 /* Remove unexecutable edges from the CFG and make appropriate
1046 adjustments to PHI nodes. */
1047 optimize_unexecutable_edges (edges, executable_edges);
1048
1049 /* Now remove all unreachable insns and update the DF information.
1050 as appropriate. */
1051 ssa_ccp_df_delete_unreachable_insns ();
1052
1053 #if 0
1054 /* The DF analyzer expects the number of blocks to remain constant,
1055 so we can't remove unreachable blocks.
1056
1057 Code the DF analyzer calls expects there to be no unreachable
1058 blocks in the CFG. So we can't leave unreachable blocks in the
1059 CFG.
1060
1061 So, there is no way to do an incremental update of the DF data
1062 at this point. */
1063 df_analyse (df_analyzer, 0,
1064 DF_RD_CHAIN | DF_RU_CHAIN | DF_REG_INFO | DF_HARD_REGS);
1065 #endif
1066
1067 /* Clean up any dead code exposed by SSA-CCP, do this after updating
1068 the dataflow information! */
1069 ssa_fast_dce (df_analyzer);
1070
1071 free (values);
1072 values = NULL;
1073
1074 free (edge_info);
1075 edge_info = NULL;
1076
1077 sbitmap_free (executable_blocks);
1078 executable_blocks = NULL;
1079
1080 sbitmap_free (ssa_edges);
1081 ssa_edges = NULL;
1082
1083 free_edge_list (edges);
1084 edges = NULL;
1085
1086 sbitmap_free (executable_edges);
1087 executable_edges = NULL;
1088
1089 df_finish (df_analyzer);
1090 end_alias_analysis ();
1091 }
1092
1093 static int
1094 mark_references (current_rtx, data)
1095 rtx *current_rtx;
1096 void *data;
1097 {
1098 rtx x = *current_rtx;
1099 sbitmap worklist = (sbitmap) data;
1100
1101 if (x == NULL_RTX)
1102 return 0;
1103
1104 if (GET_CODE (x) == SET)
1105 {
1106 rtx dest = SET_DEST (x);
1107
1108 if (GET_CODE (dest) == STRICT_LOW_PART
1109 || GET_CODE (dest) == SUBREG
1110 || GET_CODE (dest) == SIGN_EXTRACT
1111 || GET_CODE (dest) == ZERO_EXTRACT)
1112 {
1113 rtx reg;
1114
1115 reg = dest;
1116
1117 while (GET_CODE (reg) == STRICT_LOW_PART
1118 || GET_CODE (reg) == SUBREG
1119 || GET_CODE (reg) == SIGN_EXTRACT
1120 || GET_CODE (reg) == ZERO_EXTRACT)
1121 reg = XEXP (reg, 0);
1122
1123 if (GET_CODE (reg) == REG)
1124 SET_BIT (worklist, REGNO (reg));
1125 }
1126
1127 if (GET_CODE (dest) == REG)
1128 {
1129 for_each_rtx (&SET_SRC (x), mark_references, data);
1130 return -1;
1131 }
1132
1133 return 0;
1134 }
1135 else if (GET_CODE (x) == REG)
1136 {
1137 SET_BIT (worklist, REGNO (x));
1138 return -1;
1139 }
1140 else if (GET_CODE (x) == CLOBBER)
1141 return -1;
1142 else
1143 return 0;
1144 }
1145
1146 static void
1147 ssa_fast_dce (df)
1148 struct df *df;
1149 {
1150 sbitmap worklist = sbitmap_alloc (VARRAY_SIZE (ssa_definition));
1151 sbitmap_ones (worklist);
1152
1153 /* Iterate on the worklist until there's no definitions left to
1154 examine. */
1155 while (sbitmap_first_set_bit (worklist) >= 0)
1156 {
1157 struct df_link *curruse;
1158 int reg, found_use;
1159
1160 /* Remove an item from the worklist. */
1161 reg = sbitmap_first_set_bit (worklist);
1162 RESET_BIT (worklist, reg);
1163
1164 /* We never consider deleting assignments to hard regs or things
1165 which do not have SSA definitions, or things we have already
1166 deleted, or things with unusual side effects. */
1167 if (reg < FIRST_PSEUDO_REGISTER
1168 || ! VARRAY_RTX (ssa_definition, reg)
1169 || INSN_DELETED_P (VARRAY_RTX (ssa_definition, reg))
1170 || (GET_CODE (VARRAY_RTX (ssa_definition, reg)) == NOTE
1171 && (NOTE_LINE_NUMBER (VARRAY_RTX (ssa_definition, reg))
1172 == NOTE_INSN_DELETED))
1173 || side_effects_p (PATTERN (VARRAY_RTX (ssa_definition, reg))))
1174 continue;
1175
1176 /* Iterate over the uses of this register. If we can not find
1177 any uses that have not been deleted, then the definition of
1178 this register is dead. */
1179 found_use = 0;
1180 for (curruse = df->regs[reg].uses; curruse; curruse = curruse->next)
1181 {
1182 if (curruse->ref
1183 && DF_REF_INSN (curruse->ref)
1184 && ! INSN_DELETED_P (DF_REF_INSN (curruse->ref))
1185 && ! (GET_CODE (DF_REF_INSN (curruse->ref)) == NOTE
1186 && (NOTE_LINE_NUMBER (DF_REF_INSN (curruse->ref))
1187 == NOTE_INSN_DELETED))
1188 && DF_REF_INSN (curruse->ref) != VARRAY_RTX (ssa_definition, reg))
1189 {
1190 found_use = 1;
1191 break;
1192 }
1193 }
1194
1195 /* If we did not find a use of this register, then the definition
1196 of this register is dead. */
1197
1198 if (! found_use)
1199 {
1200 rtx def = VARRAY_RTX (ssa_definition, reg);
1201
1202 /* Add all registers referenced by INSN to the work
1203 list. */
1204 for_each_rtx (&PATTERN (def), mark_references, worklist);
1205
1206 /* Inform the analyzer that this insn is going to be
1207 deleted. */
1208 df_insn_delete (df, BLOCK_FOR_INSN (def), def);
1209
1210 VARRAY_RTX (ssa_definition, reg) = NULL;
1211 }
1212 }
1213
1214 sbitmap_free (worklist);
1215
1216 /* Update the use-def chains in the df_analyzer as needed. */
1217 df_analyse (df_analyzer, 0,
1218 DF_RD_CHAIN | DF_RU_CHAIN | DF_REG_INFO | DF_HARD_REGS);
1219 }