OSDN Git Service

2005-05-03 Andrew MacLeod <amacleod@redhat.com>
[pf3gnuchains/gcc-fork.git] / gcc / tree-ssa-dom.c
1 /* SSA Dominator optimizations for trees
2    Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
3    Contributed by Diego Novillo <dnovillo@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 2, 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 COPYING.  If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "tree.h"
27 #include "flags.h"
28 #include "rtl.h"
29 #include "tm_p.h"
30 #include "ggc.h"
31 #include "basic-block.h"
32 #include "cfgloop.h"
33 #include "output.h"
34 #include "errors.h"
35 #include "expr.h"
36 #include "function.h"
37 #include "diagnostic.h"
38 #include "timevar.h"
39 #include "tree-dump.h"
40 #include "tree-flow.h"
41 #include "domwalk.h"
42 #include "real.h"
43 #include "tree-pass.h"
44 #include "tree-ssa-propagate.h"
45 #include "langhooks.h"
46
47 /* This file implements optimizations on the dominator tree.  */
48
49
50 /* Structure for recording edge equivalences as well as any pending
51    edge redirections during the dominator optimizer.
52
53    Computing and storing the edge equivalences instead of creating
54    them on-demand can save significant amounts of time, particularly
55    for pathological cases involving switch statements.  
56
57    These structures live for a single iteration of the dominator
58    optimizer in the edge's AUX field.  At the end of an iteration we
59    free each of these structures and update the AUX field to point
60    to any requested redirection target (the code for updating the
61    CFG and SSA graph for edge redirection expects redirection edge
62    targets to be in the AUX field for each edge.  */
63
64 struct edge_info
65 {
66   /* If this edge creates a simple equivalence, the LHS and RHS of
67      the equivalence will be stored here.  */
68   tree lhs;
69   tree rhs;
70
71   /* Traversing an edge may also indicate one or more particular conditions
72      are true or false.  The number of recorded conditions can vary, but
73      can be determined by the condition's code.  So we have an array
74      and its maximum index rather than use a varray.  */
75   tree *cond_equivalences;
76   unsigned int max_cond_equivalences;
77
78   /* If we can thread this edge this field records the new target.  */
79   edge redirection_target;
80 };
81
82
83 /* Hash table with expressions made available during the renaming process.
84    When an assignment of the form X_i = EXPR is found, the statement is
85    stored in this table.  If the same expression EXPR is later found on the
86    RHS of another statement, it is replaced with X_i (thus performing
87    global redundancy elimination).  Similarly as we pass through conditionals
88    we record the conditional itself as having either a true or false value
89    in this table.  */
90 static htab_t avail_exprs;
91
92 /* Stack of available expressions in AVAIL_EXPRs.  Each block pushes any
93    expressions it enters into the hash table along with a marker entry
94    (null).  When we finish processing the block, we pop off entries and
95    remove the expressions from the global hash table until we hit the
96    marker.  */
97 static VEC(tree,heap) *avail_exprs_stack;
98
99 /* Stack of statements we need to rescan during finalization for newly
100    exposed variables.
101
102    Statement rescanning must occur after the current block's available
103    expressions are removed from AVAIL_EXPRS.  Else we may change the
104    hash code for an expression and be unable to find/remove it from
105    AVAIL_EXPRS.  */
106 static VEC(tree,heap) *stmts_to_rescan;
107
108 /* Structure for entries in the expression hash table.
109
110    This requires more memory for the hash table entries, but allows us
111    to avoid creating silly tree nodes and annotations for conditionals,
112    eliminates 2 global hash tables and two block local varrays.
113    
114    It also allows us to reduce the number of hash table lookups we
115    have to perform in lookup_avail_expr and finally it allows us to
116    significantly reduce the number of calls into the hashing routine
117    itself.  */
118
119 struct expr_hash_elt
120 {
121   /* The value (lhs) of this expression.  */
122   tree lhs;
123
124   /* The expression (rhs) we want to record.  */
125   tree rhs;
126
127   /* The stmt pointer if this element corresponds to a statement.  */
128   tree stmt;
129
130   /* The hash value for RHS/ann.  */
131   hashval_t hash;
132 };
133
134 /* Stack of dest,src pairs that need to be restored during finalization.
135
136    A NULL entry is used to mark the end of pairs which need to be
137    restored during finalization of this block.  */
138 static VEC(tree,heap) *const_and_copies_stack;
139
140 /* Bitmap of SSA_NAMEs known to have a nonzero value, even if we do not
141    know their exact value.  */
142 static bitmap nonzero_vars;
143
144 /* Stack of SSA_NAMEs which need their NONZERO_VARS property cleared
145    when the current block is finalized. 
146
147    A NULL entry is used to mark the end of names needing their 
148    entry in NONZERO_VARS cleared during finalization of this block.  */
149 static VEC(tree,heap) *nonzero_vars_stack;
150
151 /* Track whether or not we have changed the control flow graph.  */
152 static bool cfg_altered;
153
154 /* Bitmap of blocks that have had EH statements cleaned.  We should
155    remove their dead edges eventually.  */
156 static bitmap need_eh_cleanup;
157
158 /* Statistics for dominator optimizations.  */
159 struct opt_stats_d
160 {
161   long num_stmts;
162   long num_exprs_considered;
163   long num_re;
164   long num_const_prop;
165   long num_copy_prop;
166 };
167
168 static struct opt_stats_d opt_stats;
169
170 /* Value range propagation record.  Each time we encounter a conditional
171    of the form SSA_NAME COND CONST we create a new vrp_element to record
172    how the condition affects the possible values SSA_NAME may have.
173
174    Each record contains the condition tested (COND), and the range of
175    values the variable may legitimately have if COND is true.  Note the
176    range of values may be a smaller range than COND specifies if we have
177    recorded other ranges for this variable.  Each record also contains the
178    block in which the range was recorded for invalidation purposes.
179
180    Note that the current known range is computed lazily.  This allows us
181    to avoid the overhead of computing ranges which are never queried.
182
183    When we encounter a conditional, we look for records which constrain
184    the SSA_NAME used in the condition.  In some cases those records allow
185    us to determine the condition's result at compile time.  In other cases
186    they may allow us to simplify the condition.
187
188    We also use value ranges to do things like transform signed div/mod
189    operations into unsigned div/mod or to simplify ABS_EXPRs. 
190
191    Simple experiments have shown these optimizations to not be all that
192    useful on switch statements (much to my surprise).  So switch statement
193    optimizations are not performed.
194
195    Note carefully we do not propagate information through each statement
196    in the block.  i.e., if we know variable X has a value defined of
197    [0, 25] and we encounter Y = X + 1, we do not track a value range
198    for Y (which would be [1, 26] if we cared).  Similarly we do not
199    constrain values as we encounter narrowing typecasts, etc.  */
200
201 struct vrp_element
202 {
203   /* The highest and lowest values the variable in COND may contain when
204      COND is true.  Note this may not necessarily be the same values
205      tested by COND if the same variable was used in earlier conditionals. 
206
207      Note this is computed lazily and thus can be NULL indicating that
208      the values have not been computed yet.  */
209   tree low;
210   tree high;
211
212   /* The actual conditional we recorded.  This is needed since we compute
213      ranges lazily.  */
214   tree cond;
215
216   /* The basic block where this record was created.  We use this to determine
217      when to remove records.  */
218   basic_block bb;
219 };
220
221 /* A hash table holding value range records (VRP_ELEMENTs) for a given
222    SSA_NAME.  We used to use a varray indexed by SSA_NAME_VERSION, but
223    that gets awful wasteful, particularly since the density objects
224    with useful information is very low.  */
225 static htab_t vrp_data;
226
227 /* An entry in the VRP_DATA hash table.  We record the variable and a
228    varray of VRP_ELEMENT records associated with that variable.  */
229 struct vrp_hash_elt
230 {
231   tree var;
232   varray_type records;
233 };
234
235 /* Array of variables which have their values constrained by operations
236    in this basic block.  We use this during finalization to know
237    which variables need their VRP data updated.  */
238
239 /* Stack of SSA_NAMEs which had their values constrained by operations
240    in this basic block.  During finalization of this block we use this
241    list to determine which variables need their VRP data updated.
242
243    A NULL entry marks the end of the SSA_NAMEs associated with this block.  */
244 static VEC(tree,heap) *vrp_variables_stack;
245
246 struct eq_expr_value
247 {
248   tree src;
249   tree dst;
250 };
251
252 /* Local functions.  */
253 static void optimize_stmt (struct dom_walk_data *, 
254                            basic_block bb,
255                            block_stmt_iterator);
256 static tree lookup_avail_expr (tree, bool);
257 static hashval_t vrp_hash (const void *);
258 static int vrp_eq (const void *, const void *);
259 static hashval_t avail_expr_hash (const void *);
260 static hashval_t real_avail_expr_hash (const void *);
261 static int avail_expr_eq (const void *, const void *);
262 static void htab_statistics (FILE *, htab_t);
263 static void record_cond (tree, tree);
264 static void record_const_or_copy (tree, tree);
265 static void record_equality (tree, tree);
266 static tree update_rhs_and_lookup_avail_expr (tree, tree, bool);
267 static tree simplify_rhs_and_lookup_avail_expr (struct dom_walk_data *,
268                                                 tree, int);
269 static tree simplify_cond_and_lookup_avail_expr (tree, stmt_ann_t, int);
270 static tree simplify_switch_and_lookup_avail_expr (tree, int);
271 static tree find_equivalent_equality_comparison (tree);
272 static void record_range (tree, basic_block);
273 static bool extract_range_from_cond (tree, tree *, tree *, int *);
274 static void record_equivalences_from_phis (basic_block);
275 static void record_equivalences_from_incoming_edge (basic_block);
276 static bool eliminate_redundant_computations (struct dom_walk_data *,
277                                               tree, stmt_ann_t);
278 static void record_equivalences_from_stmt (tree, int, stmt_ann_t);
279 static void thread_across_edge (struct dom_walk_data *, edge);
280 static void dom_opt_finalize_block (struct dom_walk_data *, basic_block);
281 static void dom_opt_initialize_block (struct dom_walk_data *, basic_block);
282 static void propagate_to_outgoing_edges (struct dom_walk_data *, basic_block);
283 static void remove_local_expressions_from_table (void);
284 static void restore_vars_to_original_value (void);
285 static edge single_incoming_edge_ignoring_loop_edges (basic_block);
286 static void restore_nonzero_vars_to_original_value (void);
287 static inline bool unsafe_associative_fp_binop (tree);
288
289
290 /* Local version of fold that doesn't introduce cruft.  */
291
292 static tree
293 local_fold (tree t)
294 {
295   t = fold (t);
296
297   /* Strip away useless type conversions.  Both the NON_LVALUE_EXPR that
298      may have been added by fold, and "useless" type conversions that might
299      now be apparent due to propagation.  */
300   STRIP_USELESS_TYPE_CONVERSION (t);
301
302   return t;
303 }
304
305 /* Allocate an EDGE_INFO for edge E and attach it to E.
306    Return the new EDGE_INFO structure.  */
307
308 static struct edge_info *
309 allocate_edge_info (edge e)
310 {
311   struct edge_info *edge_info;
312
313   edge_info = xcalloc (1, sizeof (struct edge_info));
314
315   e->aux = edge_info;
316   return edge_info;
317 }
318
319 /* Free all EDGE_INFO structures associated with edges in the CFG.
320    If a particular edge can be threaded, copy the redirection
321    target from the EDGE_INFO structure into the edge's AUX field
322    as required by code to update the CFG and SSA graph for
323    jump threading.  */
324
325 static void
326 free_all_edge_infos (void)
327 {
328   basic_block bb;
329   edge_iterator ei;
330   edge e;
331
332   FOR_EACH_BB (bb)
333     {
334       FOR_EACH_EDGE (e, ei, bb->preds)
335         {
336          struct edge_info *edge_info = e->aux;
337
338           if (edge_info)
339             {
340               e->aux = edge_info->redirection_target;
341               if (edge_info->cond_equivalences)
342                 free (edge_info->cond_equivalences);
343               free (edge_info);
344             }
345         }
346     }
347 }
348
349 /* Jump threading, redundancy elimination and const/copy propagation. 
350
351    This pass may expose new symbols that need to be renamed into SSA.  For
352    every new symbol exposed, its corresponding bit will be set in
353    VARS_TO_RENAME.  */
354
355 static void
356 tree_ssa_dominator_optimize (void)
357 {
358   struct dom_walk_data walk_data;
359   unsigned int i;
360   struct loops loops_info;
361
362   memset (&opt_stats, 0, sizeof (opt_stats));
363
364   /* Create our hash tables.  */
365   avail_exprs = htab_create (1024, real_avail_expr_hash, avail_expr_eq, free);
366   vrp_data = htab_create (ceil_log2 (num_ssa_names), vrp_hash, vrp_eq, free);
367   avail_exprs_stack = VEC_alloc (tree, heap, 20);
368   const_and_copies_stack = VEC_alloc (tree, heap, 20);
369   nonzero_vars_stack = VEC_alloc (tree, heap, 20);
370   vrp_variables_stack = VEC_alloc (tree, heap, 20);
371   stmts_to_rescan = VEC_alloc (tree, heap, 20);
372   nonzero_vars = BITMAP_ALLOC (NULL);
373   need_eh_cleanup = BITMAP_ALLOC (NULL);
374
375   /* Setup callbacks for the generic dominator tree walker.  */
376   walk_data.walk_stmts_backward = false;
377   walk_data.dom_direction = CDI_DOMINATORS;
378   walk_data.initialize_block_local_data = NULL;
379   walk_data.before_dom_children_before_stmts = dom_opt_initialize_block;
380   walk_data.before_dom_children_walk_stmts = optimize_stmt;
381   walk_data.before_dom_children_after_stmts = propagate_to_outgoing_edges;
382   walk_data.after_dom_children_before_stmts = NULL;
383   walk_data.after_dom_children_walk_stmts = NULL;
384   walk_data.after_dom_children_after_stmts = dom_opt_finalize_block;
385   /* Right now we only attach a dummy COND_EXPR to the global data pointer.
386      When we attach more stuff we'll need to fill this out with a real
387      structure.  */
388   walk_data.global_data = NULL;
389   walk_data.block_local_data_size = 0;
390   walk_data.interesting_blocks = NULL;
391
392   /* Now initialize the dominator walker.  */
393   init_walk_dominator_tree (&walk_data);
394
395   calculate_dominance_info (CDI_DOMINATORS);
396
397   /* We need to know which edges exit loops so that we can
398      aggressively thread through loop headers to an exit
399      edge.  */
400   flow_loops_find (&loops_info);
401   mark_loop_exit_edges (&loops_info);
402   flow_loops_free (&loops_info);
403
404   /* Clean up the CFG so that any forwarder blocks created by loop
405      canonicalization are removed.  */
406   cleanup_tree_cfg ();
407
408   /* If we prove certain blocks are unreachable, then we want to
409      repeat the dominator optimization process as PHI nodes may
410      have turned into copies which allows better propagation of
411      values.  So we repeat until we do not identify any new unreachable
412      blocks.  */
413   do
414     {
415       /* Optimize the dominator tree.  */
416       cfg_altered = false;
417
418       /* We need accurate information regarding back edges in the CFG
419          for jump threading.  */
420       mark_dfs_back_edges ();
421
422       /* Recursively walk the dominator tree optimizing statements.  */
423       walk_dominator_tree (&walk_data, ENTRY_BLOCK_PTR);
424
425       /* If we exposed any new variables, go ahead and put them into
426          SSA form now, before we handle jump threading.  This simplifies
427          interactions between rewriting of _DECL nodes into SSA form
428          and rewriting SSA_NAME nodes into SSA form after block
429          duplication and CFG manipulation.  */
430       update_ssa (TODO_update_ssa);
431
432       free_all_edge_infos ();
433
434       {
435         block_stmt_iterator bsi;
436         basic_block bb;
437         FOR_EACH_BB (bb)
438           {
439             for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
440               {
441                 update_stmt_if_modified (bsi_stmt (bsi));
442               }
443           }
444       }
445
446       /* Thread jumps, creating duplicate blocks as needed.  */
447       cfg_altered |= thread_through_all_blocks ();
448
449       /* Removal of statements may make some EH edges dead.  Purge
450          such edges from the CFG as needed.  */
451       if (!bitmap_empty_p (need_eh_cleanup))
452         {
453           cfg_altered |= tree_purge_all_dead_eh_edges (need_eh_cleanup);
454           bitmap_zero (need_eh_cleanup);
455         }
456
457       if (cfg_altered)
458         free_dominance_info (CDI_DOMINATORS);
459
460       cfg_altered = cleanup_tree_cfg ();
461
462       if (rediscover_loops_after_threading)
463         {
464           /* Rerun basic loop analysis to discover any newly
465              created loops and update the set of exit edges.  */
466           rediscover_loops_after_threading = false;
467           flow_loops_find (&loops_info);
468           mark_loop_exit_edges (&loops_info);
469           flow_loops_free (&loops_info);
470
471           /* Remove any forwarder blocks inserted by loop
472              header canonicalization.  */
473           cleanup_tree_cfg ();
474         }
475
476       calculate_dominance_info (CDI_DOMINATORS);
477
478       update_ssa (TODO_update_ssa);
479
480       /* Reinitialize the various tables.  */
481       bitmap_clear (nonzero_vars);
482       htab_empty (avail_exprs);
483       htab_empty (vrp_data);
484
485       /* Finally, remove everything except invariants in SSA_NAME_VALUE.
486
487          This must be done before we iterate as we might have a
488          reference to an SSA_NAME which was removed by the call to
489          rewrite_ssa_into_ssa.
490
491          Long term we will be able to let everything in SSA_NAME_VALUE
492          persist.  However, for now, we know this is the safe thing to do.  */
493       for (i = 0; i < num_ssa_names; i++)
494         {
495           tree name = ssa_name (i);
496           tree value;
497
498           if (!name)
499             continue;
500
501           value = SSA_NAME_VALUE (name);
502           if (value && !is_gimple_min_invariant (value))
503             SSA_NAME_VALUE (name) = NULL;
504         }
505     }
506   while (optimize > 1 && cfg_altered);
507
508   /* Debugging dumps.  */
509   if (dump_file && (dump_flags & TDF_STATS))
510     dump_dominator_optimization_stats (dump_file);
511
512   /* We emptied the hash table earlier, now delete it completely.  */
513   htab_delete (avail_exprs);
514   htab_delete (vrp_data);
515
516   /* It is not necessary to clear CURRDEFS, REDIRECTION_EDGES, VRP_DATA,
517      CONST_AND_COPIES, and NONZERO_VARS as they all get cleared at the bottom
518      of the do-while loop above.  */
519
520   /* And finalize the dominator walker.  */
521   fini_walk_dominator_tree (&walk_data);
522
523   /* Free nonzero_vars.  */
524   BITMAP_FREE (nonzero_vars);
525   BITMAP_FREE (need_eh_cleanup);
526   
527   VEC_free (tree, heap, avail_exprs_stack);
528   VEC_free (tree, heap, const_and_copies_stack);
529   VEC_free (tree, heap, nonzero_vars_stack);
530   VEC_free (tree, heap, vrp_variables_stack);
531   VEC_free (tree, heap, stmts_to_rescan);
532 }
533
534 static bool
535 gate_dominator (void)
536 {
537   return flag_tree_dom != 0;
538 }
539
540 struct tree_opt_pass pass_dominator = 
541 {
542   "dom",                                /* name */
543   gate_dominator,                       /* gate */
544   tree_ssa_dominator_optimize,          /* execute */
545   NULL,                                 /* sub */
546   NULL,                                 /* next */
547   0,                                    /* static_pass_number */
548   TV_TREE_SSA_DOMINATOR_OPTS,           /* tv_id */
549   PROP_cfg | PROP_ssa | PROP_alias,     /* properties_required */
550   0,                                    /* properties_provided */
551   0,                                    /* properties_destroyed */
552   0,                                    /* todo_flags_start */
553   TODO_dump_func
554     | TODO_update_ssa
555     | TODO_verify_ssa,                  /* todo_flags_finish */
556   0                                     /* letter */
557 };
558
559
560 /* We are exiting E->src, see if E->dest ends with a conditional
561    jump which has a known value when reached via E. 
562
563    Special care is necessary if E is a back edge in the CFG as we
564    will have already recorded equivalences for E->dest into our
565    various tables, including the result of the conditional at
566    the end of E->dest.  Threading opportunities are severely
567    limited in that case to avoid short-circuiting the loop
568    incorrectly.
569
570    Note it is quite common for the first block inside a loop to
571    end with a conditional which is either always true or always
572    false when reached via the loop backedge.  Thus we do not want
573    to blindly disable threading across a loop backedge.  */
574
575 static void
576 thread_across_edge (struct dom_walk_data *walk_data, edge e)
577 {
578   block_stmt_iterator bsi;
579   tree stmt = NULL;
580   tree phi;
581
582   /* If E->dest does not end with a conditional, then there is
583      nothing to do.  */
584   bsi = bsi_last (e->dest);
585   if (bsi_end_p (bsi)
586       || ! bsi_stmt (bsi)
587       || (TREE_CODE (bsi_stmt (bsi)) != COND_EXPR
588           && TREE_CODE (bsi_stmt (bsi)) != GOTO_EXPR
589           && TREE_CODE (bsi_stmt (bsi)) != SWITCH_EXPR))
590     return;
591
592   /* The basic idea here is to use whatever knowledge we have
593      from our dominator walk to simplify statements in E->dest,
594      with the ultimate goal being to simplify the conditional
595      at the end of E->dest.
596
597      Note that we must undo any changes we make to the underlying
598      statements as the simplifications we are making are control
599      flow sensitive (ie, the simplifications are valid when we 
600      traverse E, but may not be valid on other paths to E->dest.  */
601      
602   /* Each PHI creates a temporary equivalence, record them.  Again
603      these are context sensitive equivalences and will be removed
604      by our caller.  */
605   for (phi = phi_nodes (e->dest); phi; phi = PHI_CHAIN (phi))
606     {
607       tree src = PHI_ARG_DEF_FROM_EDGE (phi, e);
608       tree dst = PHI_RESULT (phi);
609
610       /* If the desired argument is not the same as this PHI's result 
611          and it is set by a PHI in E->dest, then we can not thread
612          through E->dest.  */
613       if (src != dst
614           && TREE_CODE (src) == SSA_NAME
615           && TREE_CODE (SSA_NAME_DEF_STMT (src)) == PHI_NODE
616           && bb_for_stmt (SSA_NAME_DEF_STMT (src)) == e->dest)
617         return;
618
619       record_const_or_copy (dst, src);
620     }
621
622   /* Try to simplify each statement in E->dest, ultimately leading to
623      a simplification of the COND_EXPR at the end of E->dest.
624
625      We might consider marking just those statements which ultimately
626      feed the COND_EXPR.  It's not clear if the overhead of bookkeeping
627      would be recovered by trying to simplify fewer statements.
628
629      If we are able to simplify a statement into the form
630      SSA_NAME = (SSA_NAME | gimple invariant), then we can record
631      a context sensitive equivalency which may help us simplify
632      later statements in E->dest. 
633
634      Failure to simplify into the form above merely means that the
635      statement provides no equivalences to help simplify later
636      statements.  This does not prevent threading through E->dest.  */
637   for (bsi = bsi_start (e->dest); ! bsi_end_p (bsi); bsi_next (&bsi))
638     {
639       tree cached_lhs;
640
641       stmt = bsi_stmt (bsi);
642
643       /* Ignore empty statements and labels.  */
644       if (IS_EMPTY_STMT (stmt) || TREE_CODE (stmt) == LABEL_EXPR)
645         continue;
646
647       /* Safely handle threading across loop backedges.  This is
648          over conservative, but still allows us to capture the
649          majority of the cases where we can thread across a loop
650          backedge.  */
651       if ((e->flags & EDGE_DFS_BACK) != 0
652           && TREE_CODE (stmt) != COND_EXPR
653           && TREE_CODE (stmt) != SWITCH_EXPR)
654         return;
655
656       /* If the statement has volatile operands, then we assume we
657          can not thread through this block.  This is overly
658          conservative in some ways.  */
659       if (TREE_CODE (stmt) == ASM_EXPR && ASM_VOLATILE_P (stmt))
660         return;
661
662       /* If this is not a MODIFY_EXPR which sets an SSA_NAME to a new
663          value, then do not try to simplify this statement as it will
664          not simplify in any way that is helpful for jump threading.  */
665       if (TREE_CODE (stmt) != MODIFY_EXPR
666           || TREE_CODE (TREE_OPERAND (stmt, 0)) != SSA_NAME)
667         continue;
668
669       /* At this point we have a statement which assigns an RHS to an
670          SSA_VAR on the LHS.  We want to try and simplify this statement
671          to expose more context sensitive equivalences which in turn may
672          allow us to simplify the condition at the end of the loop.  */
673       if (TREE_CODE (TREE_OPERAND (stmt, 1)) == SSA_NAME)
674         cached_lhs = TREE_OPERAND (stmt, 1);
675       else
676         {
677           /* Copy the operands.  */
678           tree *copy;
679           ssa_op_iter iter;
680           use_operand_p use_p;
681           unsigned int num, i = 0;
682
683           num = NUM_SSA_OPERANDS (stmt, (SSA_OP_USE | SSA_OP_VUSE));
684           copy = xcalloc (num, sizeof (tree));
685
686           /* Make a copy of the uses & vuses into USES_COPY, then cprop into
687              the operands.  */
688           FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE | SSA_OP_VUSE)
689             {
690               tree tmp = NULL;
691               tree use = USE_FROM_PTR (use_p);
692
693               copy[i++] = use;
694               if (TREE_CODE (use) == SSA_NAME)
695                 tmp = SSA_NAME_VALUE (use);
696               if (tmp && TREE_CODE (tmp) != VALUE_HANDLE)
697                 SET_USE (use_p, tmp);
698             }
699
700           /* Try to fold/lookup the new expression.  Inserting the
701              expression into the hash table is unlikely to help
702              simplify anything later, so just query the hashtable.  */
703           cached_lhs = fold (TREE_OPERAND (stmt, 1));
704           if (TREE_CODE (cached_lhs) != SSA_NAME
705               && !is_gimple_min_invariant (cached_lhs))
706             cached_lhs = lookup_avail_expr (stmt, false);
707
708
709           /* Restore the statement's original uses/defs.  */
710           i = 0;
711           FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE | SSA_OP_VUSE)
712             SET_USE (use_p, copy[i++]);
713
714           free (copy);
715         }
716
717       /* Record the context sensitive equivalence if we were able
718          to simplify this statement.  */
719       if (cached_lhs
720           && (TREE_CODE (cached_lhs) == SSA_NAME
721               || is_gimple_min_invariant (cached_lhs)))
722         record_const_or_copy (TREE_OPERAND (stmt, 0), cached_lhs);
723     }
724
725   /* If we stopped at a COND_EXPR or SWITCH_EXPR, see if we know which arm
726      will be taken.  */
727   if (stmt
728       && (TREE_CODE (stmt) == COND_EXPR
729           || TREE_CODE (stmt) == GOTO_EXPR
730           || TREE_CODE (stmt) == SWITCH_EXPR))
731     {
732       tree cond, cached_lhs;
733
734       /* Now temporarily cprop the operands and try to find the resulting
735          expression in the hash tables.  */
736       if (TREE_CODE (stmt) == COND_EXPR)
737         cond = COND_EXPR_COND (stmt);
738       else if (TREE_CODE (stmt) == GOTO_EXPR)
739         cond = GOTO_DESTINATION (stmt);
740       else
741         cond = SWITCH_COND (stmt);
742
743       if (COMPARISON_CLASS_P (cond))
744         {
745           tree dummy_cond, op0, op1;
746           enum tree_code cond_code;
747
748           op0 = TREE_OPERAND (cond, 0);
749           op1 = TREE_OPERAND (cond, 1);
750           cond_code = TREE_CODE (cond);
751
752           /* Get the current value of both operands.  */
753           if (TREE_CODE (op0) == SSA_NAME)
754             {
755               tree tmp = SSA_NAME_VALUE (op0);
756               if (tmp && TREE_CODE (tmp) != VALUE_HANDLE)
757                 op0 = tmp;
758             }
759
760           if (TREE_CODE (op1) == SSA_NAME)
761             {
762               tree tmp = SSA_NAME_VALUE (op1);
763               if (tmp && TREE_CODE (tmp) != VALUE_HANDLE)
764                 op1 = tmp;
765             }
766
767           /* Stuff the operator and operands into our dummy conditional
768              expression, creating the dummy conditional if necessary.  */
769           dummy_cond = walk_data->global_data;
770           if (! dummy_cond)
771             {
772               dummy_cond = build (cond_code, boolean_type_node, op0, op1);
773               dummy_cond = build (COND_EXPR, void_type_node,
774                                   dummy_cond, NULL, NULL);
775               walk_data->global_data = dummy_cond;
776             }
777           else
778             {
779               TREE_SET_CODE (COND_EXPR_COND (dummy_cond), cond_code);
780               TREE_OPERAND (COND_EXPR_COND (dummy_cond), 0) = op0;
781               TREE_OPERAND (COND_EXPR_COND (dummy_cond), 1) = op1;
782             }
783
784           /* If the conditional folds to an invariant, then we are done,
785              otherwise look it up in the hash tables.  */
786           cached_lhs = local_fold (COND_EXPR_COND (dummy_cond));
787           if (! is_gimple_min_invariant (cached_lhs))
788             {
789               cached_lhs = lookup_avail_expr (dummy_cond, false);
790               if (!cached_lhs || ! is_gimple_min_invariant (cached_lhs))
791                 cached_lhs = simplify_cond_and_lookup_avail_expr (dummy_cond,
792                                                                   NULL,
793                                                                   false);
794             }
795         }
796       /* We can have conditionals which just test the state of a
797          variable rather than use a relational operator.  These are
798          simpler to handle.  */
799       else if (TREE_CODE (cond) == SSA_NAME)
800         {
801           cached_lhs = cond;
802           cached_lhs = SSA_NAME_VALUE (cached_lhs);
803           if (cached_lhs && ! is_gimple_min_invariant (cached_lhs))
804             cached_lhs = NULL;
805         }
806       else
807         cached_lhs = lookup_avail_expr (stmt, false);
808
809       if (cached_lhs)
810         {
811           edge taken_edge = find_taken_edge (e->dest, cached_lhs);
812           basic_block dest = (taken_edge ? taken_edge->dest : NULL);
813
814           if (dest == e->dest)
815             return;
816
817           /* If we have a known destination for the conditional, then
818              we can perform this optimization, which saves at least one
819              conditional jump each time it applies since we get to
820              bypass the conditional at our original destination.  */
821           if (dest)
822             {
823               struct edge_info *edge_info;
824
825               update_bb_profile_for_threading (e->dest, EDGE_FREQUENCY (e),
826                                                e->count, taken_edge);
827               if (e->aux)
828                 edge_info = e->aux;
829               else
830                 edge_info = allocate_edge_info (e);
831               edge_info->redirection_target = taken_edge;
832               bb_ann (e->dest)->incoming_edge_threaded = true;
833             }
834         }
835     }
836 }
837
838
839 /* Initialize local stacks for this optimizer and record equivalences
840    upon entry to BB.  Equivalences can come from the edge traversed to
841    reach BB or they may come from PHI nodes at the start of BB.  */
842
843 static void
844 dom_opt_initialize_block (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED,
845                           basic_block bb)
846 {
847   if (dump_file && (dump_flags & TDF_DETAILS))
848     fprintf (dump_file, "\n\nOptimizing block #%d\n\n", bb->index);
849
850   /* Push a marker on the stacks of local information so that we know how
851      far to unwind when we finalize this block.  */
852   VEC_safe_push (tree, heap, avail_exprs_stack, NULL_TREE);
853   VEC_safe_push (tree, heap, const_and_copies_stack, NULL_TREE);
854   VEC_safe_push (tree, heap, nonzero_vars_stack, NULL_TREE);
855   VEC_safe_push (tree, heap, vrp_variables_stack, NULL_TREE);
856
857   record_equivalences_from_incoming_edge (bb);
858
859   /* PHI nodes can create equivalences too.  */
860   record_equivalences_from_phis (bb);
861 }
862
863 /* Given an expression EXPR (a relational expression or a statement), 
864    initialize the hash table element pointed by by ELEMENT.  */
865
866 static void
867 initialize_hash_element (tree expr, tree lhs, struct expr_hash_elt *element)
868 {
869   /* Hash table elements may be based on conditional expressions or statements.
870
871      For the former case, we have no annotation and we want to hash the
872      conditional expression.  In the latter case we have an annotation and
873      we want to record the expression the statement evaluates.  */
874   if (COMPARISON_CLASS_P (expr) || TREE_CODE (expr) == TRUTH_NOT_EXPR)
875     {
876       element->stmt = NULL;
877       element->rhs = expr;
878     }
879   else if (TREE_CODE (expr) == COND_EXPR)
880     {
881       element->stmt = expr;
882       element->rhs = COND_EXPR_COND (expr);
883     }
884   else if (TREE_CODE (expr) == SWITCH_EXPR)
885     {
886       element->stmt = expr;
887       element->rhs = SWITCH_COND (expr);
888     }
889   else if (TREE_CODE (expr) == RETURN_EXPR && TREE_OPERAND (expr, 0))
890     {
891       element->stmt = expr;
892       element->rhs = TREE_OPERAND (TREE_OPERAND (expr, 0), 1);
893     }
894   else if (TREE_CODE (expr) == GOTO_EXPR)
895     {
896       element->stmt = expr;
897       element->rhs = GOTO_DESTINATION (expr);
898     }
899   else
900     {
901       element->stmt = expr;
902       element->rhs = TREE_OPERAND (expr, 1);
903     }
904
905   element->lhs = lhs;
906   element->hash = avail_expr_hash (element);
907 }
908
909 /* Remove all the expressions in LOCALS from TABLE, stopping when there are
910    LIMIT entries left in LOCALs.  */
911
912 static void
913 remove_local_expressions_from_table (void)
914 {
915   /* Remove all the expressions made available in this block.  */
916   while (VEC_length (tree, avail_exprs_stack) > 0)
917     {
918       struct expr_hash_elt element;
919       tree expr = VEC_pop (tree, avail_exprs_stack);
920
921       if (expr == NULL_TREE)
922         break;
923
924       initialize_hash_element (expr, NULL, &element);
925       htab_remove_elt_with_hash (avail_exprs, &element, element.hash);
926     }
927 }
928
929 /* Use the SSA_NAMES in LOCALS to restore TABLE to its original
930    state, stopping when there are LIMIT entries left in LOCALs.  */
931
932 static void
933 restore_nonzero_vars_to_original_value (void)
934 {
935   while (VEC_length (tree, nonzero_vars_stack) > 0)
936     {
937       tree name = VEC_pop (tree, nonzero_vars_stack);
938
939       if (name == NULL)
940         break;
941
942       bitmap_clear_bit (nonzero_vars, SSA_NAME_VERSION (name));
943     }
944 }
945
946 /* Use the source/dest pairs in CONST_AND_COPIES_STACK to restore
947    CONST_AND_COPIES to its original state, stopping when we hit a
948    NULL marker.  */
949
950 static void
951 restore_vars_to_original_value (void)
952 {
953   while (VEC_length (tree, const_and_copies_stack) > 0)
954     {
955       tree prev_value, dest;
956
957       dest = VEC_pop (tree, const_and_copies_stack);
958
959       if (dest == NULL)
960         break;
961
962       prev_value = VEC_pop (tree, const_and_copies_stack);
963       SSA_NAME_VALUE (dest) =  prev_value;
964     }
965 }
966
967 /* We have finished processing the dominator children of BB, perform
968    any finalization actions in preparation for leaving this node in
969    the dominator tree.  */
970
971 static void
972 dom_opt_finalize_block (struct dom_walk_data *walk_data, basic_block bb)
973 {
974   tree last;
975
976   /* If we are at a leaf node in the dominator tree, see if we can thread
977      the edge from BB through its successor.
978
979      Do this before we remove entries from our equivalence tables.  */
980   if (single_succ_p (bb)
981       && (single_succ_edge (bb)->flags & EDGE_ABNORMAL) == 0
982       && (get_immediate_dominator (CDI_DOMINATORS, single_succ (bb)) != bb
983           || phi_nodes (single_succ (bb))))
984         
985     {
986       thread_across_edge (walk_data, single_succ_edge (bb));
987     }
988   else if ((last = last_stmt (bb))
989            && TREE_CODE (last) == GOTO_EXPR
990            && TREE_CODE (TREE_OPERAND (last, 0)) == SSA_NAME)
991     {
992       edge_iterator ei;
993       edge e;
994
995       FOR_EACH_EDGE (e, ei, bb->succs)
996         {
997           thread_across_edge (walk_data, e);
998         }
999     }
1000   else if ((last = last_stmt (bb))
1001            && TREE_CODE (last) == COND_EXPR
1002            && (COMPARISON_CLASS_P (COND_EXPR_COND (last))
1003                || TREE_CODE (COND_EXPR_COND (last)) == SSA_NAME)
1004            && EDGE_COUNT (bb->succs) == 2
1005            && (EDGE_SUCC (bb, 0)->flags & EDGE_ABNORMAL) == 0
1006            && (EDGE_SUCC (bb, 1)->flags & EDGE_ABNORMAL) == 0)
1007     {
1008       edge true_edge, false_edge;
1009
1010       extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
1011
1012       /* If the THEN arm is the end of a dominator tree or has PHI nodes,
1013          then try to thread through its edge.  */
1014       if (get_immediate_dominator (CDI_DOMINATORS, true_edge->dest) != bb
1015           || phi_nodes (true_edge->dest))
1016         {
1017           struct edge_info *edge_info;
1018           unsigned int i;
1019
1020           /* Push a marker onto the available expression stack so that we
1021              unwind any expressions related to the TRUE arm before processing
1022              the false arm below.  */
1023           VEC_safe_push (tree, heap, avail_exprs_stack, NULL_TREE);
1024           VEC_safe_push (tree, heap, const_and_copies_stack, NULL_TREE);
1025
1026           edge_info = true_edge->aux;
1027
1028           /* If we have info associated with this edge, record it into
1029              our equivalency tables.  */
1030           if (edge_info)
1031             {
1032               tree *cond_equivalences = edge_info->cond_equivalences;
1033               tree lhs = edge_info->lhs;
1034               tree rhs = edge_info->rhs;
1035
1036               /* If we have a simple NAME = VALUE equivalency record it.  */
1037               if (lhs && TREE_CODE (lhs) == SSA_NAME)
1038                 record_const_or_copy (lhs, rhs);
1039
1040               /* If we have 0 = COND or 1 = COND equivalences, record them
1041                  into our expression hash tables.  */
1042               if (cond_equivalences)
1043                 for (i = 0; i < edge_info->max_cond_equivalences; i += 2)
1044                   {
1045                     tree expr = cond_equivalences[i];
1046                     tree value = cond_equivalences[i + 1];
1047
1048                     record_cond (expr, value);
1049                   }
1050             }
1051
1052           /* Now thread the edge.  */
1053           thread_across_edge (walk_data, true_edge);
1054
1055           /* And restore the various tables to their state before
1056              we threaded this edge.  */
1057           remove_local_expressions_from_table ();
1058           restore_vars_to_original_value ();
1059         }
1060
1061       /* Similarly for the ELSE arm.  */
1062       if (get_immediate_dominator (CDI_DOMINATORS, false_edge->dest) != bb
1063           || phi_nodes (false_edge->dest))
1064         {
1065           struct edge_info *edge_info;
1066           unsigned int i;
1067
1068           edge_info = false_edge->aux;
1069
1070           /* If we have info associated with this edge, record it into
1071              our equivalency tables.  */
1072           if (edge_info)
1073             {
1074               tree *cond_equivalences = edge_info->cond_equivalences;
1075               tree lhs = edge_info->lhs;
1076               tree rhs = edge_info->rhs;
1077
1078               /* If we have a simple NAME = VALUE equivalency record it.  */
1079               if (lhs && TREE_CODE (lhs) == SSA_NAME)
1080                 record_const_or_copy (lhs, rhs);
1081
1082               /* If we have 0 = COND or 1 = COND equivalences, record them
1083                  into our expression hash tables.  */
1084               if (cond_equivalences)
1085                 for (i = 0; i < edge_info->max_cond_equivalences; i += 2)
1086                   {
1087                     tree expr = cond_equivalences[i];
1088                     tree value = cond_equivalences[i + 1];
1089
1090                     record_cond (expr, value);
1091                   }
1092             }
1093
1094           thread_across_edge (walk_data, false_edge);
1095
1096           /* No need to remove local expressions from our tables
1097              or restore vars to their original value as that will
1098              be done immediately below.  */
1099         }
1100     }
1101
1102   remove_local_expressions_from_table ();
1103   restore_nonzero_vars_to_original_value ();
1104   restore_vars_to_original_value ();
1105
1106   /* Remove VRP records associated with this basic block.  They are no
1107      longer valid.
1108
1109      To be efficient, we note which variables have had their values
1110      constrained in this block.  So walk over each variable in the
1111      VRP_VARIABLEs array.  */
1112   while (VEC_length (tree, vrp_variables_stack) > 0)
1113     {
1114       tree var = VEC_pop (tree, vrp_variables_stack);
1115       struct vrp_hash_elt vrp_hash_elt, *vrp_hash_elt_p;
1116       void **slot;
1117
1118       /* Each variable has a stack of value range records.  We want to
1119          invalidate those associated with our basic block.  So we walk
1120          the array backwards popping off records associated with our
1121          block.  Once we hit a record not associated with our block
1122          we are done.  */
1123       varray_type var_vrp_records;
1124
1125       if (var == NULL)
1126         break;
1127
1128       vrp_hash_elt.var = var;
1129       vrp_hash_elt.records = NULL;
1130
1131       slot = htab_find_slot (vrp_data, &vrp_hash_elt, NO_INSERT);
1132
1133       vrp_hash_elt_p = (struct vrp_hash_elt *) *slot;
1134       var_vrp_records = vrp_hash_elt_p->records;
1135
1136       while (VARRAY_ACTIVE_SIZE (var_vrp_records) > 0)
1137         {
1138           struct vrp_element *element
1139             = (struct vrp_element *)VARRAY_TOP_GENERIC_PTR (var_vrp_records);
1140
1141           if (element->bb != bb)
1142             break;
1143   
1144           VARRAY_POP (var_vrp_records);
1145         }
1146     }
1147
1148   /* If we queued any statements to rescan in this block, then
1149      go ahead and rescan them now.  */
1150   while (VEC_length (tree, stmts_to_rescan) > 0)
1151     {
1152       tree stmt = VEC_last (tree, stmts_to_rescan);
1153       basic_block stmt_bb = bb_for_stmt (stmt);
1154
1155       if (stmt_bb != bb)
1156         break;
1157
1158       VEC_pop (tree, stmts_to_rescan);
1159       mark_new_vars_to_rename (stmt);
1160     }
1161 }
1162
1163 /* PHI nodes can create equivalences too.
1164
1165    Ignoring any alternatives which are the same as the result, if
1166    all the alternatives are equal, then the PHI node creates an
1167    equivalence.
1168
1169    Additionally, if all the PHI alternatives are known to have a nonzero
1170    value, then the result of this PHI is known to have a nonzero value,
1171    even if we do not know its exact value.  */
1172
1173 static void
1174 record_equivalences_from_phis (basic_block bb)
1175 {
1176   tree phi;
1177
1178   for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
1179     {
1180       tree lhs = PHI_RESULT (phi);
1181       tree rhs = NULL;
1182       int i;
1183
1184       for (i = 0; i < PHI_NUM_ARGS (phi); i++)
1185         {
1186           tree t = PHI_ARG_DEF (phi, i);
1187
1188           /* Ignore alternatives which are the same as our LHS.  Since
1189              LHS is a PHI_RESULT, it is known to be a SSA_NAME, so we
1190              can simply compare pointers.  */
1191           if (lhs == t)
1192             continue;
1193
1194           /* If we have not processed an alternative yet, then set
1195              RHS to this alternative.  */
1196           if (rhs == NULL)
1197             rhs = t;
1198           /* If we have processed an alternative (stored in RHS), then
1199              see if it is equal to this one.  If it isn't, then stop
1200              the search.  */
1201           else if (! operand_equal_for_phi_arg_p (rhs, t))
1202             break;
1203         }
1204
1205       /* If we had no interesting alternatives, then all the RHS alternatives
1206          must have been the same as LHS.  */
1207       if (!rhs)
1208         rhs = lhs;
1209
1210       /* If we managed to iterate through each PHI alternative without
1211          breaking out of the loop, then we have a PHI which may create
1212          a useful equivalence.  We do not need to record unwind data for
1213          this, since this is a true assignment and not an equivalence
1214          inferred from a comparison.  All uses of this ssa name are dominated
1215          by this assignment, so unwinding just costs time and space.  */
1216       if (i == PHI_NUM_ARGS (phi)
1217           && may_propagate_copy (lhs, rhs))
1218         SSA_NAME_VALUE (lhs) = rhs;
1219
1220       /* Now see if we know anything about the nonzero property for the
1221          result of this PHI.  */
1222       for (i = 0; i < PHI_NUM_ARGS (phi); i++)
1223         {
1224           if (!PHI_ARG_NONZERO (phi, i))
1225             break;
1226         }
1227
1228       if (i == PHI_NUM_ARGS (phi))
1229         bitmap_set_bit (nonzero_vars, SSA_NAME_VERSION (PHI_RESULT (phi)));
1230     }
1231 }
1232
1233 /* Ignoring loop backedges, if BB has precisely one incoming edge then
1234    return that edge.  Otherwise return NULL.  */
1235 static edge
1236 single_incoming_edge_ignoring_loop_edges (basic_block bb)
1237 {
1238   edge retval = NULL;
1239   edge e;
1240   edge_iterator ei;
1241
1242   FOR_EACH_EDGE (e, ei, bb->preds)
1243     {
1244       /* A loop back edge can be identified by the destination of
1245          the edge dominating the source of the edge.  */
1246       if (dominated_by_p (CDI_DOMINATORS, e->src, e->dest))
1247         continue;
1248
1249       /* If we have already seen a non-loop edge, then we must have
1250          multiple incoming non-loop edges and thus we return NULL.  */
1251       if (retval)
1252         return NULL;
1253
1254       /* This is the first non-loop incoming edge we have found.  Record
1255          it.  */
1256       retval = e;
1257     }
1258
1259   return retval;
1260 }
1261
1262 /* Record any equivalences created by the incoming edge to BB.  If BB
1263    has more than one incoming edge, then no equivalence is created.  */
1264
1265 static void
1266 record_equivalences_from_incoming_edge (basic_block bb)
1267 {
1268   edge e;
1269   basic_block parent;
1270   struct edge_info *edge_info;
1271
1272   /* If our parent block ended with a control statement, then we may be
1273      able to record some equivalences based on which outgoing edge from
1274      the parent was followed.  */
1275   parent = get_immediate_dominator (CDI_DOMINATORS, bb);
1276
1277   e = single_incoming_edge_ignoring_loop_edges (bb);
1278
1279   /* If we had a single incoming edge from our parent block, then enter
1280      any data associated with the edge into our tables.  */
1281   if (e && e->src == parent)
1282     {
1283       unsigned int i;
1284
1285       edge_info = e->aux;
1286
1287       if (edge_info)
1288         {
1289           tree lhs = edge_info->lhs;
1290           tree rhs = edge_info->rhs;
1291           tree *cond_equivalences = edge_info->cond_equivalences;
1292
1293           if (lhs)
1294             record_equality (lhs, rhs);
1295
1296           if (cond_equivalences)
1297             {
1298               bool recorded_range = false;
1299               for (i = 0; i < edge_info->max_cond_equivalences; i += 2)
1300                 {
1301                   tree expr = cond_equivalences[i];
1302                   tree value = cond_equivalences[i + 1];
1303
1304                   record_cond (expr, value);
1305
1306                   /* For the first true equivalence, record range
1307                      information.  We only do this for the first
1308                      true equivalence as it should dominate any
1309                      later true equivalences.  */
1310                   if (! recorded_range 
1311                       && COMPARISON_CLASS_P (expr)
1312                       && value == boolean_true_node
1313                       && TREE_CONSTANT (TREE_OPERAND (expr, 1)))
1314                     {
1315                       record_range (expr, bb);
1316                       recorded_range = true;
1317                     }
1318                 }
1319             }
1320         }
1321     }
1322 }
1323
1324 /* Dump SSA statistics on FILE.  */
1325
1326 void
1327 dump_dominator_optimization_stats (FILE *file)
1328 {
1329   long n_exprs;
1330
1331   fprintf (file, "Total number of statements:                   %6ld\n\n",
1332            opt_stats.num_stmts);
1333   fprintf (file, "Exprs considered for dominator optimizations: %6ld\n",
1334            opt_stats.num_exprs_considered);
1335
1336   n_exprs = opt_stats.num_exprs_considered;
1337   if (n_exprs == 0)
1338     n_exprs = 1;
1339
1340   fprintf (file, "    Redundant expressions eliminated:         %6ld (%.0f%%)\n",
1341            opt_stats.num_re, PERCENT (opt_stats.num_re,
1342                                       n_exprs));
1343   fprintf (file, "    Constants propagated:                     %6ld\n",
1344            opt_stats.num_const_prop);
1345   fprintf (file, "    Copies propagated:                        %6ld\n",
1346            opt_stats.num_copy_prop);
1347
1348   fprintf (file, "\nHash table statistics:\n");
1349
1350   fprintf (file, "    avail_exprs: ");
1351   htab_statistics (file, avail_exprs);
1352 }
1353
1354
1355 /* Dump SSA statistics on stderr.  */
1356
1357 void
1358 debug_dominator_optimization_stats (void)
1359 {
1360   dump_dominator_optimization_stats (stderr);
1361 }
1362
1363
1364 /* Dump statistics for the hash table HTAB.  */
1365
1366 static void
1367 htab_statistics (FILE *file, htab_t htab)
1368 {
1369   fprintf (file, "size %ld, %ld elements, %f collision/search ratio\n",
1370            (long) htab_size (htab),
1371            (long) htab_elements (htab),
1372            htab_collisions (htab));
1373 }
1374
1375 /* Record the fact that VAR has a nonzero value, though we may not know
1376    its exact value.  Note that if VAR is already known to have a nonzero
1377    value, then we do nothing.  */
1378
1379 static void
1380 record_var_is_nonzero (tree var)
1381 {
1382   int indx = SSA_NAME_VERSION (var);
1383
1384   if (bitmap_bit_p (nonzero_vars, indx))
1385     return;
1386
1387   /* Mark it in the global table.  */
1388   bitmap_set_bit (nonzero_vars, indx);
1389
1390   /* Record this SSA_NAME so that we can reset the global table
1391      when we leave this block.  */
1392   VEC_safe_push (tree, heap, nonzero_vars_stack, var);
1393 }
1394
1395 /* Enter a statement into the true/false expression hash table indicating
1396    that the condition COND has the value VALUE.  */
1397
1398 static void
1399 record_cond (tree cond, tree value)
1400 {
1401   struct expr_hash_elt *element = xmalloc (sizeof (struct expr_hash_elt));
1402   void **slot;
1403
1404   initialize_hash_element (cond, value, element);
1405
1406   slot = htab_find_slot_with_hash (avail_exprs, (void *)element,
1407                                    element->hash, INSERT);
1408   if (*slot == NULL)
1409     {
1410       *slot = (void *) element;
1411       VEC_safe_push (tree, heap, avail_exprs_stack, cond);
1412     }
1413   else
1414     free (element);
1415 }
1416
1417 /* Build a new conditional using NEW_CODE, OP0 and OP1 and store
1418    the new conditional into *p, then store a boolean_true_node
1419    into *(p + 1).  */
1420    
1421 static void
1422 build_and_record_new_cond (enum tree_code new_code, tree op0, tree op1, tree *p)
1423 {
1424   *p = build2 (new_code, boolean_type_node, op0, op1);
1425   p++;
1426   *p = boolean_true_node;
1427 }
1428
1429 /* Record that COND is true and INVERTED is false into the edge information
1430    structure.  Also record that any conditions dominated by COND are true
1431    as well.
1432
1433    For example, if a < b is true, then a <= b must also be true.  */
1434
1435 static void
1436 record_conditions (struct edge_info *edge_info, tree cond, tree inverted)
1437 {
1438   tree op0, op1;
1439
1440   if (!COMPARISON_CLASS_P (cond))
1441     return;
1442
1443   op0 = TREE_OPERAND (cond, 0);
1444   op1 = TREE_OPERAND (cond, 1);
1445
1446   switch (TREE_CODE (cond))
1447     {
1448     case LT_EXPR:
1449     case GT_EXPR:
1450       edge_info->max_cond_equivalences = 12;
1451       edge_info->cond_equivalences = xmalloc (12 * sizeof (tree));
1452       build_and_record_new_cond ((TREE_CODE (cond) == LT_EXPR
1453                                   ? LE_EXPR : GE_EXPR),
1454                                  op0, op1, &edge_info->cond_equivalences[4]);
1455       build_and_record_new_cond (ORDERED_EXPR, op0, op1,
1456                                  &edge_info->cond_equivalences[6]);
1457       build_and_record_new_cond (NE_EXPR, op0, op1,
1458                                  &edge_info->cond_equivalences[8]);
1459       build_and_record_new_cond (LTGT_EXPR, op0, op1,
1460                                  &edge_info->cond_equivalences[10]);
1461       break;
1462
1463     case GE_EXPR:
1464     case LE_EXPR:
1465       edge_info->max_cond_equivalences = 6;
1466       edge_info->cond_equivalences = xmalloc (6 * sizeof (tree));
1467       build_and_record_new_cond (ORDERED_EXPR, op0, op1,
1468                                  &edge_info->cond_equivalences[4]);
1469       break;
1470
1471     case EQ_EXPR:
1472       edge_info->max_cond_equivalences = 10;
1473       edge_info->cond_equivalences = xmalloc (10 * sizeof (tree));
1474       build_and_record_new_cond (ORDERED_EXPR, op0, op1,
1475                                  &edge_info->cond_equivalences[4]);
1476       build_and_record_new_cond (LE_EXPR, op0, op1,
1477                                  &edge_info->cond_equivalences[6]);
1478       build_and_record_new_cond (GE_EXPR, op0, op1,
1479                                  &edge_info->cond_equivalences[8]);
1480       break;
1481
1482     case UNORDERED_EXPR:
1483       edge_info->max_cond_equivalences = 16;
1484       edge_info->cond_equivalences = xmalloc (16 * sizeof (tree));
1485       build_and_record_new_cond (NE_EXPR, op0, op1,
1486                                  &edge_info->cond_equivalences[4]);
1487       build_and_record_new_cond (UNLE_EXPR, op0, op1,
1488                                  &edge_info->cond_equivalences[6]);
1489       build_and_record_new_cond (UNGE_EXPR, op0, op1,
1490                                  &edge_info->cond_equivalences[8]);
1491       build_and_record_new_cond (UNEQ_EXPR, op0, op1,
1492                                  &edge_info->cond_equivalences[10]);
1493       build_and_record_new_cond (UNLT_EXPR, op0, op1,
1494                                  &edge_info->cond_equivalences[12]);
1495       build_and_record_new_cond (UNGT_EXPR, op0, op1,
1496                                  &edge_info->cond_equivalences[14]);
1497       break;
1498
1499     case UNLT_EXPR:
1500     case UNGT_EXPR:
1501       edge_info->max_cond_equivalences = 8;
1502       edge_info->cond_equivalences = xmalloc (8 * sizeof (tree));
1503       build_and_record_new_cond ((TREE_CODE (cond) == UNLT_EXPR
1504                                   ? UNLE_EXPR : UNGE_EXPR),
1505                                  op0, op1, &edge_info->cond_equivalences[4]);
1506       build_and_record_new_cond (NE_EXPR, op0, op1,
1507                                  &edge_info->cond_equivalences[6]);
1508       break;
1509
1510     case UNEQ_EXPR:
1511       edge_info->max_cond_equivalences = 8;
1512       edge_info->cond_equivalences = xmalloc (8 * sizeof (tree));
1513       build_and_record_new_cond (UNLE_EXPR, op0, op1,
1514                                  &edge_info->cond_equivalences[4]);
1515       build_and_record_new_cond (UNGE_EXPR, op0, op1,
1516                                  &edge_info->cond_equivalences[6]);
1517       break;
1518
1519     case LTGT_EXPR:
1520       edge_info->max_cond_equivalences = 8;
1521       edge_info->cond_equivalences = xmalloc (8 * sizeof (tree));
1522       build_and_record_new_cond (NE_EXPR, op0, op1,
1523                                  &edge_info->cond_equivalences[4]);
1524       build_and_record_new_cond (ORDERED_EXPR, op0, op1,
1525                                  &edge_info->cond_equivalences[6]);
1526       break;
1527
1528     default:
1529       edge_info->max_cond_equivalences = 4;
1530       edge_info->cond_equivalences = xmalloc (4 * sizeof (tree));
1531       break;
1532     }
1533
1534   /* Now store the original true and false conditions into the first
1535      two slots.  */
1536   edge_info->cond_equivalences[0] = cond;
1537   edge_info->cond_equivalences[1] = boolean_true_node;
1538   edge_info->cond_equivalences[2] = inverted;
1539   edge_info->cond_equivalences[3] = boolean_false_node;
1540 }
1541
1542 /* A helper function for record_const_or_copy and record_equality.
1543    Do the work of recording the value and undo info.  */
1544
1545 static void
1546 record_const_or_copy_1 (tree x, tree y, tree prev_x)
1547 {
1548   SSA_NAME_VALUE (x) = y;
1549
1550   VEC_reserve (tree, heap, const_and_copies_stack, 2);
1551   VEC_quick_push (tree, const_and_copies_stack, prev_x);
1552   VEC_quick_push (tree, const_and_copies_stack, x);
1553 }
1554
1555
1556 /* Return the loop depth of the basic block of the defining statement of X.
1557    This number should not be treated as absolutely correct because the loop
1558    information may not be completely up-to-date when dom runs.  However, it
1559    will be relatively correct, and as more passes are taught to keep loop info
1560    up to date, the result will become more and more accurate.  */
1561
1562 int
1563 loop_depth_of_name (tree x)
1564 {
1565   tree defstmt;
1566   basic_block defbb;
1567
1568   /* If it's not an SSA_NAME, we have no clue where the definition is.  */
1569   if (TREE_CODE (x) != SSA_NAME)
1570     return 0;
1571
1572   /* Otherwise return the loop depth of the defining statement's bb.
1573      Note that there may not actually be a bb for this statement, if the
1574      ssa_name is live on entry.  */
1575   defstmt = SSA_NAME_DEF_STMT (x);
1576   defbb = bb_for_stmt (defstmt);
1577   if (!defbb)
1578     return 0;
1579
1580   return defbb->loop_depth;
1581 }
1582
1583
1584 /* Record that X is equal to Y in const_and_copies.  Record undo
1585    information in the block-local vector.  */
1586
1587 static void
1588 record_const_or_copy (tree x, tree y)
1589 {
1590   tree prev_x = SSA_NAME_VALUE (x);
1591
1592   if (TREE_CODE (y) == SSA_NAME)
1593     {
1594       tree tmp = SSA_NAME_VALUE (y);
1595       if (tmp)
1596         y = tmp;
1597     }
1598
1599   record_const_or_copy_1 (x, y, prev_x);
1600 }
1601
1602 /* Similarly, but assume that X and Y are the two operands of an EQ_EXPR.
1603    This constrains the cases in which we may treat this as assignment.  */
1604
1605 static void
1606 record_equality (tree x, tree y)
1607 {
1608   tree prev_x = NULL, prev_y = NULL;
1609
1610   if (TREE_CODE (x) == SSA_NAME)
1611     prev_x = SSA_NAME_VALUE (x);
1612   if (TREE_CODE (y) == SSA_NAME)
1613     prev_y = SSA_NAME_VALUE (y);
1614
1615   /* If one of the previous values is invariant, or invariant in more loops
1616      (by depth), then use that.
1617      Otherwise it doesn't matter which value we choose, just so
1618      long as we canonicalize on one value.  */
1619   if (TREE_INVARIANT (y))
1620     ;
1621   else if (TREE_INVARIANT (x) || (loop_depth_of_name (x) <= loop_depth_of_name (y)))
1622     prev_x = x, x = y, y = prev_x, prev_x = prev_y;
1623   else if (prev_x && TREE_INVARIANT (prev_x))
1624     x = y, y = prev_x, prev_x = prev_y;
1625   else if (prev_y && TREE_CODE (prev_y) != VALUE_HANDLE)
1626     y = prev_y;
1627
1628   /* After the swapping, we must have one SSA_NAME.  */
1629   if (TREE_CODE (x) != SSA_NAME)
1630     return;
1631
1632   /* For IEEE, -0.0 == 0.0, so we don't necessarily know the sign of a
1633      variable compared against zero.  If we're honoring signed zeros,
1634      then we cannot record this value unless we know that the value is
1635      nonzero.  */
1636   if (HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (x)))
1637       && (TREE_CODE (y) != REAL_CST
1638           || REAL_VALUES_EQUAL (dconst0, TREE_REAL_CST (y))))
1639     return;
1640
1641   record_const_or_copy_1 (x, y, prev_x);
1642 }
1643
1644 /* Return true, if it is ok to do folding of an associative expression.
1645    EXP is the tree for the associative expression.  */ 
1646
1647 static inline bool
1648 unsafe_associative_fp_binop (tree exp)
1649 {
1650   enum tree_code code = TREE_CODE (exp);
1651   return !(!flag_unsafe_math_optimizations
1652            && (code == MULT_EXPR || code == PLUS_EXPR
1653                || code == MINUS_EXPR)
1654            && FLOAT_TYPE_P (TREE_TYPE (exp)));
1655 }
1656
1657 /* Returns true when STMT is a simple iv increment.  It detects the
1658    following situation:
1659    
1660    i_1 = phi (..., i_2)
1661    i_2 = i_1 +/- ...  */
1662
1663 static bool
1664 simple_iv_increment_p (tree stmt)
1665 {
1666   tree lhs, rhs, preinc, phi;
1667   unsigned i;
1668
1669   if (TREE_CODE (stmt) != MODIFY_EXPR)
1670     return false;
1671
1672   lhs = TREE_OPERAND (stmt, 0);
1673   if (TREE_CODE (lhs) != SSA_NAME)
1674     return false;
1675
1676   rhs = TREE_OPERAND (stmt, 1);
1677
1678   if (TREE_CODE (rhs) != PLUS_EXPR
1679       && TREE_CODE (rhs) != MINUS_EXPR)
1680     return false;
1681
1682   preinc = TREE_OPERAND (rhs, 0);
1683   if (TREE_CODE (preinc) != SSA_NAME)
1684     return false;
1685
1686   phi = SSA_NAME_DEF_STMT (preinc);
1687   if (TREE_CODE (phi) != PHI_NODE)
1688     return false;
1689
1690   for (i = 0; i < (unsigned) PHI_NUM_ARGS (phi); i++)
1691     if (PHI_ARG_DEF (phi, i) == lhs)
1692       return true;
1693
1694   return false;
1695 }
1696
1697 /* STMT is a MODIFY_EXPR for which we were unable to find RHS in the
1698    hash tables.  Try to simplify the RHS using whatever equivalences
1699    we may have recorded.
1700
1701    If we are able to simplify the RHS, then lookup the simplified form in
1702    the hash table and return the result.  Otherwise return NULL.  */
1703
1704 static tree
1705 simplify_rhs_and_lookup_avail_expr (struct dom_walk_data *walk_data,
1706                                     tree stmt, int insert)
1707 {
1708   tree rhs = TREE_OPERAND (stmt, 1);
1709   enum tree_code rhs_code = TREE_CODE (rhs);
1710   tree result = NULL;
1711
1712   /* If we have lhs = ~x, look and see if we earlier had x = ~y.
1713      In which case we can change this statement to be lhs = y.
1714      Which can then be copy propagated. 
1715
1716      Similarly for negation.  */
1717   if ((rhs_code == BIT_NOT_EXPR || rhs_code == NEGATE_EXPR)
1718       && TREE_CODE (TREE_OPERAND (rhs, 0)) == SSA_NAME)
1719     {
1720       /* Get the definition statement for our RHS.  */
1721       tree rhs_def_stmt = SSA_NAME_DEF_STMT (TREE_OPERAND (rhs, 0));
1722
1723       /* See if the RHS_DEF_STMT has the same form as our statement.  */
1724       if (TREE_CODE (rhs_def_stmt) == MODIFY_EXPR
1725           && TREE_CODE (TREE_OPERAND (rhs_def_stmt, 1)) == rhs_code)
1726         {
1727           tree rhs_def_operand;
1728
1729           rhs_def_operand = TREE_OPERAND (TREE_OPERAND (rhs_def_stmt, 1), 0);
1730
1731           /* Verify that RHS_DEF_OPERAND is a suitable SSA variable.  */
1732           if (TREE_CODE (rhs_def_operand) == SSA_NAME
1733               && ! SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rhs_def_operand))
1734             result = update_rhs_and_lookup_avail_expr (stmt,
1735                                                        rhs_def_operand,
1736                                                        insert);
1737         }
1738     }
1739
1740   /* If we have z = (x OP C1), see if we earlier had x = y OP C2.
1741      If OP is associative, create and fold (y OP C2) OP C1 which
1742      should result in (y OP C3), use that as the RHS for the
1743      assignment.  Add minus to this, as we handle it specially below.  */
1744   if ((associative_tree_code (rhs_code) || rhs_code == MINUS_EXPR)
1745       && TREE_CODE (TREE_OPERAND (rhs, 0)) == SSA_NAME
1746       && is_gimple_min_invariant (TREE_OPERAND (rhs, 1)))
1747     {
1748       tree rhs_def_stmt = SSA_NAME_DEF_STMT (TREE_OPERAND (rhs, 0));
1749
1750       /* If the statement defines an induction variable, do not propagate
1751          its value, so that we do not create overlapping life ranges.  */
1752       if (simple_iv_increment_p (rhs_def_stmt))
1753         goto dont_fold_assoc;
1754
1755       /* See if the RHS_DEF_STMT has the same form as our statement.  */
1756       if (TREE_CODE (rhs_def_stmt) == MODIFY_EXPR)
1757         {
1758           tree rhs_def_rhs = TREE_OPERAND (rhs_def_stmt, 1);
1759           enum tree_code rhs_def_code = TREE_CODE (rhs_def_rhs);
1760
1761           if ((rhs_code == rhs_def_code && unsafe_associative_fp_binop (rhs))
1762               || (rhs_code == PLUS_EXPR && rhs_def_code == MINUS_EXPR)
1763               || (rhs_code == MINUS_EXPR && rhs_def_code == PLUS_EXPR))
1764             {
1765               tree def_stmt_op0 = TREE_OPERAND (rhs_def_rhs, 0);
1766               tree def_stmt_op1 = TREE_OPERAND (rhs_def_rhs, 1);
1767
1768               if (TREE_CODE (def_stmt_op0) == SSA_NAME
1769                   && ! SSA_NAME_OCCURS_IN_ABNORMAL_PHI (def_stmt_op0)
1770                   && is_gimple_min_invariant (def_stmt_op1))
1771                 {
1772                   tree outer_const = TREE_OPERAND (rhs, 1);
1773                   tree type = TREE_TYPE (TREE_OPERAND (stmt, 0));
1774                   tree t;
1775
1776                   /* If we care about correct floating point results, then
1777                      don't fold x + c1 - c2.  Note that we need to take both
1778                      the codes and the signs to figure this out.  */
1779                   if (FLOAT_TYPE_P (type)
1780                       && !flag_unsafe_math_optimizations
1781                       && (rhs_def_code == PLUS_EXPR
1782                           || rhs_def_code == MINUS_EXPR))
1783                     {
1784                       bool neg = false;
1785
1786                       neg ^= (rhs_code == MINUS_EXPR);
1787                       neg ^= (rhs_def_code == MINUS_EXPR);
1788                       neg ^= real_isneg (TREE_REAL_CST_PTR (outer_const));
1789                       neg ^= real_isneg (TREE_REAL_CST_PTR (def_stmt_op1));
1790
1791                       if (neg)
1792                         goto dont_fold_assoc;
1793                     }
1794
1795                   /* Ho hum.  So fold will only operate on the outermost
1796                      thingy that we give it, so we have to build the new
1797                      expression in two pieces.  This requires that we handle
1798                      combinations of plus and minus.  */
1799                   if (rhs_def_code != rhs_code)
1800                     {
1801                       if (rhs_def_code == MINUS_EXPR)
1802                         t = build (MINUS_EXPR, type, outer_const, def_stmt_op1);
1803                       else
1804                         t = build (MINUS_EXPR, type, def_stmt_op1, outer_const);
1805                       rhs_code = PLUS_EXPR;
1806                     }
1807                   else if (rhs_def_code == MINUS_EXPR)
1808                     t = build (PLUS_EXPR, type, def_stmt_op1, outer_const);
1809                   else
1810                     t = build (rhs_def_code, type, def_stmt_op1, outer_const);
1811                   t = local_fold (t);
1812                   t = build (rhs_code, type, def_stmt_op0, t);
1813                   t = local_fold (t);
1814
1815                   /* If the result is a suitable looking gimple expression,
1816                      then use it instead of the original for STMT.  */
1817                   if (TREE_CODE (t) == SSA_NAME
1818                       || (UNARY_CLASS_P (t)
1819                           && TREE_CODE (TREE_OPERAND (t, 0)) == SSA_NAME)
1820                       || ((BINARY_CLASS_P (t) || COMPARISON_CLASS_P (t))
1821                           && TREE_CODE (TREE_OPERAND (t, 0)) == SSA_NAME
1822                           && is_gimple_val (TREE_OPERAND (t, 1))))
1823                     result = update_rhs_and_lookup_avail_expr (stmt, t, insert);
1824                 }
1825             }
1826         }
1827  dont_fold_assoc:;
1828     }
1829
1830   /* Transform TRUNC_DIV_EXPR and TRUNC_MOD_EXPR into RSHIFT_EXPR
1831      and BIT_AND_EXPR respectively if the first operand is greater
1832      than zero and the second operand is an exact power of two.  */
1833   if ((rhs_code == TRUNC_DIV_EXPR || rhs_code == TRUNC_MOD_EXPR)
1834       && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (rhs, 0)))
1835       && integer_pow2p (TREE_OPERAND (rhs, 1)))
1836     {
1837       tree val;
1838       tree op = TREE_OPERAND (rhs, 0);
1839
1840       if (TYPE_UNSIGNED (TREE_TYPE (op)))
1841         {
1842           val = integer_one_node;
1843         }
1844       else
1845         {
1846           tree dummy_cond = walk_data->global_data;
1847
1848           if (! dummy_cond)
1849             {
1850               dummy_cond = build (GT_EXPR, boolean_type_node,
1851                                   op, integer_zero_node);
1852               dummy_cond = build (COND_EXPR, void_type_node,
1853                                   dummy_cond, NULL, NULL);
1854               walk_data->global_data = dummy_cond;
1855             }
1856           else
1857             {
1858               TREE_SET_CODE (COND_EXPR_COND (dummy_cond), GT_EXPR);
1859               TREE_OPERAND (COND_EXPR_COND (dummy_cond), 0) = op;
1860               TREE_OPERAND (COND_EXPR_COND (dummy_cond), 1)
1861                 = integer_zero_node;
1862             }
1863           val = simplify_cond_and_lookup_avail_expr (dummy_cond, NULL, false);
1864         }
1865
1866       if (val && integer_onep (val))
1867         {
1868           tree t;
1869           tree op0 = TREE_OPERAND (rhs, 0);
1870           tree op1 = TREE_OPERAND (rhs, 1);
1871
1872           if (rhs_code == TRUNC_DIV_EXPR)
1873             t = build (RSHIFT_EXPR, TREE_TYPE (op0), op0,
1874                        build_int_cst (NULL_TREE, tree_log2 (op1)));
1875           else
1876             t = build (BIT_AND_EXPR, TREE_TYPE (op0), op0,
1877                        local_fold (build (MINUS_EXPR, TREE_TYPE (op1),
1878                                           op1, integer_one_node)));
1879
1880           result = update_rhs_and_lookup_avail_expr (stmt, t, insert);
1881         }
1882     }
1883
1884   /* Transform ABS (X) into X or -X as appropriate.  */
1885   if (rhs_code == ABS_EXPR
1886       && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (rhs, 0))))
1887     {
1888       tree val;
1889       tree op = TREE_OPERAND (rhs, 0);
1890       tree type = TREE_TYPE (op);
1891
1892       if (TYPE_UNSIGNED (type))
1893         {
1894           val = integer_zero_node;
1895         }
1896       else
1897         {
1898           tree dummy_cond = walk_data->global_data;
1899
1900           if (! dummy_cond)
1901             {
1902               dummy_cond = build (LE_EXPR, boolean_type_node,
1903                                   op, integer_zero_node);
1904               dummy_cond = build (COND_EXPR, void_type_node,
1905                                   dummy_cond, NULL, NULL);
1906               walk_data->global_data = dummy_cond;
1907             }
1908           else
1909             {
1910               TREE_SET_CODE (COND_EXPR_COND (dummy_cond), LE_EXPR);
1911               TREE_OPERAND (COND_EXPR_COND (dummy_cond), 0) = op;
1912               TREE_OPERAND (COND_EXPR_COND (dummy_cond), 1)
1913                 = build_int_cst (type, 0);
1914             }
1915           val = simplify_cond_and_lookup_avail_expr (dummy_cond, NULL, false);
1916
1917           if (!val)
1918             {
1919               TREE_SET_CODE (COND_EXPR_COND (dummy_cond), GE_EXPR);
1920               TREE_OPERAND (COND_EXPR_COND (dummy_cond), 0) = op;
1921               TREE_OPERAND (COND_EXPR_COND (dummy_cond), 1)
1922                 = build_int_cst (type, 0);
1923
1924               val = simplify_cond_and_lookup_avail_expr (dummy_cond,
1925                                                          NULL, false);
1926
1927               if (val)
1928                 {
1929                   if (integer_zerop (val))
1930                     val = integer_one_node;
1931                   else if (integer_onep (val))
1932                     val = integer_zero_node;
1933                 }
1934             }
1935         }
1936
1937       if (val
1938           && (integer_onep (val) || integer_zerop (val)))
1939         {
1940           tree t;
1941
1942           if (integer_onep (val))
1943             t = build1 (NEGATE_EXPR, TREE_TYPE (op), op);
1944           else
1945             t = op;
1946
1947           result = update_rhs_and_lookup_avail_expr (stmt, t, insert);
1948         }
1949     }
1950
1951   /* Optimize *"foo" into 'f'.  This is done here rather than
1952      in fold to avoid problems with stuff like &*"foo".  */
1953   if (TREE_CODE (rhs) == INDIRECT_REF || TREE_CODE (rhs) == ARRAY_REF)
1954     {
1955       tree t = fold_read_from_constant_string (rhs);
1956
1957       if (t)
1958         result = update_rhs_and_lookup_avail_expr (stmt, t, insert);
1959     }
1960
1961   return result;
1962 }
1963
1964 /* COND is a condition of the form:
1965
1966      x == const or x != const
1967
1968    Look back to x's defining statement and see if x is defined as
1969
1970      x = (type) y;
1971
1972    If const is unchanged if we convert it to type, then we can build
1973    the equivalent expression:
1974
1975
1976       y == const or y != const
1977
1978    Which may allow further optimizations.
1979
1980    Return the equivalent comparison or NULL if no such equivalent comparison
1981    was found.  */
1982
1983 static tree
1984 find_equivalent_equality_comparison (tree cond)
1985 {
1986   tree op0 = TREE_OPERAND (cond, 0);
1987   tree op1 = TREE_OPERAND (cond, 1);
1988   tree def_stmt = SSA_NAME_DEF_STMT (op0);
1989
1990   /* OP0 might have been a parameter, so first make sure it
1991      was defined by a MODIFY_EXPR.  */
1992   if (def_stmt && TREE_CODE (def_stmt) == MODIFY_EXPR)
1993     {
1994       tree def_rhs = TREE_OPERAND (def_stmt, 1);
1995
1996       /* Now make sure the RHS of the MODIFY_EXPR is a typecast.  */
1997       if ((TREE_CODE (def_rhs) == NOP_EXPR
1998            || TREE_CODE (def_rhs) == CONVERT_EXPR)
1999           && TREE_CODE (TREE_OPERAND (def_rhs, 0)) == SSA_NAME)
2000         {
2001           tree def_rhs_inner = TREE_OPERAND (def_rhs, 0);
2002           tree def_rhs_inner_type = TREE_TYPE (def_rhs_inner);
2003           tree new;
2004
2005           if (TYPE_PRECISION (def_rhs_inner_type)
2006               > TYPE_PRECISION (TREE_TYPE (def_rhs)))
2007             return NULL;
2008
2009           /* What we want to prove is that if we convert OP1 to
2010              the type of the object inside the NOP_EXPR that the
2011              result is still equivalent to SRC. 
2012
2013              If that is true, the build and return new equivalent
2014              condition which uses the source of the typecast and the
2015              new constant (which has only changed its type).  */
2016           new = build1 (TREE_CODE (def_rhs), def_rhs_inner_type, op1);
2017           new = local_fold (new);
2018           if (is_gimple_val (new) && tree_int_cst_equal (new, op1))
2019             return build (TREE_CODE (cond), TREE_TYPE (cond),
2020                           def_rhs_inner, new);
2021         }
2022     }
2023   return NULL;
2024 }
2025
2026 /* STMT is a COND_EXPR for which we could not trivially determine its
2027    result.  This routine attempts to find equivalent forms of the
2028    condition which we may be able to optimize better.  It also 
2029    uses simple value range propagation to optimize conditionals.  */
2030
2031 static tree
2032 simplify_cond_and_lookup_avail_expr (tree stmt,
2033                                      stmt_ann_t ann,
2034                                      int insert)
2035 {
2036   tree cond = COND_EXPR_COND (stmt);
2037
2038   if (COMPARISON_CLASS_P (cond))
2039     {
2040       tree op0 = TREE_OPERAND (cond, 0);
2041       tree op1 = TREE_OPERAND (cond, 1);
2042
2043       if (TREE_CODE (op0) == SSA_NAME && is_gimple_min_invariant (op1))
2044         {
2045           int limit;
2046           tree low, high, cond_low, cond_high;
2047           int lowequal, highequal, swapped, no_overlap, subset, cond_inverted;
2048           varray_type vrp_records;
2049           struct vrp_element *element;
2050           struct vrp_hash_elt vrp_hash_elt, *vrp_hash_elt_p;
2051           void **slot;
2052
2053           /* First see if we have test of an SSA_NAME against a constant
2054              where the SSA_NAME is defined by an earlier typecast which
2055              is irrelevant when performing tests against the given
2056              constant.  */
2057           if (TREE_CODE (cond) == EQ_EXPR || TREE_CODE (cond) == NE_EXPR)
2058             {
2059               tree new_cond = find_equivalent_equality_comparison (cond);
2060
2061               if (new_cond)
2062                 {
2063                   /* Update the statement to use the new equivalent
2064                      condition.  */
2065                   COND_EXPR_COND (stmt) = new_cond;
2066
2067                   /* If this is not a real stmt, ann will be NULL and we
2068                      avoid processing the operands.  */
2069                   if (ann)
2070                     mark_stmt_modified (stmt);
2071
2072                   /* Lookup the condition and return its known value if it
2073                      exists.  */
2074                   new_cond = lookup_avail_expr (stmt, insert);
2075                   if (new_cond)
2076                     return new_cond;
2077
2078                   /* The operands have changed, so update op0 and op1.  */
2079                   op0 = TREE_OPERAND (cond, 0);
2080                   op1 = TREE_OPERAND (cond, 1);
2081                 }
2082             }
2083
2084           /* Consult the value range records for this variable (if they exist)
2085              to see if we can eliminate or simplify this conditional. 
2086
2087              Note two tests are necessary to determine no records exist.
2088              First we have to see if the virtual array exists, if it 
2089              exists, then we have to check its active size. 
2090
2091              Also note the vast majority of conditionals are not testing
2092              a variable which has had its range constrained by an earlier
2093              conditional.  So this filter avoids a lot of unnecessary work.  */
2094           vrp_hash_elt.var = op0;
2095           vrp_hash_elt.records = NULL;
2096           slot = htab_find_slot (vrp_data, &vrp_hash_elt, NO_INSERT);
2097           if (slot == NULL)
2098             return NULL;
2099
2100           vrp_hash_elt_p = (struct vrp_hash_elt *) *slot;
2101           vrp_records = vrp_hash_elt_p->records;
2102           if (vrp_records == NULL)
2103             return NULL;
2104
2105           limit = VARRAY_ACTIVE_SIZE (vrp_records);
2106
2107           /* If we have no value range records for this variable, or we are
2108              unable to extract a range for this condition, then there is
2109              nothing to do.  */
2110           if (limit == 0
2111               || ! extract_range_from_cond (cond, &cond_high,
2112                                             &cond_low, &cond_inverted))
2113             return NULL;
2114
2115           /* We really want to avoid unnecessary computations of range
2116              info.  So all ranges are computed lazily; this avoids a
2117              lot of unnecessary work.  i.e., we record the conditional,
2118              but do not process how it constrains the variable's 
2119              potential values until we know that processing the condition
2120              could be helpful.
2121
2122              However, we do not want to have to walk a potentially long
2123              list of ranges, nor do we want to compute a variable's
2124              range more than once for a given path.
2125
2126              Luckily, each time we encounter a conditional that can not
2127              be otherwise optimized we will end up here and we will
2128              compute the necessary range information for the variable
2129              used in this condition.
2130
2131              Thus you can conclude that there will never be more than one
2132              conditional associated with a variable which has not been
2133              processed.  So we never need to merge more than one new
2134              conditional into the current range. 
2135
2136              These properties also help us avoid unnecessary work.  */
2137            element
2138              = (struct vrp_element *)VARRAY_GENERIC_PTR (vrp_records, limit - 1);
2139
2140           if (element->high && element->low)
2141             {
2142               /* The last element has been processed, so there is no range
2143                  merging to do, we can simply use the high/low values
2144                  recorded in the last element.  */
2145               low = element->low;
2146               high = element->high;
2147             }
2148           else
2149             {
2150               tree tmp_high, tmp_low;
2151               int dummy;
2152
2153               /* The last element has not been processed.  Process it now.
2154                  record_range should ensure for cond inverted is not set.
2155                  This call can only fail if cond is x < min or x > max,
2156                  which fold should have optimized into false.
2157                  If that doesn't happen, just pretend all values are
2158                  in the range.  */
2159               if (! extract_range_from_cond (element->cond, &tmp_high,
2160                                              &tmp_low, &dummy))
2161                 gcc_unreachable ();
2162               else
2163                 gcc_assert (dummy == 0);
2164
2165               /* If this is the only element, then no merging is necessary, 
2166                  the high/low values from extract_range_from_cond are all
2167                  we need.  */
2168               if (limit == 1)
2169                 {
2170                   low = tmp_low;
2171                   high = tmp_high;
2172                 }
2173               else
2174                 {
2175                   /* Get the high/low value from the previous element.  */
2176                   struct vrp_element *prev
2177                     = (struct vrp_element *)VARRAY_GENERIC_PTR (vrp_records,
2178                                                                 limit - 2);
2179                   low = prev->low;
2180                   high = prev->high;
2181
2182                   /* Merge in this element's range with the range from the
2183                      previous element.
2184
2185                      The low value for the merged range is the maximum of
2186                      the previous low value and the low value of this record.
2187
2188                      Similarly the high value for the merged range is the
2189                      minimum of the previous high value and the high value of
2190                      this record.  */
2191                   low = (low && tree_int_cst_compare (low, tmp_low) == 1
2192                          ? low : tmp_low);
2193                   high = (high && tree_int_cst_compare (high, tmp_high) == -1
2194                           ? high : tmp_high);
2195                 }
2196
2197               /* And record the computed range.  */
2198               element->low = low;
2199               element->high = high;
2200
2201             }
2202
2203           /* After we have constrained this variable's potential values,
2204              we try to determine the result of the given conditional.
2205
2206              To simplify later tests, first determine if the current
2207              low value is the same low value as the conditional.
2208              Similarly for the current high value and the high value
2209              for the conditional.  */
2210           lowequal = tree_int_cst_equal (low, cond_low);
2211           highequal = tree_int_cst_equal (high, cond_high);
2212
2213           if (lowequal && highequal)
2214             return (cond_inverted ? boolean_false_node : boolean_true_node);
2215
2216           /* To simplify the overlap/subset tests below we may want
2217              to swap the two ranges so that the larger of the two
2218              ranges occurs "first".  */
2219           swapped = 0;
2220           if (tree_int_cst_compare (low, cond_low) == 1
2221               || (lowequal 
2222                   && tree_int_cst_compare (cond_high, high) == 1))
2223             {
2224               tree temp;
2225
2226               swapped = 1;
2227               temp = low;
2228               low = cond_low;
2229               cond_low = temp;
2230               temp = high;
2231               high = cond_high;
2232               cond_high = temp;
2233             }
2234
2235           /* Now determine if there is no overlap in the ranges
2236              or if the second range is a subset of the first range.  */
2237           no_overlap = tree_int_cst_lt (high, cond_low);
2238           subset = tree_int_cst_compare (cond_high, high) != 1;
2239
2240           /* If there was no overlap in the ranges, then this conditional
2241              always has a false value (unless we had to invert this
2242              conditional, in which case it always has a true value).  */
2243           if (no_overlap)
2244             return (cond_inverted ? boolean_true_node : boolean_false_node);
2245
2246           /* If the current range is a subset of the condition's range,
2247              then this conditional always has a true value (unless we
2248              had to invert this conditional, in which case it always
2249              has a true value).  */
2250           if (subset && swapped)
2251             return (cond_inverted ? boolean_false_node : boolean_true_node);
2252
2253           /* We were unable to determine the result of the conditional.
2254              However, we may be able to simplify the conditional.  First
2255              merge the ranges in the same manner as range merging above.  */
2256           low = tree_int_cst_compare (low, cond_low) == 1 ? low : cond_low;
2257           high = tree_int_cst_compare (high, cond_high) == -1 ? high : cond_high;
2258           
2259           /* If the range has converged to a single point, then turn this
2260              into an equality comparison.  */
2261           if (TREE_CODE (cond) != EQ_EXPR
2262               && TREE_CODE (cond) != NE_EXPR
2263               && tree_int_cst_equal (low, high))
2264             {
2265               TREE_SET_CODE (cond, EQ_EXPR);
2266               TREE_OPERAND (cond, 1) = high;
2267             }
2268         }
2269     }
2270   return 0;
2271 }
2272
2273 /* STMT is a SWITCH_EXPR for which we could not trivially determine its
2274    result.  This routine attempts to find equivalent forms of the
2275    condition which we may be able to optimize better.  */
2276
2277 static tree
2278 simplify_switch_and_lookup_avail_expr (tree stmt, int insert)
2279 {
2280   tree cond = SWITCH_COND (stmt);
2281   tree def, to, ti;
2282
2283   /* The optimization that we really care about is removing unnecessary
2284      casts.  That will let us do much better in propagating the inferred
2285      constant at the switch target.  */
2286   if (TREE_CODE (cond) == SSA_NAME)
2287     {
2288       def = SSA_NAME_DEF_STMT (cond);
2289       if (TREE_CODE (def) == MODIFY_EXPR)
2290         {
2291           def = TREE_OPERAND (def, 1);
2292           if (TREE_CODE (def) == NOP_EXPR)
2293             {
2294               int need_precision;
2295               bool fail;
2296
2297               def = TREE_OPERAND (def, 0);
2298
2299 #ifdef ENABLE_CHECKING
2300               /* ??? Why was Jeff testing this?  We are gimple...  */
2301               gcc_assert (is_gimple_val (def));
2302 #endif
2303
2304               to = TREE_TYPE (cond);
2305               ti = TREE_TYPE (def);
2306
2307               /* If we have an extension that preserves value, then we
2308                  can copy the source value into the switch.  */
2309
2310               need_precision = TYPE_PRECISION (ti);
2311               fail = false;
2312               if (TYPE_UNSIGNED (to) && !TYPE_UNSIGNED (ti))
2313                 fail = true;
2314               else if (!TYPE_UNSIGNED (to) && TYPE_UNSIGNED (ti))
2315                 need_precision += 1;
2316               if (TYPE_PRECISION (to) < need_precision)
2317                 fail = true;
2318
2319               if (!fail)
2320                 {
2321                   SWITCH_COND (stmt) = def;
2322                   mark_stmt_modified (stmt);
2323
2324                   return lookup_avail_expr (stmt, insert);
2325                 }
2326             }
2327         }
2328     }
2329
2330   return 0;
2331 }
2332
2333
2334 /* CONST_AND_COPIES is a table which maps an SSA_NAME to the current
2335    known value for that SSA_NAME (or NULL if no value is known).  
2336
2337    NONZERO_VARS is the set SSA_NAMES known to have a nonzero value,
2338    even if we don't know their precise value.
2339
2340    Propagate values from CONST_AND_COPIES and NONZERO_VARS into the PHI
2341    nodes of the successors of BB.  */
2342
2343 static void
2344 cprop_into_successor_phis (basic_block bb, bitmap nonzero_vars)
2345 {
2346   edge e;
2347   edge_iterator ei;
2348
2349   FOR_EACH_EDGE (e, ei, bb->succs)
2350     {
2351       tree phi;
2352       int indx;
2353
2354       /* If this is an abnormal edge, then we do not want to copy propagate
2355          into the PHI alternative associated with this edge.  */
2356       if (e->flags & EDGE_ABNORMAL)
2357         continue;
2358
2359       phi = phi_nodes (e->dest);
2360       if (! phi)
2361         continue;
2362
2363       indx = e->dest_idx;
2364       for ( ; phi; phi = PHI_CHAIN (phi))
2365         {
2366           tree new;
2367           use_operand_p orig_p;
2368           tree orig;
2369
2370           /* The alternative may be associated with a constant, so verify
2371              it is an SSA_NAME before doing anything with it.  */
2372           orig_p = PHI_ARG_DEF_PTR (phi, indx);
2373           orig = USE_FROM_PTR (orig_p);
2374           if (TREE_CODE (orig) != SSA_NAME)
2375             continue;
2376
2377           /* If the alternative is known to have a nonzero value, record
2378              that fact in the PHI node itself for future use.  */
2379           if (bitmap_bit_p (nonzero_vars, SSA_NAME_VERSION (orig)))
2380             PHI_ARG_NONZERO (phi, indx) = true;
2381
2382           /* If we have *ORIG_P in our constant/copy table, then replace
2383              ORIG_P with its value in our constant/copy table.  */
2384           new = SSA_NAME_VALUE (orig);
2385           if (new
2386               && new != orig
2387               && (TREE_CODE (new) == SSA_NAME
2388                   || is_gimple_min_invariant (new))
2389               && may_propagate_copy (orig, new))
2390             propagate_value (orig_p, new);
2391         }
2392     }
2393 }
2394
2395 /* We have finished optimizing BB, record any information implied by
2396    taking a specific outgoing edge from BB.  */
2397
2398 static void
2399 record_edge_info (basic_block bb)
2400 {
2401   block_stmt_iterator bsi = bsi_last (bb);
2402   struct edge_info *edge_info;
2403
2404   if (! bsi_end_p (bsi))
2405     {
2406       tree stmt = bsi_stmt (bsi);
2407
2408       if (stmt && TREE_CODE (stmt) == SWITCH_EXPR)
2409         {
2410           tree cond = SWITCH_COND (stmt);
2411
2412           if (TREE_CODE (cond) == SSA_NAME)
2413             {
2414               tree labels = SWITCH_LABELS (stmt);
2415               int i, n_labels = TREE_VEC_LENGTH (labels);
2416               tree *info = xcalloc (n_basic_blocks, sizeof (tree));
2417               edge e;
2418               edge_iterator ei;
2419
2420               for (i = 0; i < n_labels; i++)
2421                 {
2422                   tree label = TREE_VEC_ELT (labels, i);
2423                   basic_block target_bb = label_to_block (CASE_LABEL (label));
2424
2425                   if (CASE_HIGH (label)
2426                       || !CASE_LOW (label)
2427                       || info[target_bb->index])
2428                     info[target_bb->index] = error_mark_node;
2429                   else
2430                     info[target_bb->index] = label;
2431                 }
2432
2433               FOR_EACH_EDGE (e, ei, bb->succs)
2434                 {
2435                   basic_block target_bb = e->dest;
2436                   tree node = info[target_bb->index];
2437
2438                   if (node != NULL && node != error_mark_node)
2439                     {
2440                       tree x = fold_convert (TREE_TYPE (cond), CASE_LOW (node));
2441                       edge_info = allocate_edge_info (e);
2442                       edge_info->lhs = cond;
2443                       edge_info->rhs = x;
2444                     }
2445                 }
2446               free (info);
2447             }
2448         }
2449
2450       /* A COND_EXPR may create equivalences too.  */
2451       if (stmt && TREE_CODE (stmt) == COND_EXPR)
2452         {
2453           tree cond = COND_EXPR_COND (stmt);
2454           edge true_edge;
2455           edge false_edge;
2456
2457           extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
2458
2459           /* If the conditional is a single variable 'X', record 'X = 1'
2460              for the true edge and 'X = 0' on the false edge.  */
2461           if (SSA_VAR_P (cond))
2462             {
2463               struct edge_info *edge_info;
2464
2465               edge_info = allocate_edge_info (true_edge);
2466               edge_info->lhs = cond;
2467               edge_info->rhs = constant_boolean_node (1, TREE_TYPE (cond));
2468
2469               edge_info = allocate_edge_info (false_edge);
2470               edge_info->lhs = cond;
2471               edge_info->rhs = constant_boolean_node (0, TREE_TYPE (cond));
2472             }
2473           /* Equality tests may create one or two equivalences.  */
2474           else if (COMPARISON_CLASS_P (cond))
2475             {
2476               tree op0 = TREE_OPERAND (cond, 0);
2477               tree op1 = TREE_OPERAND (cond, 1);
2478
2479               /* Special case comparing booleans against a constant as we
2480                  know the value of OP0 on both arms of the branch.  i.e., we
2481                  can record an equivalence for OP0 rather than COND.  */
2482               if ((TREE_CODE (cond) == EQ_EXPR || TREE_CODE (cond) == NE_EXPR)
2483                   && TREE_CODE (op0) == SSA_NAME
2484                   && TREE_CODE (TREE_TYPE (op0)) == BOOLEAN_TYPE
2485                   && is_gimple_min_invariant (op1))
2486                 {
2487                   if (TREE_CODE (cond) == EQ_EXPR)
2488                     {
2489                       edge_info = allocate_edge_info (true_edge);
2490                       edge_info->lhs = op0;
2491                       edge_info->rhs = (integer_zerop (op1)
2492                                             ? boolean_false_node
2493                                             : boolean_true_node);
2494
2495                       edge_info = allocate_edge_info (false_edge);
2496                       edge_info->lhs = op0;
2497                       edge_info->rhs = (integer_zerop (op1)
2498                                             ? boolean_true_node
2499                                             : boolean_false_node);
2500                     }
2501                   else
2502                     {
2503                       edge_info = allocate_edge_info (true_edge);
2504                       edge_info->lhs = op0;
2505                       edge_info->rhs = (integer_zerop (op1)
2506                                             ? boolean_true_node
2507                                             : boolean_false_node);
2508
2509                       edge_info = allocate_edge_info (false_edge);
2510                       edge_info->lhs = op0;
2511                       edge_info->rhs = (integer_zerop (op1)
2512                                             ? boolean_false_node
2513                                             : boolean_true_node);
2514                     }
2515                 }
2516
2517               else if (is_gimple_min_invariant (op0)
2518                        && (TREE_CODE (op1) == SSA_NAME
2519                            || is_gimple_min_invariant (op1)))
2520                 {
2521                   tree inverted = invert_truthvalue (cond);
2522                   struct edge_info *edge_info;
2523
2524                   edge_info = allocate_edge_info (true_edge);
2525                   record_conditions (edge_info, cond, inverted);
2526
2527                   if (TREE_CODE (cond) == EQ_EXPR)
2528                     {
2529                       edge_info->lhs = op1;
2530                       edge_info->rhs = op0;
2531                     }
2532
2533                   edge_info = allocate_edge_info (false_edge);
2534                   record_conditions (edge_info, inverted, cond);
2535
2536                   if (TREE_CODE (cond) == NE_EXPR)
2537                     {
2538                       edge_info->lhs = op1;
2539                       edge_info->rhs = op0;
2540                     }
2541                 }
2542
2543               else if (TREE_CODE (op0) == SSA_NAME
2544                        && (is_gimple_min_invariant (op1)
2545                            || TREE_CODE (op1) == SSA_NAME))
2546                 {
2547                   tree inverted = invert_truthvalue (cond);
2548                   struct edge_info *edge_info;
2549
2550                   edge_info = allocate_edge_info (true_edge);
2551                   record_conditions (edge_info, cond, inverted);
2552
2553                   if (TREE_CODE (cond) == EQ_EXPR)
2554                     {
2555                       edge_info->lhs = op0;
2556                       edge_info->rhs = op1;
2557                     }
2558
2559                   edge_info = allocate_edge_info (false_edge);
2560                   record_conditions (edge_info, inverted, cond);
2561
2562                   if (TREE_CODE (cond) == NE_EXPR)
2563                     {
2564                       edge_info->lhs = op0;
2565                       edge_info->rhs = op1;
2566                     }
2567                 }
2568             }
2569
2570           /* ??? TRUTH_NOT_EXPR can create an equivalence too.  */
2571         }
2572     }
2573 }
2574
2575 /* Propagate information from BB to its outgoing edges.
2576
2577    This can include equivalency information implied by control statements
2578    at the end of BB and const/copy propagation into PHIs in BB's
2579    successor blocks.  */
2580
2581 static void
2582 propagate_to_outgoing_edges (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED,
2583                              basic_block bb)
2584 {
2585   record_edge_info (bb);
2586   cprop_into_successor_phis (bb, nonzero_vars);
2587 }
2588
2589 /* Search for redundant computations in STMT.  If any are found, then
2590    replace them with the variable holding the result of the computation.
2591
2592    If safe, record this expression into the available expression hash
2593    table.  */
2594
2595 static bool
2596 eliminate_redundant_computations (struct dom_walk_data *walk_data,
2597                                   tree stmt, stmt_ann_t ann)
2598 {
2599   tree *expr_p, def = NULL_TREE;
2600   bool insert = true;
2601   tree cached_lhs;
2602   bool retval = false;
2603
2604   if (TREE_CODE (stmt) == MODIFY_EXPR)
2605     def = TREE_OPERAND (stmt, 0);
2606
2607   /* Certain expressions on the RHS can be optimized away, but can not
2608      themselves be entered into the hash tables.  */
2609   if (ann->makes_aliased_stores
2610       || ! def
2611       || TREE_CODE (def) != SSA_NAME
2612       || SSA_NAME_OCCURS_IN_ABNORMAL_PHI (def)
2613       || !ZERO_SSA_OPERANDS (stmt, SSA_OP_VMAYDEF)
2614       /* Do not record equivalences for increments of ivs.  This would create
2615          overlapping live ranges for a very questionable gain.  */
2616       || simple_iv_increment_p (stmt))
2617     insert = false;
2618
2619   /* Check if the expression has been computed before.  */
2620   cached_lhs = lookup_avail_expr (stmt, insert);
2621
2622   /* If this is an assignment and the RHS was not in the hash table,
2623      then try to simplify the RHS and lookup the new RHS in the
2624      hash table.  */
2625   if (! cached_lhs && TREE_CODE (stmt) == MODIFY_EXPR)
2626     cached_lhs = simplify_rhs_and_lookup_avail_expr (walk_data, stmt, insert);
2627   /* Similarly if this is a COND_EXPR and we did not find its
2628      expression in the hash table, simplify the condition and
2629      try again.  */
2630   else if (! cached_lhs && TREE_CODE (stmt) == COND_EXPR)
2631     cached_lhs = simplify_cond_and_lookup_avail_expr (stmt, ann, insert);
2632   /* Similarly for a SWITCH_EXPR.  */
2633   else if (!cached_lhs && TREE_CODE (stmt) == SWITCH_EXPR)
2634     cached_lhs = simplify_switch_and_lookup_avail_expr (stmt, insert);
2635
2636   opt_stats.num_exprs_considered++;
2637
2638   /* Get a pointer to the expression we are trying to optimize.  */
2639   if (TREE_CODE (stmt) == COND_EXPR)
2640     expr_p = &COND_EXPR_COND (stmt);
2641   else if (TREE_CODE (stmt) == SWITCH_EXPR)
2642     expr_p = &SWITCH_COND (stmt);
2643   else if (TREE_CODE (stmt) == RETURN_EXPR && TREE_OPERAND (stmt, 0))
2644     expr_p = &TREE_OPERAND (TREE_OPERAND (stmt, 0), 1);
2645   else
2646     expr_p = &TREE_OPERAND (stmt, 1);
2647
2648   /* It is safe to ignore types here since we have already done
2649      type checking in the hashing and equality routines.  In fact
2650      type checking here merely gets in the way of constant
2651      propagation.  Also, make sure that it is safe to propagate
2652      CACHED_LHS into *EXPR_P.  */
2653   if (cached_lhs
2654       && (TREE_CODE (cached_lhs) != SSA_NAME
2655           || may_propagate_copy (*expr_p, cached_lhs)))
2656     {
2657       if (dump_file && (dump_flags & TDF_DETAILS))
2658         {
2659           fprintf (dump_file, "  Replaced redundant expr '");
2660           print_generic_expr (dump_file, *expr_p, dump_flags);
2661           fprintf (dump_file, "' with '");
2662           print_generic_expr (dump_file, cached_lhs, dump_flags);
2663            fprintf (dump_file, "'\n");
2664         }
2665
2666       opt_stats.num_re++;
2667
2668 #if defined ENABLE_CHECKING
2669       gcc_assert (TREE_CODE (cached_lhs) == SSA_NAME
2670                   || is_gimple_min_invariant (cached_lhs));
2671 #endif
2672
2673       if (TREE_CODE (cached_lhs) == ADDR_EXPR
2674           || (POINTER_TYPE_P (TREE_TYPE (*expr_p))
2675               && is_gimple_min_invariant (cached_lhs)))
2676         retval = true;
2677
2678       propagate_tree_value (expr_p, cached_lhs);
2679       mark_stmt_modified (stmt);
2680     }
2681   return retval;
2682 }
2683
2684 /* STMT, a MODIFY_EXPR, may create certain equivalences, in either
2685    the available expressions table or the const_and_copies table.
2686    Detect and record those equivalences.  */
2687
2688 static void
2689 record_equivalences_from_stmt (tree stmt,
2690                                int may_optimize_p,
2691                                stmt_ann_t ann)
2692 {
2693   tree lhs = TREE_OPERAND (stmt, 0);
2694   enum tree_code lhs_code = TREE_CODE (lhs);
2695   int i;
2696
2697   if (lhs_code == SSA_NAME)
2698     {
2699       tree rhs = TREE_OPERAND (stmt, 1);
2700
2701       /* Strip away any useless type conversions.  */
2702       STRIP_USELESS_TYPE_CONVERSION (rhs);
2703
2704       /* If the RHS of the assignment is a constant or another variable that
2705          may be propagated, register it in the CONST_AND_COPIES table.  We
2706          do not need to record unwind data for this, since this is a true
2707          assignment and not an equivalence inferred from a comparison.  All
2708          uses of this ssa name are dominated by this assignment, so unwinding
2709          just costs time and space.  */
2710       if (may_optimize_p
2711           && (TREE_CODE (rhs) == SSA_NAME
2712               || is_gimple_min_invariant (rhs)))
2713         SSA_NAME_VALUE (lhs) = rhs;
2714
2715       if (expr_computes_nonzero (rhs))
2716         record_var_is_nonzero (lhs);
2717     }
2718
2719   /* Look at both sides for pointer dereferences.  If we find one, then
2720      the pointer must be nonnull and we can enter that equivalence into
2721      the hash tables.  */
2722   if (flag_delete_null_pointer_checks)
2723     for (i = 0; i < 2; i++)
2724       {
2725         tree t = TREE_OPERAND (stmt, i);
2726
2727         /* Strip away any COMPONENT_REFs.  */
2728         while (TREE_CODE (t) == COMPONENT_REF)
2729           t = TREE_OPERAND (t, 0);
2730
2731         /* Now see if this is a pointer dereference.  */
2732         if (INDIRECT_REF_P (t))
2733           {
2734             tree op = TREE_OPERAND (t, 0);
2735
2736             /* If the pointer is a SSA variable, then enter new
2737                equivalences into the hash table.  */
2738             while (TREE_CODE (op) == SSA_NAME)
2739               {
2740                 tree def = SSA_NAME_DEF_STMT (op);
2741
2742                 record_var_is_nonzero (op);
2743
2744                 /* And walk up the USE-DEF chains noting other SSA_NAMEs
2745                    which are known to have a nonzero value.  */
2746                 if (def
2747                     && TREE_CODE (def) == MODIFY_EXPR
2748                     && TREE_CODE (TREE_OPERAND (def, 1)) == NOP_EXPR)
2749                   op = TREE_OPERAND (TREE_OPERAND (def, 1), 0);
2750                 else
2751                   break;
2752               }
2753           }
2754       }
2755
2756   /* A memory store, even an aliased store, creates a useful
2757      equivalence.  By exchanging the LHS and RHS, creating suitable
2758      vops and recording the result in the available expression table,
2759      we may be able to expose more redundant loads.  */
2760   if (!ann->has_volatile_ops
2761       && (TREE_CODE (TREE_OPERAND (stmt, 1)) == SSA_NAME
2762           || is_gimple_min_invariant (TREE_OPERAND (stmt, 1)))
2763       && !is_gimple_reg (lhs))
2764     {
2765       tree rhs = TREE_OPERAND (stmt, 1);
2766       tree new;
2767
2768       /* FIXME: If the LHS of the assignment is a bitfield and the RHS
2769          is a constant, we need to adjust the constant to fit into the
2770          type of the LHS.  If the LHS is a bitfield and the RHS is not
2771          a constant, then we can not record any equivalences for this
2772          statement since we would need to represent the widening or
2773          narrowing of RHS.  This fixes gcc.c-torture/execute/921016-1.c
2774          and should not be necessary if GCC represented bitfields
2775          properly.  */
2776       if (lhs_code == COMPONENT_REF
2777           && DECL_BIT_FIELD (TREE_OPERAND (lhs, 1)))
2778         {
2779           if (TREE_CONSTANT (rhs))
2780             rhs = widen_bitfield (rhs, TREE_OPERAND (lhs, 1), lhs);
2781           else
2782             rhs = NULL;
2783
2784           /* If the value overflowed, then we can not use this equivalence.  */
2785           if (rhs && ! is_gimple_min_invariant (rhs))
2786             rhs = NULL;
2787         }
2788
2789       if (rhs)
2790         {
2791           /* Build a new statement with the RHS and LHS exchanged.  */
2792           new = build (MODIFY_EXPR, TREE_TYPE (stmt), rhs, lhs);
2793
2794           create_ssa_artficial_load_stmt (new, stmt);
2795
2796           /* Finally enter the statement into the available expression
2797              table.  */
2798           lookup_avail_expr (new, true);
2799         }
2800     }
2801 }
2802
2803 /* Replace *OP_P in STMT with any known equivalent value for *OP_P from
2804    CONST_AND_COPIES.  */
2805
2806 static bool
2807 cprop_operand (tree stmt, use_operand_p op_p)
2808 {
2809   bool may_have_exposed_new_symbols = false;
2810   tree val;
2811   tree op = USE_FROM_PTR (op_p);
2812
2813   /* If the operand has a known constant value or it is known to be a
2814      copy of some other variable, use the value or copy stored in
2815      CONST_AND_COPIES.  */
2816   val = SSA_NAME_VALUE (op);
2817   if (val && val != op && TREE_CODE (val) != VALUE_HANDLE)
2818     {
2819       tree op_type, val_type;
2820
2821       /* Do not change the base variable in the virtual operand
2822          tables.  That would make it impossible to reconstruct
2823          the renamed virtual operand if we later modify this
2824          statement.  Also only allow the new value to be an SSA_NAME
2825          for propagation into virtual operands.  */
2826       if (!is_gimple_reg (op)
2827           && (TREE_CODE (val) != SSA_NAME
2828               || is_gimple_reg (val)
2829               || get_virtual_var (val) != get_virtual_var (op)))
2830         return false;
2831
2832       /* Do not replace hard register operands in asm statements.  */
2833       if (TREE_CODE (stmt) == ASM_EXPR
2834           && !may_propagate_copy_into_asm (op))
2835         return false;
2836
2837       /* Get the toplevel type of each operand.  */
2838       op_type = TREE_TYPE (op);
2839       val_type = TREE_TYPE (val);
2840
2841       /* While both types are pointers, get the type of the object
2842          pointed to.  */
2843       while (POINTER_TYPE_P (op_type) && POINTER_TYPE_P (val_type))
2844         {
2845           op_type = TREE_TYPE (op_type);
2846           val_type = TREE_TYPE (val_type);
2847         }
2848
2849       /* Make sure underlying types match before propagating a constant by
2850          converting the constant to the proper type.  Note that convert may
2851          return a non-gimple expression, in which case we ignore this
2852          propagation opportunity.  */
2853       if (TREE_CODE (val) != SSA_NAME)
2854         {
2855           if (!lang_hooks.types_compatible_p (op_type, val_type))
2856             {
2857               val = fold_convert (TREE_TYPE (op), val);
2858               if (!is_gimple_min_invariant (val))
2859                 return false;
2860             }
2861         }
2862
2863       /* Certain operands are not allowed to be copy propagated due
2864          to their interaction with exception handling and some GCC
2865          extensions.  */
2866       else if (!may_propagate_copy (op, val))
2867         return false;
2868       
2869       /* Do not propagate copies if the propagated value is at a deeper loop
2870          depth than the propagatee.  Otherwise, this may move loop variant
2871          variables outside of their loops and prevent coalescing
2872          opportunities.  If the value was loop invariant, it will be hoisted
2873          by LICM and exposed for copy propagation.  */
2874       if (loop_depth_of_name (val) > loop_depth_of_name (op))
2875         return false;
2876
2877       /* Dump details.  */
2878       if (dump_file && (dump_flags & TDF_DETAILS))
2879         {
2880           fprintf (dump_file, "  Replaced '");
2881           print_generic_expr (dump_file, op, dump_flags);
2882           fprintf (dump_file, "' with %s '",
2883                    (TREE_CODE (val) != SSA_NAME ? "constant" : "variable"));
2884           print_generic_expr (dump_file, val, dump_flags);
2885           fprintf (dump_file, "'\n");
2886         }
2887
2888       /* If VAL is an ADDR_EXPR or a constant of pointer type, note
2889          that we may have exposed a new symbol for SSA renaming.  */
2890       if (TREE_CODE (val) == ADDR_EXPR
2891           || (POINTER_TYPE_P (TREE_TYPE (op))
2892               && is_gimple_min_invariant (val)))
2893         may_have_exposed_new_symbols = true;
2894
2895       if (TREE_CODE (val) != SSA_NAME)
2896         opt_stats.num_const_prop++;
2897       else
2898         opt_stats.num_copy_prop++;
2899
2900       propagate_value (op_p, val);
2901
2902       /* And note that we modified this statement.  This is now
2903          safe, even if we changed virtual operands since we will
2904          rescan the statement and rewrite its operands again.  */
2905       mark_stmt_modified (stmt);
2906     }
2907   return may_have_exposed_new_symbols;
2908 }
2909
2910 /* CONST_AND_COPIES is a table which maps an SSA_NAME to the current
2911    known value for that SSA_NAME (or NULL if no value is known).  
2912
2913    Propagate values from CONST_AND_COPIES into the uses, vuses and
2914    v_may_def_ops of STMT.  */
2915
2916 static bool
2917 cprop_into_stmt (tree stmt)
2918 {
2919   bool may_have_exposed_new_symbols = false;
2920   use_operand_p op_p;
2921   ssa_op_iter iter;
2922   tree rhs;
2923
2924   FOR_EACH_SSA_USE_OPERAND (op_p, stmt, iter, SSA_OP_ALL_USES)
2925     {
2926       if (TREE_CODE (USE_FROM_PTR (op_p)) == SSA_NAME)
2927         may_have_exposed_new_symbols |= cprop_operand (stmt, op_p);
2928     }
2929
2930   if (may_have_exposed_new_symbols)
2931     {
2932       rhs = get_rhs (stmt);
2933       if (rhs && TREE_CODE (rhs) == ADDR_EXPR)
2934         recompute_tree_invarant_for_addr_expr (rhs);
2935     }
2936
2937   return may_have_exposed_new_symbols;
2938 }
2939
2940
2941 /* Optimize the statement pointed by iterator SI.
2942    
2943    We try to perform some simplistic global redundancy elimination and
2944    constant propagation:
2945
2946    1- To detect global redundancy, we keep track of expressions that have
2947       been computed in this block and its dominators.  If we find that the
2948       same expression is computed more than once, we eliminate repeated
2949       computations by using the target of the first one.
2950
2951    2- Constant values and copy assignments.  This is used to do very
2952       simplistic constant and copy propagation.  When a constant or copy
2953       assignment is found, we map the value on the RHS of the assignment to
2954       the variable in the LHS in the CONST_AND_COPIES table.  */
2955
2956 static void
2957 optimize_stmt (struct dom_walk_data *walk_data, basic_block bb,
2958                block_stmt_iterator si)
2959 {
2960   stmt_ann_t ann;
2961   tree stmt;
2962   bool may_optimize_p;
2963   bool may_have_exposed_new_symbols = false;
2964
2965   stmt = bsi_stmt (si);
2966
2967   update_stmt_if_modified (stmt);
2968   ann = stmt_ann (stmt);
2969   opt_stats.num_stmts++;
2970   may_have_exposed_new_symbols = false;
2971
2972   if (dump_file && (dump_flags & TDF_DETAILS))
2973     {
2974       fprintf (dump_file, "Optimizing statement ");
2975       print_generic_stmt (dump_file, stmt, TDF_SLIM);
2976     }
2977
2978   /* Const/copy propagate into USES, VUSES and the RHS of V_MAY_DEFs.  */
2979   may_have_exposed_new_symbols = cprop_into_stmt (stmt);
2980
2981   /* If the statement has been modified with constant replacements,
2982      fold its RHS before checking for redundant computations.  */
2983   if (ann->modified)
2984     {
2985       /* Try to fold the statement making sure that STMT is kept
2986          up to date.  */
2987       if (fold_stmt (bsi_stmt_ptr (si)))
2988         {
2989           stmt = bsi_stmt (si);
2990           ann = stmt_ann (stmt);
2991
2992           if (dump_file && (dump_flags & TDF_DETAILS))
2993             {
2994               fprintf (dump_file, "  Folded to: ");
2995               print_generic_stmt (dump_file, stmt, TDF_SLIM);
2996             }
2997         }
2998
2999       /* Constant/copy propagation above may change the set of 
3000          virtual operands associated with this statement.  Folding
3001          may remove the need for some virtual operands.
3002
3003          Indicate we will need to rescan and rewrite the statement.  */
3004       may_have_exposed_new_symbols = true;
3005     }
3006
3007   /* Check for redundant computations.  Do this optimization only
3008      for assignments that have no volatile ops and conditionals.  */
3009   may_optimize_p = (!ann->has_volatile_ops
3010                     && ((TREE_CODE (stmt) == RETURN_EXPR
3011                          && TREE_OPERAND (stmt, 0)
3012                          && TREE_CODE (TREE_OPERAND (stmt, 0)) == MODIFY_EXPR
3013                          && ! (TREE_SIDE_EFFECTS
3014                                (TREE_OPERAND (TREE_OPERAND (stmt, 0), 1))))
3015                         || (TREE_CODE (stmt) == MODIFY_EXPR
3016                             && ! TREE_SIDE_EFFECTS (TREE_OPERAND (stmt, 1)))
3017                         || TREE_CODE (stmt) == COND_EXPR
3018                         || TREE_CODE (stmt) == SWITCH_EXPR));
3019
3020   if (may_optimize_p)
3021     may_have_exposed_new_symbols
3022       |= eliminate_redundant_computations (walk_data, stmt, ann);
3023
3024   /* Record any additional equivalences created by this statement.  */
3025   if (TREE_CODE (stmt) == MODIFY_EXPR)
3026     record_equivalences_from_stmt (stmt,
3027                                    may_optimize_p,
3028                                    ann);
3029
3030   /* If STMT is a COND_EXPR and it was modified, then we may know
3031      where it goes.  If that is the case, then mark the CFG as altered.
3032
3033      This will cause us to later call remove_unreachable_blocks and
3034      cleanup_tree_cfg when it is safe to do so.  It is not safe to 
3035      clean things up here since removal of edges and such can trigger
3036      the removal of PHI nodes, which in turn can release SSA_NAMEs to
3037      the manager.
3038
3039      That's all fine and good, except that once SSA_NAMEs are released
3040      to the manager, we must not call create_ssa_name until all references
3041      to released SSA_NAMEs have been eliminated.
3042
3043      All references to the deleted SSA_NAMEs can not be eliminated until
3044      we remove unreachable blocks.
3045
3046      We can not remove unreachable blocks until after we have completed
3047      any queued jump threading.
3048
3049      We can not complete any queued jump threads until we have taken
3050      appropriate variables out of SSA form.  Taking variables out of
3051      SSA form can call create_ssa_name and thus we lose.
3052
3053      Ultimately I suspect we're going to need to change the interface
3054      into the SSA_NAME manager.  */
3055
3056   if (ann->modified)
3057     {
3058       tree val = NULL;
3059
3060       if (TREE_CODE (stmt) == COND_EXPR)
3061         val = COND_EXPR_COND (stmt);
3062       else if (TREE_CODE (stmt) == SWITCH_EXPR)
3063         val = SWITCH_COND (stmt);
3064
3065       if (val && TREE_CODE (val) == INTEGER_CST && find_taken_edge (bb, val))
3066         cfg_altered = true;
3067
3068       /* If we simplified a statement in such a way as to be shown that it
3069          cannot trap, update the eh information and the cfg to match.  */
3070       if (maybe_clean_eh_stmt (stmt))
3071         {
3072           bitmap_set_bit (need_eh_cleanup, bb->index);
3073           if (dump_file && (dump_flags & TDF_DETAILS))
3074             fprintf (dump_file, "  Flagged to clear EH edges.\n");
3075         }
3076     }
3077
3078   if (may_have_exposed_new_symbols)
3079     VEC_safe_push (tree, heap, stmts_to_rescan, bsi_stmt (si));
3080 }
3081
3082 /* Replace the RHS of STMT with NEW_RHS.  If RHS can be found in the
3083    available expression hashtable, then return the LHS from the hash
3084    table.
3085
3086    If INSERT is true, then we also update the available expression
3087    hash table to account for the changes made to STMT.  */
3088
3089 static tree
3090 update_rhs_and_lookup_avail_expr (tree stmt, tree new_rhs, bool insert)
3091 {
3092   tree cached_lhs = NULL;
3093
3094   /* Remove the old entry from the hash table.  */
3095   if (insert)
3096     {
3097       struct expr_hash_elt element;
3098
3099       initialize_hash_element (stmt, NULL, &element);
3100       htab_remove_elt_with_hash (avail_exprs, &element, element.hash);
3101     }
3102
3103   /* Now update the RHS of the assignment.  */
3104   TREE_OPERAND (stmt, 1) = new_rhs;
3105
3106   /* Now lookup the updated statement in the hash table.  */
3107   cached_lhs = lookup_avail_expr (stmt, insert);
3108
3109   /* We have now called lookup_avail_expr twice with two different
3110      versions of this same statement, once in optimize_stmt, once here.
3111
3112      We know the call in optimize_stmt did not find an existing entry
3113      in the hash table, so a new entry was created.  At the same time
3114      this statement was pushed onto the AVAIL_EXPRS_STACK vector. 
3115
3116      If this call failed to find an existing entry on the hash table,
3117      then the new version of this statement was entered into the
3118      hash table.  And this statement was pushed onto BLOCK_AVAIL_EXPR
3119      for the second time.  So there are two copies on BLOCK_AVAIL_EXPRs
3120
3121      If this call succeeded, we still have one copy of this statement
3122      on the BLOCK_AVAIL_EXPRs vector.
3123
3124      For both cases, we need to pop the most recent entry off the
3125      BLOCK_AVAIL_EXPRs vector.  For the case where we never found this
3126      statement in the hash tables, that will leave precisely one
3127      copy of this statement on BLOCK_AVAIL_EXPRs.  For the case where
3128      we found a copy of this statement in the second hash table lookup
3129      we want _no_ copies of this statement in BLOCK_AVAIL_EXPRs.  */
3130   if (insert)
3131     VEC_pop (tree, avail_exprs_stack);
3132
3133   /* And make sure we record the fact that we modified this
3134      statement.  */
3135   mark_stmt_modified (stmt);
3136
3137   return cached_lhs;
3138 }
3139
3140 /* Search for an existing instance of STMT in the AVAIL_EXPRS table.  If
3141    found, return its LHS. Otherwise insert STMT in the table and return
3142    NULL_TREE.
3143
3144    Also, when an expression is first inserted in the AVAIL_EXPRS table, it
3145    is also added to the stack pointed by BLOCK_AVAIL_EXPRS_P, so that they
3146    can be removed when we finish processing this block and its children.
3147
3148    NOTE: This function assumes that STMT is a MODIFY_EXPR node that
3149    contains no CALL_EXPR on its RHS and makes no volatile nor
3150    aliased references.  */
3151
3152 static tree
3153 lookup_avail_expr (tree stmt, bool insert)
3154 {
3155   void **slot;
3156   tree lhs;
3157   tree temp;
3158   struct expr_hash_elt *element = xmalloc (sizeof (struct expr_hash_elt));
3159
3160   lhs = TREE_CODE (stmt) == MODIFY_EXPR ? TREE_OPERAND (stmt, 0) : NULL;
3161
3162   initialize_hash_element (stmt, lhs, element);
3163
3164   /* Don't bother remembering constant assignments and copy operations.
3165      Constants and copy operations are handled by the constant/copy propagator
3166      in optimize_stmt.  */
3167   if (TREE_CODE (element->rhs) == SSA_NAME
3168       || is_gimple_min_invariant (element->rhs))
3169     {
3170       free (element);
3171       return NULL_TREE;
3172     }
3173
3174   /* If this is an equality test against zero, see if we have recorded a
3175      nonzero value for the variable in question.  */
3176   if ((TREE_CODE (element->rhs) == EQ_EXPR
3177        || TREE_CODE  (element->rhs) == NE_EXPR)
3178       && TREE_CODE (TREE_OPERAND (element->rhs, 0)) == SSA_NAME
3179       && integer_zerop (TREE_OPERAND (element->rhs, 1)))
3180     {
3181       int indx = SSA_NAME_VERSION (TREE_OPERAND (element->rhs, 0));
3182
3183       if (bitmap_bit_p (nonzero_vars, indx))
3184         {
3185           tree t = element->rhs;
3186           free (element);
3187
3188           if (TREE_CODE (t) == EQ_EXPR)
3189             return boolean_false_node;
3190           else
3191             return boolean_true_node;
3192         }
3193     }
3194
3195   /* Finally try to find the expression in the main expression hash table.  */
3196   slot = htab_find_slot_with_hash (avail_exprs, element, element->hash,
3197                                    (insert ? INSERT : NO_INSERT));
3198   if (slot == NULL)
3199     {
3200       free (element);
3201       return NULL_TREE;
3202     }
3203
3204   if (*slot == NULL)
3205     {
3206       *slot = (void *) element;
3207       VEC_safe_push (tree, heap, avail_exprs_stack,
3208                      stmt ? stmt : element->rhs);
3209       return NULL_TREE;
3210     }
3211
3212   /* Extract the LHS of the assignment so that it can be used as the current
3213      definition of another variable.  */
3214   lhs = ((struct expr_hash_elt *)*slot)->lhs;
3215
3216   /* See if the LHS appears in the CONST_AND_COPIES table.  If it does, then
3217      use the value from the const_and_copies table.  */
3218   if (TREE_CODE (lhs) == SSA_NAME)
3219     {
3220       temp = SSA_NAME_VALUE (lhs);
3221       if (temp && TREE_CODE (temp) != VALUE_HANDLE)
3222         lhs = temp;
3223     }
3224
3225   free (element);
3226   return lhs;
3227 }
3228
3229 /* Given a condition COND, record into HI_P, LO_P and INVERTED_P the
3230    range of values that result in the conditional having a true value.
3231
3232    Return true if we are successful in extracting a range from COND and
3233    false if we are unsuccessful.  */
3234
3235 static bool
3236 extract_range_from_cond (tree cond, tree *hi_p, tree *lo_p, int *inverted_p)
3237 {
3238   tree op1 = TREE_OPERAND (cond, 1);
3239   tree high, low, type;
3240   int inverted;
3241
3242   type = TREE_TYPE (op1);
3243
3244   /* Experiments have shown that it's rarely, if ever useful to
3245      record ranges for enumerations.  Presumably this is due to
3246      the fact that they're rarely used directly.  They are typically
3247      cast into an integer type and used that way.  */
3248   if (TREE_CODE (type) != INTEGER_TYPE
3249       /* We don't know how to deal with types with variable bounds.  */
3250       || TREE_CODE (TYPE_MIN_VALUE (type)) != INTEGER_CST
3251       || TREE_CODE (TYPE_MAX_VALUE (type)) != INTEGER_CST)
3252     return 0;
3253
3254   switch (TREE_CODE (cond))
3255     {
3256     case EQ_EXPR:
3257       high = low = op1;
3258       inverted = 0;
3259       break;
3260
3261     case NE_EXPR:
3262       high = low = op1;
3263       inverted = 1;
3264       break;
3265
3266     case GE_EXPR:
3267       low = op1;
3268       high = TYPE_MAX_VALUE (type);
3269       inverted = 0;
3270       break;
3271
3272     case GT_EXPR:
3273       high = TYPE_MAX_VALUE (type);
3274       if (!tree_int_cst_lt (op1, high))
3275         return 0;
3276       low = int_const_binop (PLUS_EXPR, op1, integer_one_node, 1);
3277       inverted = 0;
3278       break;
3279
3280     case LE_EXPR:
3281       high = op1;
3282       low = TYPE_MIN_VALUE (type);
3283       inverted = 0;
3284       break;
3285
3286     case LT_EXPR:
3287       low = TYPE_MIN_VALUE (type);
3288       if (!tree_int_cst_lt (low, op1))
3289         return 0;
3290       high = int_const_binop (MINUS_EXPR, op1, integer_one_node, 1);
3291       inverted = 0;
3292       break;
3293
3294     default:
3295       return 0;
3296     }
3297
3298   *hi_p = high;
3299   *lo_p = low;
3300   *inverted_p = inverted;
3301   return 1;
3302 }
3303
3304 /* Record a range created by COND for basic block BB.  */
3305
3306 static void
3307 record_range (tree cond, basic_block bb)
3308 {
3309   enum tree_code code = TREE_CODE (cond);
3310
3311   /* We explicitly ignore NE_EXPRs and all the unordered comparisons.
3312      They rarely allow for meaningful range optimizations and significantly
3313      complicate the implementation.  */
3314   if ((code == LT_EXPR || code == LE_EXPR || code == GT_EXPR
3315        || code == GE_EXPR || code == EQ_EXPR)
3316       && TREE_CODE (TREE_TYPE (TREE_OPERAND (cond, 1))) == INTEGER_TYPE)
3317     {
3318       struct vrp_hash_elt *vrp_hash_elt;
3319       struct vrp_element *element;
3320       varray_type *vrp_records_p;
3321       void **slot;
3322
3323
3324       vrp_hash_elt = xmalloc (sizeof (struct vrp_hash_elt));
3325       vrp_hash_elt->var = TREE_OPERAND (cond, 0);
3326       vrp_hash_elt->records = NULL;
3327       slot = htab_find_slot (vrp_data, vrp_hash_elt, INSERT);
3328
3329       if (*slot == NULL)
3330         *slot = (void *) vrp_hash_elt;
3331       else
3332         free (vrp_hash_elt);
3333
3334       vrp_hash_elt = (struct vrp_hash_elt *) *slot;
3335       vrp_records_p = &vrp_hash_elt->records;
3336
3337       element = ggc_alloc (sizeof (struct vrp_element));
3338       element->low = NULL;
3339       element->high = NULL;
3340       element->cond = cond;
3341       element->bb = bb;
3342
3343       if (*vrp_records_p == NULL)
3344         VARRAY_GENERIC_PTR_INIT (*vrp_records_p, 2, "vrp records");
3345       
3346       VARRAY_PUSH_GENERIC_PTR (*vrp_records_p, element);
3347       VEC_safe_push (tree, heap, vrp_variables_stack, TREE_OPERAND (cond, 0));
3348     }
3349 }
3350
3351 /* Hashing and equality functions for VRP_DATA.
3352
3353    Since this hash table is addressed by SSA_NAMEs, we can hash on
3354    their version number and equality can be determined with a 
3355    pointer comparison.  */
3356
3357 static hashval_t
3358 vrp_hash (const void *p)
3359 {
3360   tree var = ((struct vrp_hash_elt *)p)->var;
3361
3362   return SSA_NAME_VERSION (var);
3363 }
3364
3365 static int
3366 vrp_eq (const void *p1, const void *p2)
3367 {
3368   tree var1 = ((struct vrp_hash_elt *)p1)->var;
3369   tree var2 = ((struct vrp_hash_elt *)p2)->var;
3370
3371   return var1 == var2;
3372 }
3373
3374 /* Hashing and equality functions for AVAIL_EXPRS.  The table stores
3375    MODIFY_EXPR statements.  We compute a value number for expressions using
3376    the code of the expression and the SSA numbers of its operands.  */
3377
3378 static hashval_t
3379 avail_expr_hash (const void *p)
3380 {
3381   tree stmt = ((struct expr_hash_elt *)p)->stmt;
3382   tree rhs = ((struct expr_hash_elt *)p)->rhs;
3383   tree vuse;
3384   ssa_op_iter iter;
3385   hashval_t val = 0;
3386
3387   /* iterative_hash_expr knows how to deal with any expression and
3388      deals with commutative operators as well, so just use it instead
3389      of duplicating such complexities here.  */
3390   val = iterative_hash_expr (rhs, val);
3391
3392   /* If the hash table entry is not associated with a statement, then we
3393      can just hash the expression and not worry about virtual operands
3394      and such.  */
3395   if (!stmt || !stmt_ann (stmt))
3396     return val;
3397
3398   /* Add the SSA version numbers of every vuse operand.  This is important
3399      because compound variables like arrays are not renamed in the
3400      operands.  Rather, the rename is done on the virtual variable
3401      representing all the elements of the array.  */
3402   FOR_EACH_SSA_TREE_OPERAND (vuse, stmt, iter, SSA_OP_VUSE)
3403     val = iterative_hash_expr (vuse, val);
3404
3405   return val;
3406 }
3407
3408 static hashval_t
3409 real_avail_expr_hash (const void *p)
3410 {
3411   return ((const struct expr_hash_elt *)p)->hash;
3412 }
3413
3414 static int
3415 avail_expr_eq (const void *p1, const void *p2)
3416 {
3417   tree stmt1 = ((struct expr_hash_elt *)p1)->stmt;
3418   tree rhs1 = ((struct expr_hash_elt *)p1)->rhs;
3419   tree stmt2 = ((struct expr_hash_elt *)p2)->stmt;
3420   tree rhs2 = ((struct expr_hash_elt *)p2)->rhs;
3421
3422   /* If they are the same physical expression, return true.  */
3423   if (rhs1 == rhs2 && stmt1 == stmt2)
3424     return true;
3425
3426   /* If their codes are not equal, then quit now.  */
3427   if (TREE_CODE (rhs1) != TREE_CODE (rhs2))
3428     return false;
3429
3430   /* In case of a collision, both RHS have to be identical and have the
3431      same VUSE operands.  */
3432   if ((TREE_TYPE (rhs1) == TREE_TYPE (rhs2)
3433        || lang_hooks.types_compatible_p (TREE_TYPE (rhs1), TREE_TYPE (rhs2)))
3434       && operand_equal_p (rhs1, rhs2, OEP_PURE_SAME))
3435     {
3436       bool ret = compare_ssa_operands_equal (stmt1, stmt2, SSA_OP_VUSE);
3437       gcc_assert (!ret || ((struct expr_hash_elt *)p1)->hash
3438                   == ((struct expr_hash_elt *)p2)->hash);
3439       return ret;
3440     }
3441
3442   return false;
3443 }