OSDN Git Service

PR 22018
[pf3gnuchains/gcc-fork.git] / gcc / tree-vrp.c
1 /* Support routines for Value Range Propagation (VRP).
2    Copyright (C) 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 "ggc.h"
27 #include "flags.h"
28 #include "tree.h"
29 #include "basic-block.h"
30 #include "tree-flow.h"
31 #include "tree-pass.h"
32 #include "tree-dump.h"
33 #include "timevar.h"
34 #include "diagnostic.h"
35 #include "cfgloop.h"
36 #include "tree-scalar-evolution.h"
37 #include "tree-ssa-propagate.h"
38 #include "tree-chrec.h"
39
40 /* Set of SSA names found during the dominator traversal of a
41    sub-graph in find_assert_locations.  */
42 static sbitmap found_in_subgraph;
43
44 /* Loop structure of the program.  Used to analyze scalar evolutions
45    inside adjust_range_with_scev.  */
46 static struct loops *cfg_loops;
47
48 /* Local functions.  */
49 static int compare_values (tree val1, tree val2);
50
51 /* Location information for ASSERT_EXPRs.  Each instance of this
52    structure describes an ASSERT_EXPR for an SSA name.  Since a single
53    SSA name may have more than one assertion associated with it, these
54    locations are kept in a linked list attached to the corresponding
55    SSA name.  */
56 struct assert_locus_d
57 {
58   /* Basic block where the assertion would be inserted.  */
59   basic_block bb;
60
61   /* Some assertions need to be inserted on an edge (e.g., assertions
62      generated by COND_EXPRs).  In those cases, BB will be NULL.  */
63   edge e;
64
65   /* Pointer to the statement that generated this assertion.  */
66   block_stmt_iterator si;
67
68   /* Predicate code for the ASSERT_EXPR.  Must be COMPARISON_CLASS_P.  */
69   enum tree_code comp_code;
70
71   /* Value being compared against.  */
72   tree val;
73
74   /* Next node in the linked list.  */
75   struct assert_locus_d *next;
76 };
77
78 typedef struct assert_locus_d *assert_locus_t;
79
80 /* If bit I is present, it means that SSA name N_i has a list of
81    assertions that should be inserted in the IL.  */
82 static bitmap need_assert_for;
83
84 /* Array of locations lists where to insert assertions.  ASSERTS_FOR[I]
85    holds a list of ASSERT_LOCUS_T nodes that describe where
86    ASSERT_EXPRs for SSA name N_I should be inserted.  */
87 static assert_locus_t *asserts_for;
88
89 /* Set of blocks visited in find_assert_locations.  Used to avoid
90    visiting the same block more than once.  */
91 static sbitmap blocks_visited;
92
93 /* Value range array.  After propagation, VR_VALUE[I] holds the range
94    of values that SSA name N_I may take.  */
95 static value_range_t **vr_value;
96
97 /* Given a comparison code, return its opposite.  Note that this is *not*
98    the same as inverting its truth value (invert_tree_comparison).  Here we
99    just want to literally flip the comparison around.
100    
101    So, '<' gets '>', '<=' gets '>='.  Both '==' and '!=' are returned
102    unchanged.  */
103
104 static enum tree_code
105 opposite_comparison (enum tree_code code)
106 {
107   switch (code)
108     {
109     case EQ_EXPR:
110     case NE_EXPR:
111     case ORDERED_EXPR:
112     case UNORDERED_EXPR:
113     case LTGT_EXPR:
114     case UNEQ_EXPR:
115       return code;
116     case GT_EXPR:
117       return LT_EXPR;
118     case GE_EXPR:
119       return LE_EXPR;
120     case LT_EXPR:
121       return GT_EXPR;
122     case LE_EXPR:
123       return GE_EXPR;
124     case UNGT_EXPR:
125       return UNLT_EXPR;
126     case UNGE_EXPR:
127       return UNLE_EXPR;
128     case UNLT_EXPR:
129       return UNGT_EXPR;
130     case UNLE_EXPR:
131       return UNGE_EXPR;
132     default:
133       gcc_unreachable ();
134     }
135 }
136
137
138 /* Return true if EXPR computes a non-zero value.  */
139
140 bool
141 expr_computes_nonzero (tree expr)
142 {
143   /* Type casts won't change anything, so just strip them.  */
144   STRIP_NOPS (expr);
145
146   /* Calling alloca, guarantees that the value is non-NULL.  */
147   if (alloca_call_p (expr))
148     return true;
149
150   /* The address of a non-weak symbol is never NULL, unless the user
151      has requested not to remove NULL pointer checks.  */
152   if (flag_delete_null_pointer_checks
153       && TREE_CODE (expr) == ADDR_EXPR
154       && DECL_P (TREE_OPERAND (expr, 0))
155       && !DECL_WEAK (TREE_OPERAND (expr, 0)))
156     return true;
157
158   /* IOR of any value with a nonzero value will result in a nonzero
159      value.  */
160   if (TREE_CODE (expr) == BIT_IOR_EXPR
161       && integer_nonzerop (TREE_OPERAND (expr, 1)))
162     return true;
163
164   return false;
165 }
166
167
168 /* Return true if ARG is marked with the nonnull attribute in the
169    current function signature.  */
170
171 static bool
172 nonnull_arg_p (tree arg)
173 {
174   tree t, attrs, fntype;
175   unsigned HOST_WIDE_INT arg_num;
176
177   gcc_assert (TREE_CODE (arg) == PARM_DECL && POINTER_TYPE_P (TREE_TYPE (arg)));
178
179   fntype = TREE_TYPE (current_function_decl);
180   attrs = lookup_attribute ("nonnull", TYPE_ATTRIBUTES (fntype));
181
182   /* If "nonnull" wasn't specified, we know nothing about the argument.  */
183   if (attrs == NULL_TREE)
184     return false;
185
186   /* If "nonnull" applies to all the arguments, then ARG is non-null.  */
187   if (TREE_VALUE (attrs) == NULL_TREE)
188     return true;
189
190   /* Get the position number for ARG in the function signature.  */
191   for (arg_num = 1, t = DECL_ARGUMENTS (current_function_decl);
192        t;
193        t = TREE_CHAIN (t), arg_num++)
194     {
195       if (t == arg)
196         break;
197     }
198
199   gcc_assert (t == arg);
200
201   /* Now see if ARG_NUM is mentioned in the nonnull list.  */
202   for (t = TREE_VALUE (attrs); t; t = TREE_CHAIN (t))
203     {
204       if (compare_tree_int (TREE_VALUE (t), arg_num) == 0)
205         return true;
206     }
207
208   return false;
209 }
210
211
212 /* Set value range VR to {T, MIN, MAX, EQUIV}.  */
213
214 static void
215 set_value_range (value_range_t *vr, enum value_range_type t, tree min,
216                  tree max, bitmap equiv)
217 {
218 #if defined ENABLE_CHECKING
219   /* Check the validity of the range.  */
220   if (t == VR_RANGE || t == VR_ANTI_RANGE)
221     {
222       int cmp;
223
224       gcc_assert (min && max);
225
226       if (INTEGRAL_TYPE_P (TREE_TYPE (min)) && t == VR_ANTI_RANGE)
227         gcc_assert (min != TYPE_MIN_VALUE (TREE_TYPE (min))
228                     || max != TYPE_MAX_VALUE (TREE_TYPE (max)));
229
230       cmp = compare_values (min, max);
231       gcc_assert (cmp == 0 || cmp == -1 || cmp == -2);
232     }
233
234   if (t == VR_UNDEFINED || t == VR_VARYING)
235     gcc_assert (min == NULL_TREE && max == NULL_TREE);
236
237   if (t == VR_UNDEFINED || t == VR_VARYING)
238     gcc_assert (equiv == NULL || bitmap_empty_p (equiv));
239 #endif
240
241   vr->type = t;
242   vr->min = min;
243   vr->max = max;
244
245   /* Since updating the equivalence set involves deep copying the
246      bitmaps, only do it if absolutely necessary.  */
247   if (vr->equiv == NULL)
248     vr->equiv = BITMAP_ALLOC (NULL);
249
250   if (equiv != vr->equiv)
251     {
252       if (equiv && !bitmap_empty_p (equiv))
253         bitmap_copy (vr->equiv, equiv);
254       else
255         bitmap_clear (vr->equiv);
256     }
257 }
258
259
260 /* Copy value range FROM into value range TO.  */
261
262 static inline void
263 copy_value_range (value_range_t *to, value_range_t *from)
264 {
265   set_value_range (to, from->type, from->min, from->max, from->equiv);
266 }
267
268
269 /* Set value range VR to a non-NULL range of type TYPE.  */
270
271 static inline void
272 set_value_range_to_nonnull (value_range_t *vr, tree type)
273 {
274   tree zero = build_int_cst (type, 0);
275   set_value_range (vr, VR_ANTI_RANGE, zero, zero, vr->equiv);
276 }
277
278
279 /* Set value range VR to a NULL range of type TYPE.  */
280
281 static inline void
282 set_value_range_to_null (value_range_t *vr, tree type)
283 {
284   tree zero = build_int_cst (type, 0);
285   set_value_range (vr, VR_RANGE, zero, zero, vr->equiv);
286 }
287
288
289 /* Set value range VR to VR_VARYING.  */
290
291 static inline void
292 set_value_range_to_varying (value_range_t *vr)
293 {
294   vr->type = VR_VARYING;
295   vr->min = vr->max = NULL_TREE;
296   if (vr->equiv)
297     bitmap_clear (vr->equiv);
298 }
299
300
301 /* Set value range VR to VR_UNDEFINED.  */
302
303 static inline void
304 set_value_range_to_undefined (value_range_t *vr)
305 {
306   vr->type = VR_UNDEFINED;
307   vr->min = vr->max = NULL_TREE;
308   if (vr->equiv)
309     bitmap_clear (vr->equiv);
310 }
311
312
313 /* Return value range information for VAR.  Create an empty range
314    if none existed.  */
315
316 static value_range_t *
317 get_value_range (tree var)
318 {
319   value_range_t *vr;
320   tree sym;
321   unsigned ver = SSA_NAME_VERSION (var);
322
323   vr = vr_value[ver];
324   if (vr)
325     return vr;
326
327   /* Create a default value range.  */
328   vr_value[ver] = vr = xmalloc (sizeof (*vr));
329   memset (vr, 0, sizeof (*vr));
330
331   /* Allocate an equivalence set.  */
332   vr->equiv = BITMAP_ALLOC (NULL);
333
334   /* If VAR is a default definition, the variable can take any value
335      in VAR's type.  */
336   sym = SSA_NAME_VAR (var);
337   if (var == var_ann (sym)->default_def)
338     {
339       /* Try to use the "nonnull" attribute to create ~[0, 0]
340          anti-ranges for pointers.  Note that this is only valid with
341          default definitions of PARM_DECLs.  */
342       if (TREE_CODE (sym) == PARM_DECL
343           && POINTER_TYPE_P (TREE_TYPE (sym))
344           && nonnull_arg_p (sym))
345         set_value_range_to_nonnull (vr, TREE_TYPE (sym));
346       else
347         set_value_range_to_varying (vr);
348     }
349
350   return vr;
351 }
352
353
354 /* Update the value range and equivalence set for variable VAR to
355    NEW_VR.  Return true if NEW_VR is different from VAR's previous
356    value.
357
358    NOTE: This function assumes that NEW_VR is a temporary value range
359    object created for the sole purpose of updating VAR's range.  The
360    storage used by the equivalence set from NEW_VR will be freed by
361    this function.  Do not call update_value_range when NEW_VR
362    is the range object associated with another SSA name.  */
363
364 static inline bool
365 update_value_range (tree var, value_range_t *new_vr)
366 {
367   value_range_t *old_vr;
368   bool is_new;
369
370   /* Update the value range, if necessary.  */
371   old_vr = get_value_range (var);
372   is_new = old_vr->type != new_vr->type
373            || old_vr->min != new_vr->min
374            || old_vr->max != new_vr->max
375            || (old_vr->equiv == NULL && new_vr->equiv)
376            || (old_vr->equiv && new_vr->equiv == NULL)
377            || (!bitmap_equal_p (old_vr->equiv, new_vr->equiv));
378
379   if (is_new)
380     set_value_range (old_vr, new_vr->type, new_vr->min, new_vr->max,
381                      new_vr->equiv);
382
383   BITMAP_FREE (new_vr->equiv);
384   new_vr->equiv = NULL;
385
386   return is_new;
387 }
388
389
390 /* Add VAR and VAR's equivalence set to EQUIV.  */
391
392 static void
393 add_equivalence (bitmap equiv, tree var)
394 {
395   unsigned ver = SSA_NAME_VERSION (var);
396   value_range_t *vr = vr_value[ver];
397
398   bitmap_set_bit (equiv, ver);
399   if (vr && vr->equiv)
400     bitmap_ior_into (equiv, vr->equiv);
401 }
402
403
404 /* Return true if VR is ~[0, 0].  */
405
406 static inline bool
407 range_is_nonnull (value_range_t *vr)
408 {
409   return vr->type == VR_ANTI_RANGE
410          && integer_zerop (vr->min)
411          && integer_zerop (vr->max);
412 }
413
414
415 /* Return true if VR is [0, 0].  */
416
417 static inline bool
418 range_is_null (value_range_t *vr)
419 {
420   return vr->type == VR_RANGE
421          && integer_zerop (vr->min)
422          && integer_zerop (vr->max);
423 }
424
425
426 /* Return true if value range VR involves at least one symbol.  */
427
428 static inline bool
429 symbolic_range_p (value_range_t *vr)
430 {
431   return (!is_gimple_min_invariant (vr->min)
432           || !is_gimple_min_invariant (vr->max));
433 }
434
435
436 /* Like expr_computes_nonzero, but this function uses value ranges
437    obtained so far.  */
438
439 static bool
440 vrp_expr_computes_nonzero (tree expr)
441 {
442   if (expr_computes_nonzero (expr))
443     return true;
444
445   /* If we have an expression of the form &X->a, then the expression
446      is nonnull if X is nonnull.  */
447   if (TREE_CODE (expr) == ADDR_EXPR)
448     {
449       tree base = get_base_address (TREE_OPERAND (expr, 0));
450
451       if (base != NULL_TREE
452           && TREE_CODE (base) == INDIRECT_REF
453           && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME)
454         {
455           value_range_t *vr = get_value_range (TREE_OPERAND (base, 0));
456           if (range_is_nonnull (vr))
457             return true;
458         }
459     }
460
461   return false;
462 }
463
464
465 /* Compare two values VAL1 and VAL2.  Return
466    
467         -2 if VAL1 and VAL2 cannot be compared at compile-time,
468         -1 if VAL1 < VAL2,
469          0 if VAL1 == VAL2,
470         +1 if VAL1 > VAL2, and
471         +2 if VAL1 != VAL2
472
473    This is similar to tree_int_cst_compare but supports pointer values
474    and values that cannot be compared at compile time.  */
475
476 static int
477 compare_values (tree val1, tree val2)
478 {
479   if (val1 == val2)
480     return 0;
481
482   /* Below we rely on the fact that VAL1 and VAL2 are both pointers or
483      both integers.  */
484   gcc_assert (POINTER_TYPE_P (TREE_TYPE (val1))
485               == POINTER_TYPE_P (TREE_TYPE (val2)));
486
487   /* Do some limited symbolic comparisons.  */
488   if (!POINTER_TYPE_P (TREE_TYPE (val1)))
489     {
490       /* We can determine some comparisons against +INF and -INF even
491          if the other value is an expression.  */
492       if (val1 == TYPE_MAX_VALUE (TREE_TYPE (val1))
493           && TREE_CODE (val2) == MINUS_EXPR)
494         {
495           /* +INF > NAME - CST.  */
496           return 1;
497         }
498       else if (val1 == TYPE_MIN_VALUE (TREE_TYPE (val1))
499                && TREE_CODE (val2) == PLUS_EXPR)
500         {
501           /* -INF < NAME + CST.  */
502           return -1;
503         }
504       else if (TREE_CODE (val1) == MINUS_EXPR
505                && val2 == TYPE_MAX_VALUE (TREE_TYPE (val2)))
506         {
507           /* NAME - CST < +INF.  */
508           return -1;
509         }
510       else if (TREE_CODE (val1) == PLUS_EXPR
511                && val2 == TYPE_MIN_VALUE (TREE_TYPE (val2)))
512         {
513           /* NAME + CST > -INF.  */
514           return 1;
515         }
516     }
517
518   if ((TREE_CODE (val1) == SSA_NAME
519        || TREE_CODE (val1) == PLUS_EXPR
520        || TREE_CODE (val1) == MINUS_EXPR)
521       && (TREE_CODE (val2) == SSA_NAME
522           || TREE_CODE (val2) == PLUS_EXPR
523           || TREE_CODE (val2) == MINUS_EXPR))
524     {
525       tree n1, c1, n2, c2;
526   
527       /* If VAL1 and VAL2 are of the form 'NAME [+-] CST' or 'NAME',
528          return -1 or +1 accordingly.  If VAL1 and VAL2 don't use the
529          same name, return -2.  */
530       if (TREE_CODE (val1) == SSA_NAME)
531         {
532           n1 = val1;
533           c1 = NULL_TREE;
534         }
535       else
536         {
537           n1 = TREE_OPERAND (val1, 0);
538           c1 = TREE_OPERAND (val1, 1);
539         }
540
541       if (TREE_CODE (val2) == SSA_NAME)
542         {
543           n2 = val2;
544           c2 = NULL_TREE;
545         }
546       else
547         {
548           n2 = TREE_OPERAND (val2, 0);
549           c2 = TREE_OPERAND (val2, 1);
550         }
551
552       /* Both values must use the same name.  */
553       if (n1 != n2)
554         return -2;
555
556       if (TREE_CODE (val1) == SSA_NAME)
557         {
558           if (TREE_CODE (val2) == SSA_NAME)
559             /* NAME == NAME  */
560             return 0;
561           else if (TREE_CODE (val2) == PLUS_EXPR)
562             /* NAME < NAME + CST  */
563             return -1;
564           else if (TREE_CODE (val2) == MINUS_EXPR)
565             /* NAME > NAME - CST  */
566             return 1;
567         }
568       else if (TREE_CODE (val1) == PLUS_EXPR)
569         {
570           if (TREE_CODE (val2) == SSA_NAME)
571             /* NAME + CST > NAME  */
572             return 1;
573           else if (TREE_CODE (val2) == PLUS_EXPR)
574             /* NAME + CST1 > NAME + CST2, if CST1 > CST2  */
575             return compare_values (c1, c2);
576           else if (TREE_CODE (val2) == MINUS_EXPR)
577             /* NAME + CST1 > NAME - CST2  */
578             return 1;
579         }
580       else if (TREE_CODE (val1) == MINUS_EXPR)
581         {
582           if (TREE_CODE (val2) == SSA_NAME)
583             /* NAME - CST < NAME  */
584             return -1;
585           else if (TREE_CODE (val2) == PLUS_EXPR)
586             /* NAME - CST1 < NAME + CST2  */
587             return -1;
588           else if (TREE_CODE (val2) == MINUS_EXPR)
589             /* NAME - CST1 > NAME - CST2, if CST1 < CST2.  Notice that
590                C1 and C2 are swapped in the call to compare_values.  */
591             return compare_values (c2, c1);
592         }
593
594       gcc_unreachable ();
595     }
596
597   /* We cannot compare non-constants.  */
598   if (!is_gimple_min_invariant (val1) || !is_gimple_min_invariant (val2))
599     return -2;
600
601   /* We cannot compare overflowed values.  */
602   if (TREE_OVERFLOW (val1) || TREE_OVERFLOW (val2))
603     return -2;
604
605   if (!POINTER_TYPE_P (TREE_TYPE (val1)))
606     return tree_int_cst_compare (val1, val2);
607   else
608     {
609       tree t;
610
611       /* First see if VAL1 and VAL2 are not the same.  */
612       if (val1 == val2 || operand_equal_p (val1, val2, 0))
613         return 0;
614       
615       /* If VAL1 is a lower address than VAL2, return -1.  */
616       t = fold_binary (LT_EXPR, boolean_type_node, val1, val2);
617       if (t == boolean_true_node)
618         return -1;
619
620       /* If VAL1 is a higher address than VAL2, return +1.  */
621       t = fold_binary (GT_EXPR, boolean_type_node, val1, val2);
622       if (t == boolean_true_node)
623         return 1;
624
625       /* If VAL1 is different than VAL2, return +2.  */
626       t = fold_binary (NE_EXPR, boolean_type_node, val1, val2);
627       if (t == boolean_true_node)
628         return 2;
629
630       return -2;
631     }
632 }
633
634
635 /* Return 1 if VAL is inside value range VR (VR->MIN <= VAL <= VR->MAX),
636           0 if VAL is not inside VR,
637          -2 if we cannot tell either way.  */
638
639 static inline int
640 value_inside_range (tree val, value_range_t *vr)
641 {
642   int cmp1, cmp2;
643
644   cmp1 = compare_values (val, vr->min);
645   if (cmp1 == -2 || cmp1 == 2)
646     return -2;
647
648   cmp2 = compare_values (val, vr->max);
649   if (cmp2 == -2 || cmp2 == 2)
650     return -2;
651
652   return (cmp1 == 0 || cmp1 == 1) && (cmp2 == -1 || cmp2 == 0);
653 }
654
655
656 /* Return true if value ranges VR0 and VR1 have a non-empty
657    intersection.  */
658
659 static inline bool
660 value_ranges_intersect_p (value_range_t *vr0, value_range_t *vr1)
661 {
662   return (value_inside_range (vr1->min, vr0) == 1
663           || value_inside_range (vr1->max, vr0) == 1
664           || value_inside_range (vr0->min, vr1) == 1
665           || value_inside_range (vr0->max, vr1) == 1);
666 }
667
668
669 /* Return true if VR includes the value zero, false otherwise.  */
670
671 static inline bool
672 range_includes_zero_p (value_range_t *vr)
673 {
674   tree zero;
675
676   gcc_assert (vr->type != VR_UNDEFINED
677               && vr->type != VR_VARYING
678               && !symbolic_range_p (vr));
679
680   zero = build_int_cst (TREE_TYPE (vr->min), 0);
681   return (value_inside_range (zero, vr) == 1);
682 }
683
684
685 /* Extract value range information from an ASSERT_EXPR EXPR and store
686    it in *VR_P.  */
687
688 static void
689 extract_range_from_assert (value_range_t *vr_p, tree expr)
690 {
691   tree var, cond, limit, min, max, type;
692   value_range_t *var_vr, *limit_vr;
693   enum tree_code cond_code;
694
695   var = ASSERT_EXPR_VAR (expr);
696   cond = ASSERT_EXPR_COND (expr);
697
698   gcc_assert (COMPARISON_CLASS_P (cond));
699
700   /* Find VAR in the ASSERT_EXPR conditional.  */
701   if (var == TREE_OPERAND (cond, 0))
702     {
703       /* If the predicate is of the form VAR COMP LIMIT, then we just
704          take LIMIT from the RHS and use the same comparison code.  */
705       limit = TREE_OPERAND (cond, 1);
706       cond_code = TREE_CODE (cond);
707     }
708   else
709     {
710       /* If the predicate is of the form LIMIT COMP VAR, then we need
711          to flip around the comparison code to create the proper range
712          for VAR.  */
713       limit = TREE_OPERAND (cond, 0);
714       cond_code = opposite_comparison (TREE_CODE (cond));
715     }
716
717   type = TREE_TYPE (limit);
718   gcc_assert (limit != var);
719
720   /* For pointer arithmetic, we only keep track of pointer equality
721      and inequality.  */
722   if (POINTER_TYPE_P (type) && cond_code != NE_EXPR && cond_code != EQ_EXPR)
723     {
724       set_value_range_to_varying (vr_p);
725       return;
726     }
727
728   /* If LIMIT is another SSA name and LIMIT has a range of its own,
729      try to use LIMIT's range to avoid creating symbolic ranges
730      unnecessarily. */
731   limit_vr = (TREE_CODE (limit) == SSA_NAME) ? get_value_range (limit) : NULL;
732
733   /* LIMIT's range is only interesting if it has any useful information.  */
734   if (limit_vr
735       && (limit_vr->type == VR_UNDEFINED
736           || limit_vr->type == VR_VARYING
737           || symbolic_range_p (limit_vr)))
738     limit_vr = NULL;
739
740   /* Special handling for integral types with super-types.  Some FEs
741      construct integral types derived from other types and restrict
742      the range of values these new types may take.
743
744      It may happen that LIMIT is actually smaller than TYPE's minimum
745      value.  For instance, the Ada FE is generating code like this
746      during bootstrap:
747
748             D.1480_32 = nam_30 - 300000361;
749             if (D.1480_32 <= 1) goto <L112>; else goto <L52>;
750             <L112>:;
751             D.1480_94 = ASSERT_EXPR <D.1480_32, D.1480_32 <= 1>;
752
753      All the names are of type types__name_id___XDLU_300000000__399999999
754      which has min == 300000000 and max == 399999999.  This means that
755      the ASSERT_EXPR would try to create the range [3000000, 1] which
756      is invalid.
757
758      The fact that the type specifies MIN and MAX values does not
759      automatically mean that every variable of that type will always
760      be within that range, so the predicate may well be true at run
761      time.  If we had symbolic -INF and +INF values, we could
762      represent this range, but we currently represent -INF and +INF
763      using the type's min and max values.
764          
765      So, the only sensible thing we can do for now is set the
766      resulting range to VR_VARYING.  TODO, would having symbolic -INF
767      and +INF values be worth the trouble?  */
768   if (TREE_CODE (limit) != SSA_NAME
769       && INTEGRAL_TYPE_P (type)
770       && TREE_TYPE (type))
771     {
772       if (cond_code == LE_EXPR || cond_code == LT_EXPR)
773         {
774           tree type_min = TYPE_MIN_VALUE (type);
775           int cmp = compare_values (limit, type_min);
776
777           /* For < or <= comparisons, if LIMIT is smaller than
778              TYPE_MIN, set the range to VR_VARYING.  */
779           if (cmp == -1 || cmp == 0)
780             {
781               set_value_range_to_varying (vr_p);
782               return;
783             }
784         }
785       else if (cond_code == GE_EXPR || cond_code == GT_EXPR)
786         {
787           tree type_max = TYPE_MIN_VALUE (type);
788           int cmp = compare_values (limit, type_max);
789
790           /* For > or >= comparisons, if LIMIT is bigger than
791              TYPE_MAX, set the range to VR_VARYING.  */
792           if (cmp == 1 || cmp == 0)
793             {
794               set_value_range_to_varying (vr_p);
795               return;
796             }
797         }
798     }
799
800   /* The new range has the same set of equivalences of VAR's range.  */
801   gcc_assert (vr_p->equiv == NULL);
802   vr_p->equiv = BITMAP_ALLOC (NULL);
803   add_equivalence (vr_p->equiv, var);
804
805   /* Extract a new range based on the asserted comparison for VAR and
806      LIMIT's value range.  Notice that if LIMIT has an anti-range, we
807      will only use it for equality comparisons (EQ_EXPR).  For any
808      other kind of assertion, we cannot derive a range from LIMIT's
809      anti-range that can be used to describe the new range.  For
810      instance, ASSERT_EXPR <x_2, x_2 <= b_4>.  If b_4 is ~[2, 10],
811      then b_4 takes on the ranges [-INF, 1] and [11, +INF].  There is
812      no single range for x_2 that could describe LE_EXPR, so we might
813      as well build the range [b_4, +INF] for it.  */
814   if (cond_code == EQ_EXPR)
815     {
816       enum value_range_type range_type;
817
818       if (limit_vr)
819         {
820           range_type = limit_vr->type;
821           min = limit_vr->min;
822           max = limit_vr->max;
823         }
824       else
825         {
826           range_type = VR_RANGE;
827           min = limit;
828           max = limit;
829         }
830
831       set_value_range (vr_p, range_type, min, max, vr_p->equiv);
832
833       /* When asserting the equality VAR == LIMIT and LIMIT is another
834          SSA name, the new range will also inherit the equivalence set
835          from LIMIT.  */
836       if (TREE_CODE (limit) == SSA_NAME)
837         add_equivalence (vr_p->equiv, limit);
838     }
839   else if (cond_code == NE_EXPR)
840     {
841       /* As described above, when LIMIT's range is an anti-range and
842          this assertion is an inequality (NE_EXPR), then we cannot
843          derive anything from the anti-range.  For instance, if
844          LIMIT's range was ~[0, 0], the assertion 'VAR != LIMIT' does
845          not imply that VAR's range is [0, 0].  So, in the case of
846          anti-ranges, we just assert the inequality using LIMIT and
847          not its anti-range.  */
848       if (limit_vr == NULL
849           || limit_vr->type == VR_ANTI_RANGE)
850         {
851           min = limit;
852           max = limit;
853         }
854       else
855         {
856           min = limit_vr->min;
857           max = limit_vr->max;
858         }
859
860       /* If MIN and MAX cover the whole range for their type, then
861          just use the original LIMIT.  */
862       if (INTEGRAL_TYPE_P (type)
863           && min == TYPE_MIN_VALUE (type)
864           && max == TYPE_MAX_VALUE (type))
865         min = max = limit;
866
867       set_value_range (vr_p, VR_ANTI_RANGE, min, max, vr_p->equiv);
868     }
869   else if (cond_code == LE_EXPR || cond_code == LT_EXPR)
870     {
871       min = TYPE_MIN_VALUE (type);
872
873       if (limit_vr == NULL || limit_vr->type == VR_ANTI_RANGE)
874         max = limit;
875       else
876         {
877           /* If LIMIT_VR is of the form [N1, N2], we need to build the
878              range [MIN, N2] for LE_EXPR and [MIN, N2 - 1] for
879              LT_EXPR.  */
880           max = limit_vr->max;
881         }
882
883       /* For LT_EXPR, we create the range [MIN, MAX - 1].  */
884       if (cond_code == LT_EXPR)
885         {
886           tree one = build_int_cst (type, 1);
887           max = fold (build (MINUS_EXPR, type, max, one));
888         }
889
890       set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
891     }
892   else if (cond_code == GE_EXPR || cond_code == GT_EXPR)
893     {
894       max = TYPE_MAX_VALUE (type);
895
896       if (limit_vr == NULL || limit_vr->type == VR_ANTI_RANGE)
897         min = limit;
898       else
899         {
900           /* If LIMIT_VR is of the form [N1, N2], we need to build the
901              range [N1, MAX] for GE_EXPR and [N1 + 1, MAX] for
902              GT_EXPR.  */
903           min = limit_vr->min;
904         }
905
906       /* For GT_EXPR, we create the range [MIN + 1, MAX].  */
907       if (cond_code == GT_EXPR)
908         {
909           tree one = build_int_cst (type, 1);
910           min = fold (build (PLUS_EXPR, type, min, one));
911         }
912
913       set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
914     }
915   else
916     gcc_unreachable ();
917
918   /* If VAR already had a known range and the two ranges have a
919      non-empty intersection, we can refine the resulting range.
920      Since the assert expression creates an equivalency and at the
921      same time it asserts a predicate, we can take the intersection of
922      the two ranges to get better precision.  */
923   var_vr = get_value_range (var);
924   if (var_vr->type == VR_RANGE
925       && vr_p->type == VR_RANGE
926       && value_ranges_intersect_p (var_vr, vr_p))
927     {
928       /* Use the larger of the two minimums.  */
929       if (compare_values (vr_p->min, var_vr->min) == -1)
930         min = var_vr->min;
931       else
932         min = vr_p->min;
933
934       /* Use the smaller of the two maximums.  */
935       if (compare_values (vr_p->max, var_vr->max) == 1)
936         max = var_vr->max;
937       else
938         max = vr_p->max;
939
940       set_value_range (vr_p, vr_p->type, min, max, vr_p->equiv);
941     }
942 }
943
944
945 /* Extract range information from SSA name VAR and store it in VR.  If
946    VAR has an interesting range, use it.  Otherwise, create the
947    range [VAR, VAR] and return it.  This is useful in situations where
948    we may have conditionals testing values of VARYING names.  For
949    instance,
950
951         x_3 = y_5;
952         if (x_3 > y_5)
953           ...
954
955     Even if y_5 is deemed VARYING, we can determine that x_3 > y_5 is
956     always false.  */
957
958 static void
959 extract_range_from_ssa_name (value_range_t *vr, tree var)
960 {
961   value_range_t *var_vr = get_value_range (var);
962
963   if (var_vr->type != VR_UNDEFINED && var_vr->type != VR_VARYING)
964     copy_value_range (vr, var_vr);
965   else
966     set_value_range (vr, VR_RANGE, var, var, NULL);
967
968   add_equivalence (vr->equiv, var);
969 }
970
971
972 /* Wrapper around int_const_binop.  If the operation overflows and we
973    are not using wrapping arithmetic, then adjust the result to be
974    -INF or +INF depending on CODE, VAL1 and VAL2.  */
975
976 static inline tree
977 vrp_int_const_binop (enum tree_code code, tree val1, tree val2)
978 {
979   tree res;
980
981   if (flag_wrapv)
982     return int_const_binop (code, val1, val2, 0);
983
984   /* If we are not using wrapping arithmetic, operate symbolically
985      on -INF and +INF.  */
986   res = int_const_binop (code, val1, val2, 0);
987
988   /* If the operation overflowed but neither VAL1 nor VAL2 are
989      overflown, return -INF or +INF depending on whether VAL1 CODE
990      VAL2 is a growing function or not.  */
991   if (TREE_OVERFLOW (res)
992       && !TREE_OVERFLOW (val1)
993       && !TREE_OVERFLOW (val2))
994     {
995       bool grows = false;
996       int sgn1 = tree_int_cst_sgn (val1);
997       int sgn2 = tree_int_cst_sgn (val2);
998
999       /* Notice that we only need to handle the restricted set of
1000          operations handled by extract_range_from_binary_expr.  */
1001       if (((code == PLUS_EXPR || code == MAX_EXPR) && sgn2 >= 0)
1002           || (code == MULT_EXPR && sgn1 == sgn2)
1003           || (code == MINUS_EXPR && sgn2 < 0))
1004         grows = true;
1005
1006       if (grows)
1007         return TYPE_MAX_VALUE (TREE_TYPE (res));
1008       else
1009         return TYPE_MIN_VALUE (TREE_TYPE (res));
1010     }
1011
1012   return res;
1013 }
1014
1015
1016 /* Extract range information from a binary expression EXPR based on
1017    the ranges of each of its operands and the expression code.  */
1018
1019 static void
1020 extract_range_from_binary_expr (value_range_t *vr, tree expr)
1021 {
1022   enum tree_code code = TREE_CODE (expr);
1023   tree op0, op1, min, max;
1024   int cmp;
1025   value_range_t vr0 = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
1026   value_range_t vr1 = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
1027
1028   /* Not all binary expressions can be applied to ranges in a
1029      meaningful way.  Handle only arithmetic operations.  */
1030   if (code != PLUS_EXPR
1031       && code != MINUS_EXPR
1032       && code != MULT_EXPR
1033       && code != TRUNC_DIV_EXPR
1034       && code != FLOOR_DIV_EXPR
1035       && code != CEIL_DIV_EXPR
1036       && code != EXACT_DIV_EXPR
1037       && code != ROUND_DIV_EXPR
1038       && code != MIN_EXPR
1039       && code != MAX_EXPR
1040       && code != TRUTH_ANDIF_EXPR
1041       && code != TRUTH_ORIF_EXPR
1042       && code != TRUTH_AND_EXPR
1043       && code != TRUTH_OR_EXPR
1044       && code != TRUTH_XOR_EXPR)
1045     {
1046       set_value_range_to_varying (vr);
1047       return;
1048     }
1049
1050   /* Get value ranges for each operand.  For constant operands, create
1051      a new value range with the operand to simplify processing.  */
1052   op0 = TREE_OPERAND (expr, 0);
1053   if (TREE_CODE (op0) == SSA_NAME)
1054     vr0 = *(get_value_range (op0));
1055   else if (is_gimple_min_invariant (op0))
1056     set_value_range (&vr0, VR_RANGE, op0, op0, NULL);
1057   else
1058     set_value_range_to_varying (&vr0);
1059
1060   op1 = TREE_OPERAND (expr, 1);
1061   if (TREE_CODE (op1) == SSA_NAME)
1062     vr1 = *(get_value_range (op1));
1063   else if (is_gimple_min_invariant (op1))
1064     set_value_range (&vr1, VR_RANGE, op1, op1, NULL);
1065   else
1066     set_value_range_to_varying (&vr1);
1067
1068   /* If either range is UNDEFINED, so is the result.  */
1069   if (vr0.type == VR_UNDEFINED || vr1.type == VR_UNDEFINED)
1070     {
1071       set_value_range_to_undefined (vr);
1072       return;
1073     }
1074
1075   /* Refuse to operate on VARYING ranges, ranges of different kinds
1076      and symbolic ranges.  TODO, we may be able to derive anti-ranges
1077      in some cases.  */
1078   if (vr0.type == VR_VARYING
1079       || vr1.type == VR_VARYING
1080       || vr0.type != vr1.type
1081       || symbolic_range_p (&vr0)
1082       || symbolic_range_p (&vr1))
1083     {
1084       set_value_range_to_varying (vr);
1085       return;
1086     }
1087
1088   /* Now evaluate the expression to determine the new range.  */
1089   if (POINTER_TYPE_P (TREE_TYPE (expr))
1090       || POINTER_TYPE_P (TREE_TYPE (op0))
1091       || POINTER_TYPE_P (TREE_TYPE (op1)))
1092     {
1093       /* For pointer types, we are really only interested in asserting
1094          whether the expression evaluates to non-NULL.  FIXME, we used
1095          to gcc_assert (code == PLUS_EXPR || code == MINUS_EXPR), but
1096          ivopts is generating expressions with pointer multiplication
1097          in them.  */
1098       if (code == PLUS_EXPR)
1099         set_value_range_to_nonnull (vr, TREE_TYPE (expr));
1100       else
1101         {
1102           /* Subtracting from a pointer, may yield 0, so just drop the
1103              resulting range to varying.  */
1104           set_value_range_to_varying (vr);
1105         }
1106
1107       return;
1108     }
1109
1110   /* For integer ranges, apply the operation to each end of the
1111      range and see what we end up with.  */
1112   if (code == TRUTH_ANDIF_EXPR
1113       || code == TRUTH_ORIF_EXPR
1114       || code == TRUTH_AND_EXPR
1115       || code == TRUTH_OR_EXPR
1116       || code == TRUTH_XOR_EXPR)
1117     {
1118       /* Boolean expressions cannot be folded with int_const_binop.  */
1119       min = fold_binary (code, TREE_TYPE (expr), vr0.min, vr1.min);
1120       max = fold_binary (code, TREE_TYPE (expr), vr0.max, vr1.max);
1121     }
1122   else if (code == PLUS_EXPR
1123            || code == MIN_EXPR
1124            || code == MAX_EXPR)
1125     {
1126       /* For operations that make the resulting range directly
1127          proportional to the original ranges, apply the operation to
1128          the same end of each range.  */
1129       min = vrp_int_const_binop (code, vr0.min, vr1.min);
1130       max = vrp_int_const_binop (code, vr0.max, vr1.max);
1131     }
1132   else if (code == MULT_EXPR
1133            || code == TRUNC_DIV_EXPR
1134            || code == FLOOR_DIV_EXPR
1135            || code == CEIL_DIV_EXPR
1136            || code == EXACT_DIV_EXPR
1137            || code == ROUND_DIV_EXPR)
1138     {
1139       tree val[4];
1140       size_t i;
1141
1142       /* Multiplications and divisions are a bit tricky to handle,
1143          depending on the mix of signs we have in the two ranges, we
1144          need to operate on different values to get the minimum and
1145          maximum values for the new range.  One approach is to figure
1146          out all the variations of range combinations and do the
1147          operations.
1148
1149          However, this involves several calls to compare_values and it
1150          is pretty convoluted.  It's simpler to do the 4 operations
1151          (MIN0 OP MIN1, MIN0 OP MAX1, MAX0 OP MIN1 and MAX0 OP MAX0 OP
1152          MAX1) and then figure the smallest and largest values to form
1153          the new range.  */
1154
1155       /* Divisions by zero result in a VARYING value.  */
1156       if (code != MULT_EXPR && range_includes_zero_p (&vr1))
1157         {
1158           set_value_range_to_varying (vr);
1159           return;
1160         }
1161
1162       /* Compute the 4 cross operations.  */
1163       val[0] = vrp_int_const_binop (code, vr0.min, vr1.min);
1164
1165       val[1] = (vr1.max != vr1.min)
1166                ? vrp_int_const_binop (code, vr0.min, vr1.max)
1167                : NULL_TREE;
1168
1169       val[2] = (vr0.max != vr0.min)
1170                ? vrp_int_const_binop (code, vr0.max, vr1.min)
1171                : NULL_TREE;
1172
1173       val[3] = (vr0.min != vr1.min && vr0.max != vr1.max)
1174                ? vrp_int_const_binop (code, vr0.max, vr1.max)
1175                : NULL_TREE;
1176
1177       /* Set MIN to the minimum of VAL[i] and MAX to the maximum
1178          of VAL[i].  */
1179       min = val[0];
1180       max = val[0];
1181       for (i = 1; i < 4; i++)
1182         {
1183           if (TREE_OVERFLOW (min) || TREE_OVERFLOW (max))
1184             break;
1185
1186           if (val[i])
1187             {
1188               if (TREE_OVERFLOW (val[i]))
1189                 {
1190                   /* If we found an overflowed value, set MIN and MAX
1191                      to it so that we set the resulting range to
1192                      VARYING.  */
1193                   min = max = val[i];
1194                   break;
1195                 }
1196
1197               if (compare_values (val[i], min) == -1)
1198                 min = val[i];
1199
1200               if (compare_values (val[i], max) == 1)
1201                 max = val[i];
1202             }
1203         }
1204     }
1205   else if (code == MINUS_EXPR)
1206     {
1207       /* For MINUS_EXPR, apply the operation to the opposite ends of
1208          each range.  */
1209       min = vrp_int_const_binop (code, vr0.min, vr1.max);
1210       max = vrp_int_const_binop (code, vr0.max, vr1.min);
1211     }
1212   else
1213     gcc_unreachable ();
1214
1215   /* If either MIN or MAX overflowed, then set the resulting range to
1216      VARYING.  */
1217   if (TREE_OVERFLOW (min) || TREE_OVERFLOW (max))
1218     {
1219       set_value_range_to_varying (vr);
1220       return;
1221     }
1222
1223   cmp = compare_values (min, max);
1224   if (cmp == -2 || cmp == 1)
1225     {
1226       /* If the new range has its limits swapped around (MIN > MAX),
1227          then the operation caused one of them to wrap around, mark
1228          the new range VARYING.  */
1229       set_value_range_to_varying (vr);
1230     }
1231   else
1232     set_value_range (vr, vr0.type, min, max, NULL);
1233 }
1234
1235
1236 /* Extract range information from a unary expression EXPR based on
1237    the range of its operand and the expression code.  */
1238
1239 static void
1240 extract_range_from_unary_expr (value_range_t *vr, tree expr)
1241 {
1242   enum tree_code code = TREE_CODE (expr);
1243   tree min, max, op0;
1244   int cmp;
1245   value_range_t vr0 = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
1246
1247   /* Refuse to operate on certain unary expressions for which we
1248      cannot easily determine a resulting range.  */
1249   if (code == FIX_TRUNC_EXPR
1250       || code == FIX_CEIL_EXPR
1251       || code == FIX_FLOOR_EXPR
1252       || code == FIX_ROUND_EXPR
1253       || code == FLOAT_EXPR
1254       || code == BIT_NOT_EXPR
1255       || code == NON_LVALUE_EXPR
1256       || code == CONJ_EXPR)
1257     {
1258       set_value_range_to_varying (vr);
1259       return;
1260     }
1261
1262   /* Get value ranges for the operand.  For constant operands, create
1263      a new value range with the operand to simplify processing.  */
1264   op0 = TREE_OPERAND (expr, 0);
1265   if (TREE_CODE (op0) == SSA_NAME)
1266     vr0 = *(get_value_range (op0));
1267   else if (is_gimple_min_invariant (op0))
1268     set_value_range (&vr0, VR_RANGE, op0, op0, NULL);
1269   else
1270     set_value_range_to_varying (&vr0);
1271
1272   /* If VR0 is UNDEFINED, so is the result.  */
1273   if (vr0.type == VR_UNDEFINED)
1274     {
1275       set_value_range_to_undefined (vr);
1276       return;
1277     }
1278
1279   /* Refuse to operate on varying and symbolic ranges.  Also, if the
1280      operand is neither a pointer nor an integral type, set the
1281      resulting range to VARYING.  TODO, in some cases we may be able
1282      to derive anti-ranges (like non-zero values).  */
1283   if (vr0.type == VR_VARYING
1284       || (!INTEGRAL_TYPE_P (TREE_TYPE (op0))
1285           && !POINTER_TYPE_P (TREE_TYPE (op0)))
1286       || symbolic_range_p (&vr0))
1287     {
1288       set_value_range_to_varying (vr);
1289       return;
1290     }
1291
1292   /* If the expression involves pointers, we are only interested in
1293      determining if it evaluates to NULL [0, 0] or non-NULL (~[0, 0]).  */
1294   if (POINTER_TYPE_P (TREE_TYPE (expr)) || POINTER_TYPE_P (TREE_TYPE (op0)))
1295     {
1296       if (range_is_nonnull (&vr0) || expr_computes_nonzero (expr))
1297         set_value_range_to_nonnull (vr, TREE_TYPE (expr));
1298       else if (range_is_null (&vr0))
1299         set_value_range_to_null (vr, TREE_TYPE (expr));
1300       else
1301         set_value_range_to_varying (vr);
1302
1303       return;
1304     }
1305
1306   /* Handle unary expressions on integer ranges.  */
1307   if (code == NOP_EXPR || code == CONVERT_EXPR)
1308     {
1309       tree inner_type = TREE_TYPE (op0);
1310       tree outer_type = TREE_TYPE (expr);
1311
1312       /* When converting types of different sizes, set the result to
1313          VARYING.  Things like sign extensions and precision loss may
1314          change the range.  For instance, if x_3 is of type 'long long
1315          int' and 'y_5 = (unsigned short) x_3', if x_3 is ~[0, 0], it
1316          is impossible to know at compile time whether y_5 will be
1317          ~[0, 0].  */
1318       if (TYPE_SIZE (inner_type) != TYPE_SIZE (outer_type)
1319           || TYPE_PRECISION (inner_type) != TYPE_PRECISION (outer_type))
1320         {
1321           set_value_range_to_varying (vr);
1322           return;
1323         }
1324     }
1325
1326   /* Apply the operation to each end of the range and see what we end
1327      up with.  */
1328   if (code == NEGATE_EXPR
1329       && !TYPE_UNSIGNED (TREE_TYPE (expr)))
1330     {
1331       /* Negating an anti-range doesn't really do anything to it.  The
1332          new range will also not take on the same range of values
1333          excluded by the original anti-range.  */
1334       if (vr0.type == VR_ANTI_RANGE)
1335         {
1336           copy_value_range (vr, &vr0);
1337           return;
1338         }
1339
1340       /* NEGATE_EXPR flips the range around.  */
1341       min = (vr0.max == TYPE_MAX_VALUE (TREE_TYPE (expr)))
1342             ? TYPE_MIN_VALUE (TREE_TYPE (expr))
1343             : fold_unary_to_constant (code, TREE_TYPE (expr), vr0.max);
1344
1345       max = (vr0.min == TYPE_MIN_VALUE (TREE_TYPE (expr)))
1346             ? TYPE_MAX_VALUE (TREE_TYPE (expr))
1347             : fold_unary_to_constant (code, TREE_TYPE (expr), vr0.min);
1348     }
1349   else if (code == ABS_EXPR
1350            && !TYPE_UNSIGNED (TREE_TYPE (expr)))
1351     {
1352       /* ABS_EXPR may flip the range around, if the original range
1353          included negative values.  */
1354       min = (vr0.min == TYPE_MIN_VALUE (TREE_TYPE (expr)))
1355             ? TYPE_MAX_VALUE (TREE_TYPE (expr))
1356             : fold_unary_to_constant (code, TREE_TYPE (expr), vr0.min);
1357
1358       max = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.max);
1359
1360       /* If the range was reversed, swap MIN and MAX.  */
1361       if (compare_values (min, max) == 1)
1362         {
1363           tree t = min;
1364           min = max;
1365           max = t;
1366         }
1367     }
1368   else
1369     {
1370       /* Otherwise, operate on each end of the range.  */
1371       min = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.min);
1372       max = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.max);
1373     }
1374
1375   cmp = compare_values (min, max);
1376   if (cmp == -2 || cmp == 1)
1377     {
1378       /* If the new range has its limits swapped around (MIN > MAX),
1379          then the operation caused one of them to wrap around, mark
1380          the new range VARYING.  */
1381       set_value_range_to_varying (vr);
1382     }
1383   else
1384     set_value_range (vr, vr0.type, min, max, NULL);
1385 }
1386
1387
1388 /* Extract range information from a comparison expression EXPR based
1389    on the range of its operand and the expression code.  */
1390
1391 static void
1392 extract_range_from_comparison (value_range_t *vr, tree expr)
1393 {
1394   tree val = vrp_evaluate_conditional (expr, false);
1395   if (val)
1396     {
1397       /* Since this expression was found on the RHS of an assignment,
1398          its type may be different from _Bool.  Convert VAL to EXPR's
1399          type.  */
1400       val = fold_convert (TREE_TYPE (expr), val);
1401       set_value_range (vr, VR_RANGE, val, val, vr->equiv);
1402     }
1403   else
1404     set_value_range_to_varying (vr);
1405 }
1406
1407
1408 /* Try to compute a useful range out of expression EXPR and store it
1409    in *VR.  */
1410
1411 static void
1412 extract_range_from_expr (value_range_t *vr, tree expr)
1413 {
1414   enum tree_code code = TREE_CODE (expr);
1415
1416   if (code == ASSERT_EXPR)
1417     extract_range_from_assert (vr, expr);
1418   else if (code == SSA_NAME)
1419     extract_range_from_ssa_name (vr, expr);
1420   else if (TREE_CODE_CLASS (code) == tcc_binary
1421            || code == TRUTH_ANDIF_EXPR
1422            || code == TRUTH_ORIF_EXPR
1423            || code == TRUTH_AND_EXPR
1424            || code == TRUTH_OR_EXPR
1425            || code == TRUTH_XOR_EXPR)
1426     extract_range_from_binary_expr (vr, expr);
1427   else if (TREE_CODE_CLASS (code) == tcc_unary)
1428     extract_range_from_unary_expr (vr, expr);
1429   else if (TREE_CODE_CLASS (code) == tcc_comparison)
1430     extract_range_from_comparison (vr, expr);
1431   else if (vrp_expr_computes_nonzero (expr))
1432     set_value_range_to_nonnull (vr, TREE_TYPE (expr));
1433   else if (is_gimple_min_invariant (expr))
1434     set_value_range (vr, VR_RANGE, expr, expr, NULL);
1435   else
1436     set_value_range_to_varying (vr);
1437 }
1438
1439 /* Given a range VR, a LOOP and a variable VAR, determine whether it
1440    would be profitable to adjust VR using scalar evolution information
1441    for VAR.  If so, update VR with the new limits.  */
1442
1443 static void
1444 adjust_range_with_scev (value_range_t *vr, struct loop *loop, tree stmt,
1445                         tree var)
1446 {
1447   tree init, step, chrec;
1448   bool init_is_max;
1449
1450   /* TODO.  Don't adjust anti-ranges.  An anti-range may provide
1451      better opportunities than a regular range, but I'm not sure.  */
1452   if (vr->type == VR_ANTI_RANGE)
1453     return;
1454
1455   chrec = analyze_scalar_evolution (loop, var);
1456   if (TREE_CODE (chrec) != POLYNOMIAL_CHREC)
1457     return;
1458
1459   init = CHREC_LEFT (chrec);
1460   step = CHREC_RIGHT (chrec);
1461
1462   /* If STEP is symbolic, we can't know whether INIT will be the
1463      minimum or maximum value in the range.  */
1464   if (!is_gimple_min_invariant (step))
1465     return;
1466
1467   /* Do not adjust ranges when chrec may wrap.  */
1468   if (scev_probably_wraps_p (chrec_type (chrec), init, step, stmt,
1469                              cfg_loops->parray[CHREC_VARIABLE (chrec)],
1470                              &init_is_max))
1471     return;
1472
1473   if (!POINTER_TYPE_P (TREE_TYPE (init))
1474       && (vr->type == VR_VARYING || vr->type == VR_UNDEFINED))
1475     {
1476       /* For VARYING or UNDEFINED ranges, just about anything we get
1477          from scalar evolutions should be better.  */
1478       if (init_is_max)
1479         set_value_range (vr, VR_RANGE, TYPE_MIN_VALUE (TREE_TYPE (init)),
1480                          init, vr->equiv);
1481       else
1482         set_value_range (vr, VR_RANGE, init, TYPE_MAX_VALUE (TREE_TYPE (init)),
1483                          vr->equiv);
1484     }
1485   else if (vr->type == VR_RANGE)
1486     {
1487       tree min = vr->min;
1488       tree max = vr->max;
1489
1490       if (init_is_max)
1491         {
1492           /* INIT is the maximum value.  If INIT is lower than VR->MAX
1493              but no smaller than VR->MIN, set VR->MAX to INIT.  */
1494           if (compare_values (init, max) == -1)
1495             {
1496               max = init;
1497
1498               /* If we just created an invalid range with the minimum
1499                  greater than the maximum, take the minimum all the
1500                  way to -INF.  */
1501               if (compare_values (min, max) == 1)
1502                 min = TYPE_MIN_VALUE (TREE_TYPE (min));
1503             }
1504         }
1505       else
1506         {
1507           /* If INIT is bigger than VR->MIN, set VR->MIN to INIT.  */
1508           if (compare_values (init, min) == 1)
1509             {
1510               min = init;
1511
1512               /* If we just created an invalid range with the minimum
1513                  greater than the maximum, take the maximum all the
1514                  way to +INF.  */
1515               if (compare_values (min, max) == 1)
1516                 max = TYPE_MAX_VALUE (TREE_TYPE (max));
1517             }
1518         }
1519
1520       set_value_range (vr, VR_RANGE, min, max, vr->equiv);
1521     }
1522 }
1523
1524
1525 /* Given two numeric value ranges VR0, VR1 and a comparison code COMP:
1526    
1527    - Return BOOLEAN_TRUE_NODE if VR0 COMP VR1 always returns true for
1528      all the values in the ranges.
1529
1530    - Return BOOLEAN_FALSE_NODE if the comparison always returns false.
1531
1532    - Return NULL_TREE if it is not always possible to determine the
1533      value of the comparison.  */
1534
1535
1536 static tree
1537 compare_ranges (enum tree_code comp, value_range_t *vr0, value_range_t *vr1)
1538 {
1539   /* VARYING or UNDEFINED ranges cannot be compared.  */
1540   if (vr0->type == VR_VARYING
1541       || vr0->type == VR_UNDEFINED
1542       || vr1->type == VR_VARYING
1543       || vr1->type == VR_UNDEFINED)
1544     return NULL_TREE;
1545
1546   /* Anti-ranges need to be handled separately.  */
1547   if (vr0->type == VR_ANTI_RANGE || vr1->type == VR_ANTI_RANGE)
1548     {
1549       /* If both are anti-ranges, then we cannot compute any
1550          comparison.  */
1551       if (vr0->type == VR_ANTI_RANGE && vr1->type == VR_ANTI_RANGE)
1552         return NULL_TREE;
1553
1554       /* These comparisons are never statically computable.  */
1555       if (comp == GT_EXPR
1556           || comp == GE_EXPR
1557           || comp == LT_EXPR
1558           || comp == LE_EXPR)
1559         return NULL_TREE;
1560
1561       /* Equality can be computed only between a range and an
1562          anti-range.  ~[VAL1, VAL2] == [VAL1, VAL2] is always false.  */
1563       if (vr0->type == VR_RANGE)
1564         {
1565           /* To simplify processing, make VR0 the anti-range.  */
1566           value_range_t *tmp = vr0;
1567           vr0 = vr1;
1568           vr1 = tmp;
1569         }
1570
1571       gcc_assert (comp == NE_EXPR || comp == EQ_EXPR);
1572
1573       if (compare_values (vr0->min, vr1->min) == 0
1574           && compare_values (vr0->max, vr1->max) == 0)
1575         return (comp == NE_EXPR) ? boolean_true_node : boolean_false_node;
1576
1577       return NULL_TREE;
1578     }
1579
1580   /* Simplify processing.  If COMP is GT_EXPR or GE_EXPR, switch the
1581      operands around and change the comparison code.  */
1582   if (comp == GT_EXPR || comp == GE_EXPR)
1583     {
1584       value_range_t *tmp;
1585       comp = (comp == GT_EXPR) ? LT_EXPR : LE_EXPR;
1586       tmp = vr0;
1587       vr0 = vr1;
1588       vr1 = tmp;
1589     }
1590
1591   if (comp == EQ_EXPR)
1592     {
1593       /* Equality may only be computed if both ranges represent
1594          exactly one value.  */
1595       if (compare_values (vr0->min, vr0->max) == 0
1596           && compare_values (vr1->min, vr1->max) == 0)
1597         {
1598           int cmp_min = compare_values (vr0->min, vr1->min);
1599           int cmp_max = compare_values (vr0->max, vr1->max);
1600           if (cmp_min == 0 && cmp_max == 0)
1601             return boolean_true_node;
1602           else if (cmp_min != -2 && cmp_max != -2)
1603             return boolean_false_node;
1604         }
1605
1606       return NULL_TREE;
1607     }
1608   else if (comp == NE_EXPR)
1609     {
1610       int cmp1, cmp2;
1611
1612       /* If VR0 is completely to the left or completely to the right
1613          of VR1, they are always different.  Notice that we need to
1614          make sure that both comparisons yield similar results to
1615          avoid comparing values that cannot be compared at
1616          compile-time.  */
1617       cmp1 = compare_values (vr0->max, vr1->min);
1618       cmp2 = compare_values (vr0->min, vr1->max);
1619       if ((cmp1 == -1 && cmp2 == -1) || (cmp1 == 1 && cmp2 == 1))
1620         return boolean_true_node;
1621
1622       /* If VR0 and VR1 represent a single value and are identical,
1623          return false.  */
1624       else if (compare_values (vr0->min, vr0->max) == 0
1625                && compare_values (vr1->min, vr1->max) == 0
1626                && compare_values (vr0->min, vr1->min) == 0
1627                && compare_values (vr0->max, vr1->max) == 0)
1628         return boolean_false_node;
1629
1630       /* Otherwise, they may or may not be different.  */
1631       else
1632         return NULL_TREE;
1633     }
1634   else if (comp == LT_EXPR || comp == LE_EXPR)
1635     {
1636       int tst;
1637
1638       /* If VR0 is to the left of VR1, return true.  */
1639       tst = compare_values (vr0->max, vr1->min);
1640       if ((comp == LT_EXPR && tst == -1)
1641           || (comp == LE_EXPR && (tst == -1 || tst == 0)))
1642         return boolean_true_node;
1643
1644       /* If VR0 is to the right of VR1, return false.  */
1645       tst = compare_values (vr0->min, vr1->max);
1646       if ((comp == LT_EXPR && (tst == 0 || tst == 1))
1647           || (comp == LE_EXPR && tst == 1))
1648         return boolean_false_node;
1649
1650       /* Otherwise, we don't know.  */
1651       return NULL_TREE;
1652     }
1653     
1654   gcc_unreachable ();
1655 }
1656
1657
1658 /* Given a value range VR, a value VAL and a comparison code COMP, return
1659    BOOLEAN_TRUE_NODE if VR COMP VAL always returns true for all the
1660    values in VR.  Return BOOLEAN_FALSE_NODE if the comparison
1661    always returns false.  Return NULL_TREE if it is not always
1662    possible to determine the value of the comparison.  */
1663
1664 static tree
1665 compare_range_with_value (enum tree_code comp, value_range_t *vr, tree val)
1666 {
1667   if (vr->type == VR_VARYING || vr->type == VR_UNDEFINED)
1668     return NULL_TREE;
1669
1670   /* Anti-ranges need to be handled separately.  */
1671   if (vr->type == VR_ANTI_RANGE)
1672     {
1673       /* For anti-ranges, the only predicates that we can compute at
1674          compile time are equality and inequality.  */
1675       if (comp == GT_EXPR
1676           || comp == GE_EXPR
1677           || comp == LT_EXPR
1678           || comp == LE_EXPR)
1679         return NULL_TREE;
1680
1681       /* ~[VAL, VAL] == VAL is always false.  */
1682       if (compare_values (vr->min, val) == 0
1683           && compare_values (vr->max, val) == 0)
1684         return (comp == NE_EXPR) ? boolean_true_node : boolean_false_node;
1685
1686       return NULL_TREE;
1687     }
1688
1689   if (comp == EQ_EXPR)
1690     {
1691       /* EQ_EXPR may only be computed if VR represents exactly
1692          one value.  */
1693       if (compare_values (vr->min, vr->max) == 0)
1694         {
1695           int cmp = compare_values (vr->min, val);
1696           if (cmp == 0)
1697             return boolean_true_node;
1698           else if (cmp == -1 || cmp == 1 || cmp == 2)
1699             return boolean_false_node;
1700         }
1701       else if (compare_values (val, vr->min) == -1
1702                || compare_values (vr->max, val) == -1)
1703         return boolean_false_node;
1704
1705       return NULL_TREE;
1706     }
1707   else if (comp == NE_EXPR)
1708     {
1709       /* If VAL is not inside VR, then they are always different.  */
1710       if (compare_values (vr->max, val) == -1
1711           || compare_values (vr->min, val) == 1)
1712         return boolean_true_node;
1713
1714       /* If VR represents exactly one value equal to VAL, then return
1715          false.  */
1716       if (compare_values (vr->min, vr->max) == 0
1717           && compare_values (vr->min, val) == 0)
1718         return boolean_false_node;
1719
1720       /* Otherwise, they may or may not be different.  */
1721       return NULL_TREE;
1722     }
1723   else if (comp == LT_EXPR || comp == LE_EXPR)
1724     {
1725       int tst;
1726
1727       /* If VR is to the left of VAL, return true.  */
1728       tst = compare_values (vr->max, val);
1729       if ((comp == LT_EXPR && tst == -1)
1730           || (comp == LE_EXPR && (tst == -1 || tst == 0)))
1731         return boolean_true_node;
1732
1733       /* If VR is to the right of VAL, return false.  */
1734       tst = compare_values (vr->min, val);
1735       if ((comp == LT_EXPR && (tst == 0 || tst == 1))
1736           || (comp == LE_EXPR && tst == 1))
1737         return boolean_false_node;
1738
1739       /* Otherwise, we don't know.  */
1740       return NULL_TREE;
1741     }
1742   else if (comp == GT_EXPR || comp == GE_EXPR)
1743     {
1744       int tst;
1745
1746       /* If VR is to the right of VAL, return true.  */
1747       tst = compare_values (vr->min, val);
1748       if ((comp == GT_EXPR && tst == 1)
1749           || (comp == GE_EXPR && (tst == 0 || tst == 1)))
1750         return boolean_true_node;
1751
1752       /* If VR is to the left of VAL, return false.  */
1753       tst = compare_values (vr->max, val);
1754       if ((comp == GT_EXPR && (tst == -1 || tst == 0))
1755           || (comp == GE_EXPR && tst == -1))
1756         return boolean_false_node;
1757
1758       /* Otherwise, we don't know.  */
1759       return NULL_TREE;
1760     }
1761
1762   gcc_unreachable ();
1763 }
1764
1765
1766 /* Debugging dumps.  */
1767
1768 void dump_value_range (FILE *, value_range_t *);
1769 void debug_value_range (value_range_t *);
1770 void dump_all_value_ranges (FILE *);
1771 void debug_all_value_ranges (void);
1772 void dump_vr_equiv (FILE *, bitmap);
1773 void debug_vr_equiv (bitmap);
1774
1775
1776 /* Dump value range VR to FILE.  */
1777
1778 void
1779 dump_value_range (FILE *file, value_range_t *vr)
1780 {
1781   if (vr == NULL)
1782     fprintf (file, "[]");
1783   else if (vr->type == VR_UNDEFINED)
1784     fprintf (file, "UNDEFINED");
1785   else if (vr->type == VR_RANGE || vr->type == VR_ANTI_RANGE)
1786     {
1787       tree type = TREE_TYPE (vr->min);
1788
1789       fprintf (file, "%s[", (vr->type == VR_ANTI_RANGE) ? "~" : "");
1790
1791       if (INTEGRAL_TYPE_P (type)
1792           && !TYPE_UNSIGNED (type)
1793           && vr->min == TYPE_MIN_VALUE (type))
1794         fprintf (file, "-INF");
1795       else
1796         print_generic_expr (file, vr->min, 0);
1797
1798       fprintf (file, ", ");
1799
1800       if (INTEGRAL_TYPE_P (type)
1801           && vr->max == TYPE_MAX_VALUE (type))
1802         fprintf (file, "+INF");
1803       else
1804         print_generic_expr (file, vr->max, 0);
1805
1806       fprintf (file, "]");
1807
1808       if (vr->equiv)
1809         {
1810           bitmap_iterator bi;
1811           unsigned i, c = 0;
1812
1813           fprintf (file, "  EQUIVALENCES: { ");
1814
1815           EXECUTE_IF_SET_IN_BITMAP (vr->equiv, 0, i, bi)
1816             {
1817               print_generic_expr (file, ssa_name (i), 0);
1818               fprintf (file, " ");
1819               c++;
1820             }
1821
1822           fprintf (file, "} (%u elements)", c);
1823         }
1824     }
1825   else if (vr->type == VR_VARYING)
1826     fprintf (file, "VARYING");
1827   else
1828     fprintf (file, "INVALID RANGE");
1829 }
1830
1831
1832 /* Dump value range VR to stderr.  */
1833
1834 void
1835 debug_value_range (value_range_t *vr)
1836 {
1837   dump_value_range (stderr, vr);
1838 }
1839
1840
1841 /* Dump value ranges of all SSA_NAMEs to FILE.  */
1842
1843 void
1844 dump_all_value_ranges (FILE *file)
1845 {
1846   size_t i;
1847
1848   for (i = 0; i < num_ssa_names; i++)
1849     {
1850       if (vr_value[i])
1851         {
1852           print_generic_expr (file, ssa_name (i), 0);
1853           fprintf (file, ": ");
1854           dump_value_range (file, vr_value[i]);
1855           fprintf (file, "\n");
1856         }
1857     }
1858
1859   fprintf (file, "\n");
1860 }
1861
1862
1863 /* Dump all value ranges to stderr.  */
1864
1865 void
1866 debug_all_value_ranges (void)
1867 {
1868   dump_all_value_ranges (stderr);
1869 }
1870
1871
1872 /* Given a COND_EXPR COND of the form 'V OP W', and an SSA name V,
1873    create a new SSA name N and return the assertion assignment
1874    'V = ASSERT_EXPR <V, V OP W>'.  */
1875
1876 static tree
1877 build_assert_expr_for (tree cond, tree v)
1878 {
1879   tree n, assertion;
1880
1881   gcc_assert (TREE_CODE (v) == SSA_NAME);
1882   n = duplicate_ssa_name (v, NULL_TREE);
1883
1884   if (COMPARISON_CLASS_P (cond))
1885     {
1886       tree a = build (ASSERT_EXPR, TREE_TYPE (v), v, cond); 
1887       assertion = build (MODIFY_EXPR, TREE_TYPE (v), n, a);
1888     }
1889   else if (TREE_CODE (cond) == TRUTH_NOT_EXPR)
1890     {
1891       /* Given !V, build the assignment N = false.  */
1892       tree op0 = TREE_OPERAND (cond, 0);
1893       gcc_assert (op0 == v);
1894       assertion = build (MODIFY_EXPR, TREE_TYPE (v), n, boolean_false_node);
1895     }
1896   else if (TREE_CODE (cond) == SSA_NAME)
1897     {
1898       /* Given V, build the assignment N = true.  */
1899       gcc_assert (v == cond);
1900       assertion = build (MODIFY_EXPR, TREE_TYPE (v), n, boolean_true_node);
1901     }
1902   else
1903     gcc_unreachable ();
1904
1905   SSA_NAME_DEF_STMT (n) = assertion;
1906
1907   /* The new ASSERT_EXPR, creates a new SSA name that replaces the
1908      operand of the ASSERT_EXPR. Register the new name and the old one
1909      in the replacement table so that we can fix the SSA web after
1910      adding all the ASSERT_EXPRs.  */
1911   register_new_name_mapping (n, v);
1912
1913   return assertion;
1914 }
1915
1916
1917 /* Return false if EXPR is a predicate expression involving floating
1918    point values.  */
1919
1920 static inline bool
1921 fp_predicate (tree expr)
1922 {
1923   return (COMPARISON_CLASS_P (expr)
1924           && FLOAT_TYPE_P (TREE_TYPE (TREE_OPERAND (expr, 0))));
1925 }
1926
1927
1928 /* If the range of values taken by OP can be inferred after STMT executes,
1929    return the comparison code (COMP_CODE_P) and value (VAL_P) that
1930    describes the inferred range.  Return true if a range could be
1931    inferred.  */
1932
1933 static bool
1934 infer_value_range (tree stmt, tree op, enum tree_code *comp_code_p, tree *val_p)
1935 {
1936   *val_p = NULL_TREE;
1937   *comp_code_p = ERROR_MARK;
1938
1939   /* Do not attempt to infer anything in names that flow through
1940      abnormal edges.  */
1941   if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op))
1942     return false;
1943
1944   /* Similarly, don't infer anything from statements that may throw
1945      exceptions.  */
1946   if (tree_could_throw_p (stmt))
1947     return false;
1948
1949   if (POINTER_TYPE_P (TREE_TYPE (op)))
1950     {
1951       bool is_store;
1952       unsigned num_uses, num_derefs;
1953
1954       count_uses_and_derefs (op, stmt, &num_uses, &num_derefs, &is_store);
1955       if (num_derefs > 0 && flag_delete_null_pointer_checks)
1956         {
1957           /* We can only assume that a pointer dereference will yield
1958              non-NULL if -fdelete-null-pointer-checks is enabled.  */
1959           *val_p = build_int_cst (TREE_TYPE (op), 0);
1960           *comp_code_p = NE_EXPR;
1961           return true;
1962         }
1963     }
1964
1965   return false;
1966 }
1967
1968
1969 void dump_asserts_for (FILE *, tree);
1970 void debug_asserts_for (tree);
1971 void dump_all_asserts (FILE *);
1972 void debug_all_asserts (void);
1973
1974 /* Dump all the registered assertions for NAME to FILE.  */
1975
1976 void
1977 dump_asserts_for (FILE *file, tree name)
1978 {
1979   assert_locus_t loc;
1980
1981   fprintf (file, "Assertions to be inserted for ");
1982   print_generic_expr (file, name, 0);
1983   fprintf (file, "\n");
1984
1985   loc = asserts_for[SSA_NAME_VERSION (name)];
1986   while (loc)
1987     {
1988       fprintf (file, "\t");
1989       print_generic_expr (file, bsi_stmt (loc->si), 0);
1990       fprintf (file, "\n\tBB #%d", loc->bb->index);
1991       if (loc->e)
1992         {
1993           fprintf (file, "\n\tEDGE %d->%d", loc->e->src->index,
1994                    loc->e->dest->index);
1995           dump_edge_info (file, loc->e, 0);
1996         }
1997       fprintf (file, "\n\tPREDICATE: ");
1998       print_generic_expr (file, name, 0);
1999       fprintf (file, " %s ", tree_code_name[(int)loc->comp_code]);
2000       print_generic_expr (file, loc->val, 0);
2001       fprintf (file, "\n\n");
2002       loc = loc->next;
2003     }
2004
2005   fprintf (file, "\n");
2006 }
2007
2008
2009 /* Dump all the registered assertions for NAME to stderr.  */
2010
2011 void
2012 debug_asserts_for (tree name)
2013 {
2014   dump_asserts_for (stderr, name);
2015 }
2016
2017
2018 /* Dump all the registered assertions for all the names to FILE.  */
2019
2020 void
2021 dump_all_asserts (FILE *file)
2022 {
2023   unsigned i;
2024   bitmap_iterator bi;
2025
2026   fprintf (file, "\nASSERT_EXPRs to be inserted\n\n");
2027   EXECUTE_IF_SET_IN_BITMAP (need_assert_for, 0, i, bi)
2028     dump_asserts_for (file, ssa_name (i));
2029   fprintf (file, "\n");
2030 }
2031
2032
2033 /* Dump all the registered assertions for all the names to stderr.  */
2034
2035 void
2036 debug_all_asserts (void)
2037 {
2038   dump_all_asserts (stderr);
2039 }
2040
2041
2042 /* If NAME doesn't have an ASSERT_EXPR registered for asserting
2043    'NAME COMP_CODE VAL' at a location that dominates block BB or
2044    E->DEST, then register this location as a possible insertion point
2045    for ASSERT_EXPR <NAME, NAME COMP_CODE VAL>.
2046
2047    BB, E and SI provide the exact insertion point for the new
2048    ASSERT_EXPR.  If BB is NULL, then the ASSERT_EXPR is to be inserted
2049    on edge E.  Otherwise, if E is NULL, the ASSERT_EXPR is inserted on
2050    BB.  If SI points to a COND_EXPR or a SWITCH_EXPR statement, then E
2051    must not be NULL.  */
2052
2053 static void
2054 register_new_assert_for (tree name,
2055                          enum tree_code comp_code,
2056                          tree val,
2057                          basic_block bb,
2058                          edge e,
2059                          block_stmt_iterator si)
2060 {
2061   assert_locus_t n, loc, last_loc;
2062   bool found;
2063   basic_block dest_bb;
2064
2065 #if defined ENABLE_CHECKING
2066   gcc_assert (bb == NULL || e == NULL);
2067
2068   if (e == NULL)
2069     gcc_assert (TREE_CODE (bsi_stmt (si)) != COND_EXPR
2070                 && TREE_CODE (bsi_stmt (si)) != SWITCH_EXPR);
2071 #endif
2072
2073   /* The new assertion A will be inserted at BB or E.  We need to
2074      determine if the new location is dominated by a previously
2075      registered location for A.  If we are doing an edge insertion,
2076      assume that A will be inserted at E->DEST.  Note that this is not
2077      necessarily true.
2078      
2079      If E is a critical edge, it will be split.  But even if E is
2080      split, the new block will dominate the same set of blocks that
2081      E->DEST dominates.
2082      
2083      The reverse, however, is not true, blocks dominated by E->DEST
2084      will not be dominated by the new block created to split E.  So,
2085      if the insertion location is on a critical edge, we will not use
2086      the new location to move another assertion previously registered
2087      at a block dominated by E->DEST.  */
2088   dest_bb = (bb) ? bb : e->dest;
2089
2090   /* If NAME already has an ASSERT_EXPR registered for COMP_CODE and
2091      VAL at a block dominating DEST_BB, then we don't need to insert a new
2092      one.  Similarly, if the same assertion already exists at a block
2093      dominated by DEST_BB and the new location is not on a critical
2094      edge, then update the existing location for the assertion (i.e.,
2095      move the assertion up in the dominance tree).
2096
2097      Note, this is implemented as a simple linked list because there
2098      should not be more than a handful of assertions registered per
2099      name.  If this becomes a performance problem, a table hashed by
2100      COMP_CODE and VAL could be implemented.  */
2101   loc = asserts_for[SSA_NAME_VERSION (name)];
2102   last_loc = loc;
2103   found = false;
2104   while (loc)
2105     {
2106       if (loc->comp_code == comp_code
2107           && (loc->val == val
2108               || operand_equal_p (loc->val, val, 0)))
2109         {
2110           /* If the assertion NAME COMP_CODE VAL has already been
2111              registered at a basic block that dominates DEST_BB, then
2112              we don't need to insert the same assertion again.  Note
2113              that we don't check strict dominance here to avoid
2114              replicating the same assertion inside the same basic
2115              block more than once (e.g., when a pointer is
2116              dereferenced several times inside a block).
2117
2118              An exception to this rule are edge insertions.  If the
2119              new assertion is to be inserted on edge E, then it will
2120              dominate all the other insertions that we may want to
2121              insert in DEST_BB.  So, if we are doing an edge
2122              insertion, don't do this dominance check.  */
2123           if (e == NULL
2124               && dominated_by_p (CDI_DOMINATORS, dest_bb, loc->bb))
2125             return;
2126
2127           /* Otherwise, if E is not a critical edge and DEST_BB
2128              dominates the existing location for the assertion, move
2129              the assertion up in the dominance tree by updating its
2130              location information.  */
2131           if ((e == NULL || !EDGE_CRITICAL_P (e))
2132               && dominated_by_p (CDI_DOMINATORS, loc->bb, dest_bb))
2133             {
2134               loc->bb = dest_bb;
2135               loc->e = e;
2136               loc->si = si;
2137               return;
2138             }
2139         }
2140
2141       /* Update the last node of the list and move to the next one.  */
2142       last_loc = loc;
2143       loc = loc->next;
2144     }
2145
2146   /* If we didn't find an assertion already registered for
2147      NAME COMP_CODE VAL, add a new one at the end of the list of
2148      assertions associated with NAME.  */
2149   n = xmalloc (sizeof (*n));
2150   n->bb = dest_bb;
2151   n->e = e;
2152   n->si = si;
2153   n->comp_code = comp_code;
2154   n->val = val;
2155   n->next = NULL;
2156
2157   if (last_loc)
2158     last_loc->next = n;
2159   else
2160     asserts_for[SSA_NAME_VERSION (name)] = n;
2161
2162   bitmap_set_bit (need_assert_for, SSA_NAME_VERSION (name));
2163 }
2164
2165
2166 /* Try to register an edge assertion for SSA name NAME on edge E for
2167    the conditional jump pointed by SI.  Return true if an assertion
2168    for NAME could be registered.  */
2169
2170 static bool
2171 register_edge_assert_for (tree name, edge e, block_stmt_iterator si)
2172 {
2173   tree val, stmt;
2174   enum tree_code comp_code;
2175
2176   stmt = bsi_stmt (si);
2177
2178   /* Do not attempt to infer anything in names that flow through
2179      abnormal edges.  */
2180   if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name))
2181     return false;
2182
2183   /* If NAME was not found in the sub-graph reachable from E, then
2184      there's nothing to do.  */
2185   if (!TEST_BIT (found_in_subgraph, SSA_NAME_VERSION (name)))
2186     return false;
2187
2188   /* We found a use of NAME in the sub-graph rooted at E->DEST.
2189      Register an assertion for NAME according to the value that NAME
2190      takes on edge E.  */
2191   if (TREE_CODE (stmt) == COND_EXPR)
2192     {
2193       /* If BB ends in a COND_EXPR then NAME then we should insert
2194          the original predicate on EDGE_TRUE_VALUE and the
2195          opposite predicate on EDGE_FALSE_VALUE.  */
2196       tree cond = COND_EXPR_COND (stmt);
2197       bool is_else_edge = (e->flags & EDGE_FALSE_VALUE) != 0;
2198
2199       /* Predicates may be a single SSA name or NAME OP VAL.  */
2200       if (cond == name)
2201         {
2202           /* If the predicate is a name, it must be NAME, in which
2203              case we create the predicate NAME == true or
2204              NAME == false accordingly.  */
2205           comp_code = EQ_EXPR;
2206           val = (is_else_edge) ? boolean_false_node : boolean_true_node;
2207         }
2208       else
2209         {
2210           /* Otherwise, we have a comparison of the form NAME COMP VAL
2211              or VAL COMP NAME.  */
2212           if (name == TREE_OPERAND (cond, 1))
2213             {
2214               /* If the predicate is of the form VAL COMP NAME, flip
2215                  COMP around because we need to register NAME as the
2216                  first operand in the predicate.  */
2217               comp_code = opposite_comparison (TREE_CODE (cond));
2218               val = TREE_OPERAND (cond, 0);
2219             }
2220           else
2221             {
2222               /* The comparison is of the form NAME COMP VAL, so the
2223                  comparison code remains unchanged.  */
2224               comp_code = TREE_CODE (cond);
2225               val = TREE_OPERAND (cond, 1);
2226             }
2227
2228           /* If we are inserting the assertion on the ELSE edge, we
2229              need to invert the sign comparison.  */
2230           if (is_else_edge)
2231             comp_code = invert_tree_comparison (comp_code, 0);
2232         }
2233     }
2234   else
2235     {
2236       /* FIXME.  Handle SWITCH_EXPR.  */
2237       gcc_unreachable ();
2238     }
2239
2240   register_new_assert_for (name, comp_code, val, NULL, e, si);
2241   return true;
2242 }
2243
2244
2245 static bool find_assert_locations (basic_block bb);
2246
2247 /* Determine whether the outgoing edges of BB should receive an
2248    ASSERT_EXPR for each of the operands of BB's last statement.  The
2249    last statement of BB must be a COND_EXPR or a SWITCH_EXPR.
2250
2251    If any of the sub-graphs rooted at BB have an interesting use of
2252    the predicate operands, an assert location node is added to the
2253    list of assertions for the corresponding operands.  */
2254
2255 static bool
2256 find_conditional_asserts (basic_block bb)
2257 {
2258   bool need_assert;
2259   block_stmt_iterator last_si;
2260   tree op, last;
2261   edge_iterator ei;
2262   edge e;
2263   ssa_op_iter iter;
2264
2265   need_assert = false;
2266   last_si = bsi_last (bb);
2267   last = bsi_stmt (last_si);
2268
2269   /* Look for uses of the operands in each of the sub-graphs
2270      rooted at BB.  We need to check each of the outgoing edges
2271      separately, so that we know what kind of ASSERT_EXPR to
2272      insert.  */
2273   FOR_EACH_EDGE (e, ei, bb->succs)
2274     {
2275       if (e->dest == bb)
2276         continue;
2277
2278       /* Remove the COND_EXPR operands from the FOUND_IN_SUBGRAPH bitmap.
2279          Otherwise, when we finish traversing each of the sub-graphs, we
2280          won't know whether the variables were found in the sub-graphs or
2281          if they had been found in a block upstream from BB.  */
2282       FOR_EACH_SSA_TREE_OPERAND (op, last, iter, SSA_OP_USE)
2283         RESET_BIT (found_in_subgraph, SSA_NAME_VERSION (op));
2284
2285       /* Traverse the strictly dominated sub-graph rooted at E->DEST
2286          to determine if any of the operands in the conditional
2287          predicate are used.  */
2288       if (e->dest != bb)
2289         need_assert |= find_assert_locations (e->dest);
2290
2291       /* Register the necessary assertions for each operand in the
2292          conditional predicate.  */
2293       FOR_EACH_SSA_TREE_OPERAND (op, last, iter, SSA_OP_USE)
2294         need_assert |= register_edge_assert_for (op, e, last_si);
2295     }
2296
2297   /* Finally, indicate that we have found the operands in the
2298      conditional.  */
2299   FOR_EACH_SSA_TREE_OPERAND (op, last, iter, SSA_OP_USE)
2300     SET_BIT (found_in_subgraph, SSA_NAME_VERSION (op));
2301
2302   return need_assert;
2303 }
2304
2305
2306 /* Traverse all the statements in block BB looking for statements that
2307    may generate useful assertions for the SSA names in their operand.
2308    If a statement produces a useful assertion A for name N_i, then the
2309    list of assertions already generated for N_i is scanned to
2310    determine if A is actually needed.
2311    
2312    If N_i already had the assertion A at a location dominating the
2313    current location, then nothing needs to be done.  Otherwise, the
2314    new location for A is recorded instead.
2315
2316    1- For every statement S in BB, all the variables used by S are
2317       added to bitmap FOUND_IN_SUBGRAPH.
2318
2319    2- If statement S uses an operand N in a way that exposes a known
2320       value range for N, then if N was not already generated by an
2321       ASSERT_EXPR, create a new assert location for N.  For instance,
2322       if N is a pointer and the statement dereferences it, we can
2323       assume that N is not NULL.
2324
2325    3- COND_EXPRs are a special case of #2.  We can derive range
2326       information from the predicate but need to insert different
2327       ASSERT_EXPRs for each of the sub-graphs rooted at the
2328       conditional block.  If the last statement of BB is a conditional
2329       expression of the form 'X op Y', then
2330
2331       a) Remove X and Y from the set FOUND_IN_SUBGRAPH.
2332
2333       b) If the conditional is the only entry point to the sub-graph
2334          corresponding to the THEN_CLAUSE, recurse into it.  On
2335          return, if X and/or Y are marked in FOUND_IN_SUBGRAPH, then
2336          an ASSERT_EXPR is added for the corresponding variable.
2337
2338       c) Repeat step (b) on the ELSE_CLAUSE.
2339
2340       d) Mark X and Y in FOUND_IN_SUBGRAPH.
2341
2342       For instance,
2343
2344             if (a == 9)
2345               b = a;
2346             else
2347               b = c + 1;
2348
2349       In this case, an assertion on the THEN clause is useful to
2350       determine that 'a' is always 9 on that edge.  However, an assertion
2351       on the ELSE clause would be unnecessary.
2352
2353    4- If BB does not end in a conditional expression, then we recurse
2354       into BB's dominator children.
2355    
2356    At the end of the recursive traversal, every SSA name will have a
2357    list of locations where ASSERT_EXPRs should be added.  When a new
2358    location for name N is found, it is registered by calling
2359    register_new_assert_for.  That function keeps track of all the
2360    registered assertions to prevent adding unnecessary assertions.
2361    For instance, if a pointer P_4 is dereferenced more than once in a
2362    dominator tree, only the location dominating all the dereference of
2363    P_4 will receive an ASSERT_EXPR.
2364
2365    If this function returns true, then it means that there are names
2366    for which we need to generate ASSERT_EXPRs.  Those assertions are
2367    inserted by process_assert_insertions.
2368
2369    TODO.  Handle SWITCH_EXPR.  */
2370
2371 static bool
2372 find_assert_locations (basic_block bb)
2373 {
2374   block_stmt_iterator si;
2375   tree last, phi;
2376   bool need_assert;
2377   basic_block son;
2378
2379   if (TEST_BIT (blocks_visited, bb->index))
2380     return false;
2381
2382   SET_BIT (blocks_visited, bb->index);
2383
2384   need_assert = false;
2385
2386   /* Traverse all PHI nodes in BB marking used operands.  */
2387   for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
2388     {
2389       use_operand_p arg_p;
2390       ssa_op_iter i;
2391
2392       FOR_EACH_PHI_ARG (arg_p, phi, i, SSA_OP_USE)
2393         {
2394           tree arg = USE_FROM_PTR (arg_p);
2395           if (TREE_CODE (arg) == SSA_NAME)
2396             {
2397               gcc_assert (is_gimple_reg (PHI_RESULT (phi)));
2398               SET_BIT (found_in_subgraph, SSA_NAME_VERSION (arg));
2399             }
2400         }
2401     }
2402
2403   /* Traverse all the statements in BB marking used names and looking
2404      for statements that may infer assertions for their used operands.  */
2405   last = NULL_TREE;
2406   for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
2407     {
2408       tree stmt, op;
2409       ssa_op_iter i;
2410
2411       stmt = bsi_stmt (si);
2412
2413       /* See if we can derive an assertion for any of STMT's operands.  */
2414       FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_USE)
2415         {
2416           tree value;
2417           enum tree_code comp_code;
2418
2419           /* Mark OP in bitmap FOUND_IN_SUBGRAPH.  If STMT is inside
2420              the sub-graph of a conditional block, when we return from
2421              this recursive walk, our parent will use the
2422              FOUND_IN_SUBGRAPH bitset to determine if one of the
2423              operands it was looking for was present in the sub-graph.  */
2424           SET_BIT (found_in_subgraph, SSA_NAME_VERSION (op));
2425
2426           /* If OP is used only once, namely in this STMT, don't
2427              bother creating an ASSERT_EXPR for it.  Such an
2428              ASSERT_EXPR would do nothing but increase compile time.
2429              Experiments show that with this simple check, we can save
2430              more than 20% of ASSERT_EXPRs.  */
2431           if (has_single_use (op))
2432             continue;
2433
2434           /* If OP is used in such a way that we can infer a value
2435              range for it, and we don't find a previous assertion for
2436              it, create a new assertion location node for OP.  */
2437           if (infer_value_range (stmt, op, &comp_code, &value))
2438             {
2439               register_new_assert_for (op, comp_code, value, bb, NULL, si);
2440               need_assert = true;
2441             }
2442         }
2443
2444       /* Remember the last statement of the block.  */
2445       last = stmt;
2446     }
2447
2448   /* If BB's last statement is a conditional expression
2449      involving integer operands, recurse into each of the sub-graphs
2450      rooted at BB to determine if we need to add ASSERT_EXPRs.  */
2451   if (last
2452       && TREE_CODE (last) == COND_EXPR
2453       && !fp_predicate (COND_EXPR_COND (last))
2454       && !ZERO_SSA_OPERANDS (last, SSA_OP_USE))
2455     need_assert |= find_conditional_asserts (bb);
2456
2457   /* Recurse into the dominator children of BB.  */
2458   for (son = first_dom_son (CDI_DOMINATORS, bb);
2459        son;
2460        son = next_dom_son (CDI_DOMINATORS, son))
2461     need_assert |= find_assert_locations (son);
2462
2463   return need_assert;
2464 }
2465
2466
2467 /* Create an ASSERT_EXPR for NAME and insert it in the location
2468    indicated by LOC.  Return true if we made any edge insertions.  */
2469
2470 static bool
2471 process_assert_insertions_for (tree name, assert_locus_t loc)
2472 {
2473   /* Build the comparison expression NAME_i COMP_CODE VAL.  */
2474   tree stmt, cond, assert_expr;
2475   edge_iterator ei;
2476   edge e;
2477
2478   cond = build (loc->comp_code, boolean_type_node, name, loc->val);
2479   assert_expr = build_assert_expr_for (cond, name);
2480
2481   if (loc->e)
2482     {
2483       /* We have been asked to insert the assertion on an edge.  This
2484          is used only by COND_EXPR and SWITCH_EXPR assertions.  */
2485 #if defined ENABLE_CHECKING
2486       gcc_assert (TREE_CODE (bsi_stmt (loc->si)) == COND_EXPR
2487           || TREE_CODE (bsi_stmt (loc->si)) == SWITCH_EXPR);
2488 #endif
2489
2490       bsi_insert_on_edge (loc->e, assert_expr);
2491       return true;
2492     }
2493
2494   /* Otherwise, we can insert right after LOC->SI iff the
2495      statement must not be the last statement in the block.  */
2496   stmt = bsi_stmt (loc->si);
2497   if (!stmt_ends_bb_p (stmt))
2498     {
2499       bsi_insert_after (&loc->si, assert_expr, BSI_SAME_STMT);
2500       return false;
2501     }
2502
2503   /* If STMT must be the last statement in BB, we can only insert new
2504      assertions on the non-abnormal edge out of BB.  Note that since
2505      STMT is not control flow, there may only be one non-abnormal edge
2506      out of BB.  */
2507   FOR_EACH_EDGE (e, ei, loc->bb->succs)
2508     if (!(e->flags & EDGE_ABNORMAL))
2509       {
2510         bsi_insert_on_edge (e, assert_expr);
2511         return true;
2512       }
2513
2514   gcc_unreachable ();
2515 }
2516
2517
2518 /* Process all the insertions registered for every name N_i registered
2519    in NEED_ASSERT_FOR.  The list of assertions to be inserted are
2520    found in ASSERTS_FOR[i].  */
2521
2522 static void
2523 process_assert_insertions (void)
2524 {
2525   unsigned i;
2526   bitmap_iterator bi;
2527   bool update_edges_p = false;
2528   int num_asserts = 0;
2529
2530   if (dump_file && (dump_flags & TDF_DETAILS))
2531     dump_all_asserts (dump_file);
2532
2533   EXECUTE_IF_SET_IN_BITMAP (need_assert_for, 0, i, bi)
2534     {
2535       assert_locus_t loc = asserts_for[i];
2536       gcc_assert (loc);
2537
2538       while (loc)
2539         {
2540           assert_locus_t next = loc->next;
2541           update_edges_p |= process_assert_insertions_for (ssa_name (i), loc);
2542           free (loc);
2543           loc = next;
2544           num_asserts++;
2545         }
2546     }
2547
2548   if (update_edges_p)
2549     bsi_commit_edge_inserts ();
2550
2551   if (dump_file && (dump_flags & TDF_STATS))
2552     fprintf (dump_file, "\nNumber of ASSERT_EXPR expressions inserted: %d\n\n",
2553              num_asserts);
2554 }
2555
2556
2557 /* Traverse the flowgraph looking for conditional jumps to insert range
2558    expressions.  These range expressions are meant to provide information
2559    to optimizations that need to reason in terms of value ranges.  They
2560    will not be expanded into RTL.  For instance, given:
2561
2562    x = ...
2563    y = ...
2564    if (x < y)
2565      y = x - 2;
2566    else
2567      x = y + 3;
2568
2569    this pass will transform the code into:
2570
2571    x = ...
2572    y = ...
2573    if (x < y)
2574     {
2575       x = ASSERT_EXPR <x, x < y>
2576       y = x - 2
2577     }
2578    else
2579     {
2580       y = ASSERT_EXPR <y, x <= y>
2581       x = y + 3
2582     }
2583
2584    The idea is that once copy and constant propagation have run, other
2585    optimizations will be able to determine what ranges of values can 'x'
2586    take in different paths of the code, simply by checking the reaching
2587    definition of 'x'.  */
2588
2589 static void
2590 insert_range_assertions (void)
2591 {
2592   edge e;
2593   edge_iterator ei;
2594   bool update_ssa_p;
2595   
2596   found_in_subgraph = sbitmap_alloc (num_ssa_names);
2597   sbitmap_zero (found_in_subgraph);
2598
2599   blocks_visited = sbitmap_alloc (last_basic_block);
2600   sbitmap_zero (blocks_visited);
2601
2602   need_assert_for = BITMAP_ALLOC (NULL);
2603   asserts_for = xmalloc (num_ssa_names * sizeof (assert_locus_t));
2604   memset (asserts_for, 0, num_ssa_names * sizeof (assert_locus_t));
2605
2606   calculate_dominance_info (CDI_DOMINATORS);
2607
2608   update_ssa_p = false;
2609   FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
2610     if (find_assert_locations (e->dest))
2611       update_ssa_p = true;
2612
2613   if (update_ssa_p)
2614     {
2615       process_assert_insertions ();
2616       update_ssa (TODO_update_ssa_no_phi);
2617     }
2618
2619   if (dump_file && (dump_flags & TDF_DETAILS))
2620     {
2621       fprintf (dump_file, "\nSSA form after inserting ASSERT_EXPRs\n");
2622       dump_function_to_file (current_function_decl, dump_file, dump_flags);
2623     }
2624
2625   sbitmap_free (found_in_subgraph);
2626   free (asserts_for);
2627   BITMAP_FREE (need_assert_for);
2628 }
2629
2630
2631 /* Convert range assertion expressions into the implied copies.
2632    
2633    FIXME, this will eventually lead to copy propagation removing the
2634    names that had useful range information attached to them.  For
2635    instance, if we had the assertion N_i = ASSERT_EXPR <N_j, N_j > 3>,
2636    then N_i will have the range [3, +INF].
2637    
2638    However, by converting the assertion into the implied copy
2639    operation N_i = N_j, we will then copy-propagate N_j into the uses
2640    of N_i and lose the range information.  We may want to hold on to
2641    ASSERT_EXPRs a little while longer as the ranges could be used in
2642    things like jump threading.
2643    
2644    The problem with keeping ASSERT_EXPRs around is that passes after
2645    VRP need to handle them appropriately.  */
2646
2647 static void
2648 remove_range_assertions (void)
2649 {
2650   basic_block bb;
2651   block_stmt_iterator si;
2652
2653   FOR_EACH_BB (bb)
2654     for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
2655       {
2656         tree stmt = bsi_stmt (si);
2657
2658         if (TREE_CODE (stmt) == MODIFY_EXPR
2659             && TREE_CODE (TREE_OPERAND (stmt, 1)) == ASSERT_EXPR)
2660           {
2661             tree rhs = TREE_OPERAND (stmt, 1);
2662             tree cond = fold (ASSERT_EXPR_COND (rhs));
2663             gcc_assert (cond != boolean_false_node);
2664             TREE_OPERAND (stmt, 1) = ASSERT_EXPR_VAR (rhs);
2665             update_stmt (stmt);
2666           }
2667       }
2668 }
2669
2670
2671 /* Return true if STMT is interesting for VRP.  */
2672
2673 static bool
2674 stmt_interesting_for_vrp (tree stmt)
2675 {
2676   if (TREE_CODE (stmt) == PHI_NODE
2677       && is_gimple_reg (PHI_RESULT (stmt))
2678       && (INTEGRAL_TYPE_P (TREE_TYPE (PHI_RESULT (stmt)))
2679           || POINTER_TYPE_P (TREE_TYPE (PHI_RESULT (stmt)))))
2680     return true;
2681   else if (TREE_CODE (stmt) == MODIFY_EXPR)
2682     {
2683       tree lhs = TREE_OPERAND (stmt, 0);
2684
2685       if (TREE_CODE (lhs) == SSA_NAME
2686           && (INTEGRAL_TYPE_P (TREE_TYPE (lhs))
2687               || POINTER_TYPE_P (TREE_TYPE (lhs)))
2688           && ZERO_SSA_OPERANDS (stmt, SSA_OP_ALL_VIRTUALS))
2689         return true;
2690     }
2691   else if (TREE_CODE (stmt) == COND_EXPR || TREE_CODE (stmt) == SWITCH_EXPR)
2692     return true;
2693
2694   return false;
2695 }
2696
2697
2698 /* Initialize local data structures for VRP.  Return true if VRP
2699    is worth running (i.e. if we found any statements that could
2700    benefit from range information).  */
2701
2702 static void
2703 vrp_initialize (void)
2704 {
2705   basic_block bb;
2706
2707   vr_value = xmalloc (num_ssa_names * sizeof (value_range_t *));
2708   memset (vr_value, 0, num_ssa_names * sizeof (value_range_t *));
2709
2710   FOR_EACH_BB (bb)
2711     {
2712       block_stmt_iterator si;
2713       tree phi;
2714
2715       for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
2716         {
2717           if (!stmt_interesting_for_vrp (phi))
2718             {
2719               tree lhs = PHI_RESULT (phi);
2720               set_value_range_to_varying (get_value_range (lhs));
2721               DONT_SIMULATE_AGAIN (phi) = true;
2722             }
2723           else
2724             DONT_SIMULATE_AGAIN (phi) = false;
2725         }
2726
2727       for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
2728         {
2729           tree stmt = bsi_stmt (si);
2730
2731           if (!stmt_interesting_for_vrp (stmt))
2732             {
2733               ssa_op_iter i;
2734               tree def;
2735               FOR_EACH_SSA_TREE_OPERAND (def, stmt, i, SSA_OP_DEF)
2736                 set_value_range_to_varying (get_value_range (def));
2737               DONT_SIMULATE_AGAIN (stmt) = true;
2738             }
2739           else
2740             {
2741               DONT_SIMULATE_AGAIN (stmt) = false;
2742             }
2743         }
2744     }
2745 }
2746
2747
2748 /* Visit assignment STMT.  If it produces an interesting range, record
2749    the SSA name in *OUTPUT_P.  */
2750
2751 static enum ssa_prop_result
2752 vrp_visit_assignment (tree stmt, tree *output_p)
2753 {
2754   tree lhs, rhs, def;
2755   ssa_op_iter iter;
2756
2757   lhs = TREE_OPERAND (stmt, 0);
2758   rhs = TREE_OPERAND (stmt, 1);
2759
2760   /* We only keep track of ranges in integral and pointer types.  */
2761   if (TREE_CODE (lhs) == SSA_NAME
2762       && (INTEGRAL_TYPE_P (TREE_TYPE (lhs))
2763           || POINTER_TYPE_P (TREE_TYPE (lhs))))
2764     {
2765       struct loop *l;
2766       value_range_t new_vr = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
2767
2768       extract_range_from_expr (&new_vr, rhs);
2769
2770       /* If STMT is inside a loop, we may be able to know something
2771          else about the range of LHS by examining scalar evolution
2772          information.  */
2773       if (cfg_loops && (l = loop_containing_stmt (stmt)))
2774         adjust_range_with_scev (&new_vr, l, stmt, lhs);
2775
2776       if (update_value_range (lhs, &new_vr))
2777         {
2778           *output_p = lhs;
2779
2780           if (dump_file && (dump_flags & TDF_DETAILS))
2781             {
2782               fprintf (dump_file, "Found new range for ");
2783               print_generic_expr (dump_file, lhs, 0);
2784               fprintf (dump_file, ": ");
2785               dump_value_range (dump_file, &new_vr);
2786               fprintf (dump_file, "\n\n");
2787             }
2788
2789           if (new_vr.type == VR_VARYING)
2790             return SSA_PROP_VARYING;
2791
2792           return SSA_PROP_INTERESTING;
2793         }
2794
2795       return SSA_PROP_NOT_INTERESTING;
2796     }
2797   
2798   /* Every other statement produces no useful ranges.  */
2799   FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF)
2800     set_value_range_to_varying (get_value_range (def));
2801
2802   return SSA_PROP_VARYING;
2803 }
2804
2805
2806 /* Compare all the value ranges for names equivalent to VAR with VAL
2807    using comparison code COMP.  Return the same value returned by
2808    compare_range_with_value.  */
2809
2810 static tree
2811 compare_name_with_value (enum tree_code comp, tree var, tree val)
2812 {
2813   bitmap_iterator bi;
2814   unsigned i;
2815   bitmap e;
2816   tree retval, t;
2817   
2818   t = retval = NULL_TREE;
2819
2820   /* Get the set of equivalences for VAR.  */
2821   e = get_value_range (var)->equiv;
2822
2823   /* Add VAR to its own set of equivalences so that VAR's value range
2824      is processed by this loop (otherwise, we would have to replicate
2825      the body of the loop just to check VAR's value range).  */
2826   bitmap_set_bit (e, SSA_NAME_VERSION (var));
2827
2828   EXECUTE_IF_SET_IN_BITMAP (e, 0, i, bi)
2829     {
2830       value_range_t equiv_vr = *(vr_value[i]);
2831
2832       /* If name N_i does not have a valid range, use N_i as its own
2833          range.  This allows us to compare against names that may
2834          have N_i in their ranges.  */
2835       if (equiv_vr.type == VR_VARYING || equiv_vr.type == VR_UNDEFINED)
2836         {
2837           equiv_vr.type = VR_RANGE;
2838           equiv_vr.min = ssa_name (i);
2839           equiv_vr.max = ssa_name (i);
2840         }
2841
2842       t = compare_range_with_value (comp, &equiv_vr, val);
2843       if (t)
2844         {
2845           /* All the ranges should compare the same against VAL.  */
2846           gcc_assert (retval == NULL || t == retval);
2847           retval = t;
2848         }
2849     }
2850
2851   /* Remove VAR from its own equivalence set.  */
2852   bitmap_clear_bit (e, SSA_NAME_VERSION (var));
2853
2854   if (retval)
2855     return retval;
2856
2857   /* We couldn't find a non-NULL value for the predicate.  */
2858   return NULL_TREE;
2859 }
2860
2861
2862 /* Given a comparison code COMP and names N1 and N2, compare all the
2863    ranges equivalent to N1 against all the ranges equivalent to N2
2864    to determine the value of N1 COMP N2.  Return the same value
2865    returned by compare_ranges.  */
2866
2867 static tree
2868 compare_names (enum tree_code comp, tree n1, tree n2)
2869 {
2870   tree t, retval;
2871   bitmap e1, e2;
2872   bitmap_iterator bi1, bi2;
2873   unsigned i1, i2;
2874
2875   /* Compare the ranges of every name equivalent to N1 against the
2876      ranges of every name equivalent to N2.  */
2877   e1 = get_value_range (n1)->equiv;
2878   e2 = get_value_range (n2)->equiv;
2879
2880   /* Add N1 and N2 to their own set of equivalences to avoid
2881      duplicating the body of the loop just to check N1 and N2
2882      ranges.  */
2883   bitmap_set_bit (e1, SSA_NAME_VERSION (n1));
2884   bitmap_set_bit (e2, SSA_NAME_VERSION (n2));
2885
2886   /* If the equivalence sets have a common intersection, then the two
2887      names can be compared without checking their ranges.  */
2888   if (bitmap_intersect_p (e1, e2))
2889     {
2890       bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
2891       bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
2892
2893       return (comp == EQ_EXPR || comp == GE_EXPR || comp == LE_EXPR)
2894              ? boolean_true_node
2895              : boolean_false_node;
2896     }
2897
2898   /* Otherwise, compare all the equivalent ranges.  First, add N1 and
2899      N2 to their own set of equivalences to avoid duplicating the body
2900      of the loop just to check N1 and N2 ranges.  */
2901   EXECUTE_IF_SET_IN_BITMAP (e1, 0, i1, bi1)
2902     {
2903       value_range_t vr1 = *(vr_value[i1]);
2904
2905       /* If the range is VARYING or UNDEFINED, use the name itself.  */
2906       if (vr1.type == VR_VARYING || vr1.type == VR_UNDEFINED)
2907         {
2908           vr1.type = VR_RANGE;
2909           vr1.min = ssa_name (i1);
2910           vr1.max = ssa_name (i1);
2911         }
2912
2913       t = retval = NULL_TREE;
2914       EXECUTE_IF_SET_IN_BITMAP (e2, 0, i2, bi2)
2915         {
2916           value_range_t vr2 = *(vr_value[i2]);
2917
2918           if (vr2.type == VR_VARYING || vr2.type == VR_UNDEFINED)
2919             {
2920               vr2.type = VR_RANGE;
2921               vr2.min = ssa_name (i2);
2922               vr2.max = ssa_name (i2);
2923             }
2924
2925           t = compare_ranges (comp, &vr1, &vr2);
2926           if (t)
2927             {
2928               /* All the ranges in the equivalent sets should compare
2929                  the same.  */
2930               gcc_assert (retval == NULL || t == retval);
2931               retval = t;
2932             }
2933         }
2934
2935       if (retval)
2936         {
2937           bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
2938           bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
2939           return retval;
2940         }
2941     }
2942
2943   /* None of the equivalent ranges are useful in computing this
2944      comparison.  */
2945   bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
2946   bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
2947   return NULL_TREE;
2948 }
2949
2950
2951 /* Given a conditional predicate COND, try to determine if COND yields
2952    true or false based on the value ranges of its operands.  Return
2953    BOOLEAN_TRUE_NODE if the conditional always evaluates to true,
2954    BOOLEAN_FALSE_NODE if the conditional always evaluates to false, and,
2955    NULL if the conditional cannot be evaluated at compile time.
2956
2957    If USE_EQUIV_P is true, the ranges of all the names equivalent with
2958    the operands in COND are used when trying to compute its value.
2959    This is only used during final substitution.  During propagation,
2960    we only check the range of each variable and not its equivalents.  */
2961
2962 tree
2963 vrp_evaluate_conditional (tree cond, bool use_equiv_p)
2964 {
2965   gcc_assert (TREE_CODE (cond) == SSA_NAME
2966               || TREE_CODE_CLASS (TREE_CODE (cond)) == tcc_comparison);
2967
2968   if (TREE_CODE (cond) == SSA_NAME)
2969     {
2970       value_range_t *vr;
2971       tree retval;
2972
2973       if (use_equiv_p)
2974         retval = compare_name_with_value (NE_EXPR, cond, boolean_false_node);
2975       else
2976         {
2977           value_range_t *vr = get_value_range (cond);
2978           retval = compare_range_with_value (NE_EXPR, vr, boolean_false_node);
2979         }
2980
2981       /* If COND has a known boolean range, return it.  */
2982       if (retval)
2983         return retval;
2984
2985       /* Otherwise, if COND has a symbolic range of exactly one value,
2986          return it.  */
2987       vr = get_value_range (cond);
2988       if (vr->type == VR_RANGE && vr->min == vr->max)
2989         return vr->min;
2990     }
2991   else
2992     {
2993       tree op0 = TREE_OPERAND (cond, 0);
2994       tree op1 = TREE_OPERAND (cond, 1);
2995
2996       /* We only deal with integral and pointer types.  */
2997       if (!INTEGRAL_TYPE_P (TREE_TYPE (op0))
2998           && !POINTER_TYPE_P (TREE_TYPE (op0)))
2999         return NULL_TREE;
3000
3001       if (use_equiv_p)
3002         {
3003           if (TREE_CODE (op0) == SSA_NAME && TREE_CODE (op1) == SSA_NAME)
3004             return compare_names (TREE_CODE (cond), op0, op1);
3005           else if (TREE_CODE (op0) == SSA_NAME)
3006             return compare_name_with_value (TREE_CODE (cond), op0, op1);
3007           else if (TREE_CODE (op1) == SSA_NAME)
3008             return compare_name_with_value (
3009                     opposite_comparison (TREE_CODE (cond)), op1, op0);
3010         }
3011       else
3012         {
3013           value_range_t *vr0, *vr1;
3014
3015           vr0 = (TREE_CODE (op0) == SSA_NAME) ? get_value_range (op0) : NULL;
3016           vr1 = (TREE_CODE (op1) == SSA_NAME) ? get_value_range (op1) : NULL;
3017
3018           if (vr0 && vr1)
3019             return compare_ranges (TREE_CODE (cond), vr0, vr1);
3020           else if (vr0 && vr1 == NULL)
3021             return compare_range_with_value (TREE_CODE (cond), vr0, op1);
3022           else if (vr0 == NULL && vr1)
3023             return compare_range_with_value (
3024                     opposite_comparison (TREE_CODE (cond)), vr1, op0);
3025         }
3026     }
3027
3028   /* Anything else cannot be computed statically.  */
3029   return NULL_TREE;
3030 }
3031
3032
3033 /* Visit conditional statement STMT.  If we can determine which edge
3034    will be taken out of STMT's basic block, record it in
3035    *TAKEN_EDGE_P and return SSA_PROP_INTERESTING.  Otherwise, return
3036    SSA_PROP_VARYING.  */
3037
3038 static enum ssa_prop_result
3039 vrp_visit_cond_stmt (tree stmt, edge *taken_edge_p)
3040 {
3041   tree cond, val;
3042
3043   *taken_edge_p = NULL;
3044
3045   /* FIXME.  Handle SWITCH_EXPRs.  But first, the assert pass needs to
3046      add ASSERT_EXPRs for them.  */
3047   if (TREE_CODE (stmt) == SWITCH_EXPR)
3048     return SSA_PROP_VARYING;
3049
3050   cond = COND_EXPR_COND (stmt);
3051
3052   if (dump_file && (dump_flags & TDF_DETAILS))
3053     {
3054       tree use;
3055       ssa_op_iter i;
3056
3057       fprintf (dump_file, "\nVisiting conditional with predicate: ");
3058       print_generic_expr (dump_file, cond, 0);
3059       fprintf (dump_file, "\nWith known ranges\n");
3060       
3061       FOR_EACH_SSA_TREE_OPERAND (use, stmt, i, SSA_OP_USE)
3062         {
3063           fprintf (dump_file, "\t");
3064           print_generic_expr (dump_file, use, 0);
3065           fprintf (dump_file, ": ");
3066           dump_value_range (dump_file, vr_value[SSA_NAME_VERSION (use)]);
3067         }
3068
3069       fprintf (dump_file, "\n");
3070     }
3071
3072   /* Compute the value of the predicate COND by checking the known
3073      ranges of each of its operands.
3074      
3075      Note that we cannot evaluate all the equivalent ranges here
3076      because those ranges may not yet be final and with the current
3077      propagation strategy, we cannot determine when the value ranges
3078      of the names in the equivalence set have changed.
3079
3080      For instance, given the following code fragment
3081
3082         i_5 = PHI <8, i_13>
3083         ...
3084         i_14 = ASSERT_EXPR <i_5, i_5 != 0>
3085         if (i_14 == 1)
3086           ...
3087
3088      Assume that on the first visit to i_14, i_5 has the temporary
3089      range [8, 8] because the second argument to the PHI function is
3090      not yet executable.  We derive the range ~[0, 0] for i_14 and the
3091      equivalence set { i_5 }.  So, when we visit 'if (i_14 == 1)' for
3092      the first time, since i_14 is equivalent to the range [8, 8], we
3093      determine that the predicate is always false.
3094
3095      On the next round of propagation, i_13 is determined to be
3096      VARYING, which causes i_5 to drop down to VARYING.  So, another
3097      visit to i_14 is scheduled.  In this second visit, we compute the
3098      exact same range and equivalence set for i_14, namely ~[0, 0] and
3099      { i_5 }.  But we did not have the previous range for i_5
3100      registered, so vrp_visit_assignment thinks that the range for
3101      i_14 has not changed.  Therefore, the predicate 'if (i_14 == 1)'
3102      is not visited again, which stops propagation from visiting
3103      statements in the THEN clause of that if().
3104
3105      To properly fix this we would need to keep the previous range
3106      value for the names in the equivalence set.  This way we would've
3107      discovered that from one visit to the other i_5 changed from
3108      range [8, 8] to VR_VARYING.
3109
3110      However, fixing this apparent limitation may not be worth the
3111      additional checking.  Testing on several code bases (GCC, DLV,
3112      MICO, TRAMP3D and SPEC2000) showed that doing this results in
3113      4 more predicates folded in SPEC.  */
3114   val = vrp_evaluate_conditional (cond, false);
3115   if (val)
3116     *taken_edge_p = find_taken_edge (bb_for_stmt (stmt), val);
3117
3118   if (dump_file && (dump_flags & TDF_DETAILS))
3119     {
3120       fprintf (dump_file, "\nPredicate evaluates to: ");
3121       if (val == NULL_TREE)
3122         fprintf (dump_file, "DON'T KNOW\n");
3123       else
3124         print_generic_stmt (dump_file, val, 0);
3125     }
3126
3127   return (*taken_edge_p) ? SSA_PROP_INTERESTING : SSA_PROP_VARYING;
3128 }
3129
3130
3131 /* Evaluate statement STMT.  If the statement produces a useful range,
3132    return SSA_PROP_INTERESTING and record the SSA name with the
3133    interesting range into *OUTPUT_P.
3134
3135    If STMT is a conditional branch and we can determine its truth
3136    value, the taken edge is recorded in *TAKEN_EDGE_P.
3137
3138    If STMT produces a varying value, return SSA_PROP_VARYING.  */
3139
3140 static enum ssa_prop_result
3141 vrp_visit_stmt (tree stmt, edge *taken_edge_p, tree *output_p)
3142 {
3143   tree def;
3144   ssa_op_iter iter;
3145   stmt_ann_t ann;
3146
3147   if (dump_file && (dump_flags & TDF_DETAILS))
3148     {
3149       fprintf (dump_file, "\nVisiting statement:\n");
3150       print_generic_stmt (dump_file, stmt, dump_flags);
3151       fprintf (dump_file, "\n");
3152     }
3153
3154   ann = stmt_ann (stmt);
3155   if (TREE_CODE (stmt) == MODIFY_EXPR
3156       && ZERO_SSA_OPERANDS (stmt, SSA_OP_ALL_VIRTUALS))
3157     return vrp_visit_assignment (stmt, output_p);
3158   else if (TREE_CODE (stmt) == COND_EXPR || TREE_CODE (stmt) == SWITCH_EXPR)
3159     return vrp_visit_cond_stmt (stmt, taken_edge_p);
3160
3161   /* All other statements produce nothing of interest for VRP, so mark
3162      their outputs varying and prevent further simulation.  */
3163   FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF)
3164     set_value_range_to_varying (get_value_range (def));
3165
3166   return SSA_PROP_VARYING;
3167 }
3168
3169
3170 /* Meet operation for value ranges.  Given two value ranges VR0 and
3171    VR1, store in VR0 the result of meeting VR0 and VR1.
3172    
3173    The meeting rules are as follows:
3174
3175    1- If VR0 and VR1 have an empty intersection, set VR0 to VR_VARYING.
3176
3177    2- If VR0 and VR1 have a non-empty intersection, set VR0 to the
3178       union of VR0 and VR1.  */
3179
3180 static void
3181 vrp_meet (value_range_t *vr0, value_range_t *vr1)
3182 {
3183   if (vr0->type == VR_UNDEFINED)
3184     {
3185       copy_value_range (vr0, vr1);
3186       return;
3187     }
3188
3189   if (vr1->type == VR_UNDEFINED)
3190     {
3191       /* Nothing to do.  VR0 already has the resulting range.  */
3192       return;
3193     }
3194
3195   if (vr0->type == VR_VARYING)
3196     {
3197       /* Nothing to do.  VR0 already has the resulting range.  */
3198       return;
3199     }
3200
3201   if (vr1->type == VR_VARYING)
3202     {
3203       set_value_range_to_varying (vr0);
3204       return;
3205     }
3206
3207   if (vr0->type == VR_RANGE && vr1->type == VR_RANGE)
3208     {
3209       /* If VR0 and VR1 have a non-empty intersection, compute the
3210          union of both ranges.  */
3211       if (value_ranges_intersect_p (vr0, vr1))
3212         {
3213           int cmp;
3214           tree min, max;
3215
3216           /* The lower limit of the new range is the minimum of the
3217              two ranges.  If they cannot be compared, the result is
3218              VARYING.  */
3219           cmp = compare_values (vr0->min, vr1->min);
3220           if (cmp == 0 || cmp == 1)
3221             min = vr1->min;
3222           else if (cmp == -1)
3223             min = vr0->min;
3224           else
3225             {
3226               set_value_range_to_varying (vr0);
3227               return;
3228             }
3229
3230           /* Similarly, the upper limit of the new range is the
3231              maximum of the two ranges.  If they cannot be compared,
3232              the result is VARYING.  */
3233           cmp = compare_values (vr0->max, vr1->max);
3234           if (cmp == 0 || cmp == -1)
3235             max = vr1->max;
3236           else if (cmp == 1)
3237             max = vr0->max;
3238           else
3239             {
3240               set_value_range_to_varying (vr0);
3241               return;
3242             }
3243
3244           /* The resulting set of equivalences is the intersection of
3245              the two sets.  */
3246           if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
3247             bitmap_and_into (vr0->equiv, vr1->equiv);
3248
3249           set_value_range (vr0, vr0->type, min, max, vr0->equiv);
3250         }
3251       else
3252         goto no_meet;
3253     }
3254   else if (vr0->type == VR_ANTI_RANGE && vr1->type == VR_ANTI_RANGE)
3255     {
3256       /* Two anti-ranges meet only if they are both identical.  */
3257       if (compare_values (vr0->min, vr1->min) == 0
3258           && compare_values (vr0->max, vr1->max) == 0
3259           && compare_values (vr0->min, vr0->max) == 0)
3260         {
3261           /* The resulting set of equivalences is the intersection of
3262              the two sets.  */
3263           if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
3264             bitmap_and_into (vr0->equiv, vr1->equiv);
3265         }
3266       else
3267         goto no_meet;
3268     }
3269   else if (vr0->type == VR_ANTI_RANGE || vr1->type == VR_ANTI_RANGE)
3270     {
3271       /* A numeric range [VAL1, VAL2] and an anti-range ~[VAL3, VAL4]
3272          meet only if the ranges have an empty intersection.  The
3273          result of the meet operation is the anti-range.  */
3274       if (!symbolic_range_p (vr0)
3275           && !symbolic_range_p (vr1)
3276           && !value_ranges_intersect_p (vr0, vr1))
3277         {
3278           if (vr1->type == VR_ANTI_RANGE)
3279             copy_value_range (vr0, vr1);
3280         }
3281       else
3282         goto no_meet;
3283     }
3284   else
3285     gcc_unreachable ();
3286
3287   return;
3288
3289 no_meet:
3290   /* The two range VR0 and VR1 do not meet.  Before giving up and
3291      setting the result to VARYING, see if we can at least derive a
3292      useful anti-range.  */
3293   if (!symbolic_range_p (vr0)
3294       && !range_includes_zero_p (vr0)
3295       && !symbolic_range_p (vr1)
3296       && !range_includes_zero_p (vr1))
3297     set_value_range_to_nonnull (vr0, TREE_TYPE (vr0->min));
3298   else
3299     set_value_range_to_varying (vr0);
3300 }
3301
3302
3303 /* Visit all arguments for PHI node PHI that flow through executable
3304    edges.  If a valid value range can be derived from all the incoming
3305    value ranges, set a new range for the LHS of PHI.  */
3306
3307 static enum ssa_prop_result
3308 vrp_visit_phi_node (tree phi)
3309 {
3310   int i;
3311   tree lhs = PHI_RESULT (phi);
3312   value_range_t *lhs_vr = get_value_range (lhs);
3313   value_range_t vr_result = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
3314
3315   copy_value_range (&vr_result, lhs_vr);
3316
3317   if (dump_file && (dump_flags & TDF_DETAILS))
3318     {
3319       fprintf (dump_file, "\nVisiting PHI node: ");
3320       print_generic_expr (dump_file, phi, dump_flags);
3321     }
3322
3323   for (i = 0; i < PHI_NUM_ARGS (phi); i++)
3324     {
3325       edge e = PHI_ARG_EDGE (phi, i);
3326
3327       if (dump_file && (dump_flags & TDF_DETAILS))
3328         {
3329           fprintf (dump_file,
3330               "\n    Argument #%d (%d -> %d %sexecutable)\n",
3331               i, e->src->index, e->dest->index,
3332               (e->flags & EDGE_EXECUTABLE) ? "" : "not ");
3333         }
3334
3335       if (e->flags & EDGE_EXECUTABLE)
3336         {
3337           tree arg = PHI_ARG_DEF (phi, i);
3338           value_range_t vr_arg;
3339
3340           if (TREE_CODE (arg) == SSA_NAME)
3341             vr_arg = *(get_value_range (arg));
3342           else
3343             {
3344               vr_arg.type = VR_RANGE;
3345               vr_arg.min = arg;
3346               vr_arg.max = arg;
3347               vr_arg.equiv = NULL;
3348             }
3349
3350           if (dump_file && (dump_flags & TDF_DETAILS))
3351             {
3352               fprintf (dump_file, "\t");
3353               print_generic_expr (dump_file, arg, dump_flags);
3354               fprintf (dump_file, "\n\tValue: ");
3355               dump_value_range (dump_file, &vr_arg);
3356               fprintf (dump_file, "\n");
3357             }
3358
3359           vrp_meet (&vr_result, &vr_arg);
3360
3361           if (vr_result.type == VR_VARYING)
3362             break;
3363         }
3364     }
3365
3366   if (vr_result.type == VR_VARYING)
3367     goto varying;
3368
3369   /* To prevent infinite iterations in the algorithm, derive ranges
3370      when the new value is slightly bigger or smaller than the
3371      previous one.  */
3372   if (lhs_vr->type == VR_RANGE)
3373     {
3374       if (!POINTER_TYPE_P (TREE_TYPE (lhs)))
3375         {
3376           int cmp_min = compare_values (lhs_vr->min, vr_result.min);
3377           int cmp_max = compare_values (lhs_vr->max, vr_result.max);
3378
3379           /* If the new minimum is smaller or larger than the previous
3380              one, go all the way to -INF.  In the first case, to avoid
3381              iterating millions of times to reach -INF, and in the
3382              other case to avoid infinite bouncing between different
3383              minimums.  */
3384           if (cmp_min > 0 || cmp_min < 0)
3385             vr_result.min = TYPE_MIN_VALUE (TREE_TYPE (vr_result.min));
3386
3387           /* Similarly, if the new maximum is smaller or larger than
3388              the previous one, go all the way to +INF.  */
3389           if (cmp_max < 0 || cmp_max > 0)
3390             vr_result.max = TYPE_MAX_VALUE (TREE_TYPE (vr_result.max));
3391
3392           /* If we ended up with a (-INF, +INF) range, set it to
3393              VARYING.  */
3394           if (vr_result.min == TYPE_MIN_VALUE (TREE_TYPE (vr_result.min))
3395               && vr_result.max == TYPE_MAX_VALUE (TREE_TYPE (vr_result.max)))
3396             goto varying;
3397         }
3398     }
3399
3400   /* If the new range is different than the previous value, keep
3401      iterating.  */
3402   if (update_value_range (lhs, &vr_result))
3403     return SSA_PROP_INTERESTING;
3404
3405   /* Nothing changed, don't add outgoing edges.  */
3406   return SSA_PROP_NOT_INTERESTING;
3407
3408   /* No match found.  Set the LHS to VARYING.  */
3409 varying:
3410   set_value_range_to_varying (lhs_vr);
3411   return SSA_PROP_VARYING;
3412 }
3413
3414 /* Walk through the IL simplifying expressions using knowledge
3415    gathered by VRP.  */
3416
3417 static void
3418 simplify_using_ranges (void)
3419 {
3420   basic_block bb;
3421
3422   FOR_EACH_BB (bb)
3423     {
3424       block_stmt_iterator bsi;
3425
3426       for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
3427         {
3428           tree stmt = bsi_stmt (bsi);
3429
3430           if (TREE_CODE (stmt) == MODIFY_EXPR)
3431             {
3432               tree rhs = TREE_OPERAND (stmt, 1);
3433               enum tree_code rhs_code = TREE_CODE (rhs);
3434
3435               /* Transform TRUNC_DIV_EXPR and TRUNC_MOD_EXPR into RSHIFT_EXPR
3436                  and BIT_AND_EXPR respectively if the first operand is greater
3437                  than zero and the second operand is an exact power of two.  */
3438               if ((rhs_code == TRUNC_DIV_EXPR || rhs_code == TRUNC_MOD_EXPR)
3439                   && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (rhs, 0)))
3440                   && integer_pow2p (TREE_OPERAND (rhs, 1)))
3441                 {
3442                   tree val = NULL;
3443                   tree op = TREE_OPERAND (rhs, 0);
3444                   value_range_t *vr = get_value_range (TREE_OPERAND (rhs, 0));
3445
3446                   if (TYPE_UNSIGNED (TREE_TYPE (op)))
3447                     {
3448                       val = integer_one_node;
3449                     }
3450                   else
3451                     {
3452                       val = compare_range_with_value (GT_EXPR, vr,
3453                                                       integer_zero_node);
3454                     }
3455
3456                   if (val && integer_onep (val))
3457                     {
3458                       tree t;
3459                       tree op0 = TREE_OPERAND (rhs, 0);
3460                       tree op1 = TREE_OPERAND (rhs, 1);
3461
3462                       if (rhs_code == TRUNC_DIV_EXPR)
3463                         {
3464                           t = build_int_cst (NULL_TREE, tree_log2 (op1));
3465                           t = build (RSHIFT_EXPR, TREE_TYPE (op0), op0, t);
3466                         }
3467                       else
3468                         {
3469                           t = build_int_cst (TREE_TYPE (op1), 1);
3470                           t = int_const_binop (MINUS_EXPR, op1, t, 0);
3471                           t = fold_convert (TREE_TYPE (op0), t);
3472                           t = build2 (BIT_AND_EXPR, TREE_TYPE (op0), op0, t);
3473                         }
3474
3475                       TREE_OPERAND (stmt, 1) = t;
3476                       update_stmt (stmt);
3477                     }
3478
3479                 }
3480
3481               /* Transform ABS (X) into X or -X as appropriate.  */
3482               if (rhs_code == ABS_EXPR
3483                   && TREE_CODE (TREE_OPERAND (rhs, 0)) == SSA_NAME
3484                   && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (rhs, 0))))
3485                 {
3486                   tree val = NULL;
3487                   tree op = TREE_OPERAND (rhs, 0);
3488                   tree type = TREE_TYPE (op);
3489                   value_range_t *vr = get_value_range (TREE_OPERAND (rhs, 0));
3490
3491                   if (TYPE_UNSIGNED (type))
3492                     {
3493                       val = integer_zero_node;
3494                     }
3495                   else if (vr)
3496                     {
3497                       val = compare_range_with_value (LE_EXPR, vr,
3498                                                       integer_zero_node);
3499                       if (!val)
3500                         {
3501                           val = compare_range_with_value (GE_EXPR, vr,
3502                                                           integer_zero_node);
3503
3504                           if (val)
3505                             {
3506                               if (integer_zerop (val))
3507                                 val = integer_one_node;
3508                               else if (integer_onep (val))
3509                                 val = integer_zero_node;
3510                             }
3511                         }
3512
3513                       if (val
3514                           && (integer_onep (val) || integer_zerop (val)))
3515                         {
3516                           tree t;
3517
3518                           if (integer_onep (val))
3519                             t = build1 (NEGATE_EXPR, TREE_TYPE (op), op);
3520                           else
3521                             t = op;
3522
3523                           TREE_OPERAND (stmt, 1) = t;
3524                           update_stmt (stmt);
3525                         }
3526                     }
3527                 }
3528             }
3529
3530           /* TODO.  Simplify conditionals.   */
3531         }
3532     }
3533 }
3534
3535
3536 /* Traverse all the blocks folding conditionals with known ranges.  */
3537
3538 static void
3539 vrp_finalize (void)
3540 {
3541   size_t i;
3542   prop_value_t *single_val_range;
3543   bool do_value_subst_p;
3544
3545   if (dump_file)
3546     {
3547       fprintf (dump_file, "\nValue ranges after VRP:\n\n");
3548       dump_all_value_ranges (dump_file);
3549       fprintf (dump_file, "\n");
3550     }
3551
3552   /* We may have ended with ranges that have exactly one value.  Those
3553      values can be substituted as any other copy/const propagated
3554      value using substitute_and_fold.  */
3555   single_val_range = xmalloc (num_ssa_names * sizeof (*single_val_range));
3556   memset (single_val_range, 0, num_ssa_names * sizeof (*single_val_range));
3557
3558   do_value_subst_p = false;
3559   for (i = 0; i < num_ssa_names; i++)
3560     if (vr_value[i]
3561         && vr_value[i]->type == VR_RANGE
3562         && vr_value[i]->min == vr_value[i]->max)
3563       {
3564         single_val_range[i].value = vr_value[i]->min;
3565         do_value_subst_p = true;
3566       }
3567
3568   if (!do_value_subst_p)
3569     {
3570       /* We found no single-valued ranges, don't waste time trying to
3571          do single value substitution in substitute_and_fold.  */
3572       free (single_val_range);
3573       single_val_range = NULL;
3574     }
3575
3576   substitute_and_fold (single_val_range, true);
3577
3578   /* One could argue all simplifications should be done here
3579      rather than using substitute_and_fold since this code
3580      is going to have to perform a complete walk through the
3581      IL anyway.  */
3582   simplify_using_ranges ();
3583
3584   /* Free allocated memory.  */
3585   for (i = 0; i < num_ssa_names; i++)
3586     if (vr_value[i])
3587       {
3588         BITMAP_FREE (vr_value[i]->equiv);
3589         free (vr_value[i]);
3590       }
3591
3592   free (single_val_range);
3593   free (vr_value);
3594 }
3595
3596
3597 /* Main entry point to VRP (Value Range Propagation).  This pass is
3598    loosely based on J. R. C. Patterson, ``Accurate Static Branch
3599    Prediction by Value Range Propagation,'' in SIGPLAN Conference on
3600    Programming Language Design and Implementation, pp. 67-78, 1995.
3601    Also available at http://citeseer.ist.psu.edu/patterson95accurate.html
3602
3603    This is essentially an SSA-CCP pass modified to deal with ranges
3604    instead of constants.
3605
3606    While propagating ranges, we may find that two or more SSA name
3607    have equivalent, though distinct ranges.  For instance,
3608
3609      1  x_9 = p_3->a;
3610      2  p_4 = ASSERT_EXPR <p_3, p_3 != 0>
3611      3  if (p_4 == q_2)
3612      4    p_5 = ASSERT_EXPR <p_4, p_4 == q_2>;
3613      5  endif
3614      6  if (q_2)
3615         
3616    In the code above, pointer p_5 has range [q_2, q_2], but from the
3617    code we can also determine that p_5 cannot be NULL and, if q_2 had
3618    a non-varying range, p_5's range should also be compatible with it.
3619
3620    These equivalences are created by two expressions: ASSERT_EXPR and
3621    copy operations.  Since p_5 is an assertion on p_4, and p_4 was the
3622    result of another assertion, then we can use the fact that p_5 and
3623    p_4 are equivalent when evaluating p_5's range.
3624
3625    Together with value ranges, we also propagate these equivalences
3626    between names so that we can take advantage of information from
3627    multiple ranges when doing final replacement.  Note that this
3628    equivalency relation is transitive but not symmetric.
3629    
3630    In the example above, p_5 is equivalent to p_4, q_2 and p_3, but we
3631    cannot assert that q_2 is equivalent to p_5 because q_2 may be used
3632    in contexts where that assertion does not hold (e.g., in line 6).
3633
3634    TODO, the main difference between this pass and Patterson's is that
3635    we do not propagate edge probabilities.  We only compute whether
3636    edges can be taken or not.  That is, instead of having a spectrum
3637    of jump probabilities between 0 and 1, we only deal with 0, 1 and
3638    DON'T KNOW.  In the future, it may be worthwhile to propagate
3639    probabilities to aid branch prediction.  */
3640
3641 static void
3642 execute_vrp (void)
3643 {
3644   insert_range_assertions ();
3645
3646   cfg_loops = loop_optimizer_init (NULL);
3647   if (cfg_loops)
3648     scev_initialize (cfg_loops);
3649
3650   vrp_initialize ();
3651   ssa_propagate (vrp_visit_stmt, vrp_visit_phi_node);
3652   vrp_finalize ();
3653
3654   if (cfg_loops)
3655     {
3656       scev_finalize ();
3657       loop_optimizer_finalize (cfg_loops, NULL);
3658       current_loops = NULL;
3659     }
3660
3661   remove_range_assertions ();
3662 }
3663
3664 static bool
3665 gate_vrp (void)
3666 {
3667   return flag_tree_vrp != 0;
3668 }
3669
3670 struct tree_opt_pass pass_vrp =
3671 {
3672   "vrp",                                /* name */
3673   gate_vrp,                             /* gate */
3674   execute_vrp,                          /* execute */
3675   NULL,                                 /* sub */
3676   NULL,                                 /* next */
3677   0,                                    /* static_pass_number */
3678   TV_TREE_VRP,                          /* tv_id */
3679   PROP_ssa | PROP_alias,                /* properties_required */
3680   0,                                    /* properties_provided */
3681   0,                                    /* properties_destroyed */
3682   0,                                    /* todo_flags_start */
3683   TODO_cleanup_cfg
3684     | TODO_ggc_collect
3685     | TODO_verify_ssa
3686     | TODO_dump_func
3687     | TODO_update_ssa,                  /* todo_flags_finish */
3688   0                                     /* letter */
3689 };