OSDN Git Service

* stor-layout.c (mode_for_size_tree): Remove restiction on type
[pf3gnuchains/gcc-fork.git] / gcc / tree-vrp.c
1 /* Support routines for Value Range Propagation (VRP).
2    Copyright (C) 2005, 2006 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, 51 Franklin Street, Fifth Floor,
20 Boston, MA 02110-1301, 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 /* Local functions.  */
45 static int compare_values (tree val1, tree val2);
46
47 /* Location information for ASSERT_EXPRs.  Each instance of this
48    structure describes an ASSERT_EXPR for an SSA name.  Since a single
49    SSA name may have more than one assertion associated with it, these
50    locations are kept in a linked list attached to the corresponding
51    SSA name.  */
52 struct assert_locus_d
53 {
54   /* Basic block where the assertion would be inserted.  */
55   basic_block bb;
56
57   /* Some assertions need to be inserted on an edge (e.g., assertions
58      generated by COND_EXPRs).  In those cases, BB will be NULL.  */
59   edge e;
60
61   /* Pointer to the statement that generated this assertion.  */
62   block_stmt_iterator si;
63
64   /* Predicate code for the ASSERT_EXPR.  Must be COMPARISON_CLASS_P.  */
65   enum tree_code comp_code;
66
67   /* Value being compared against.  */
68   tree val;
69
70   /* Next node in the linked list.  */
71   struct assert_locus_d *next;
72 };
73
74 typedef struct assert_locus_d *assert_locus_t;
75
76 /* If bit I is present, it means that SSA name N_i has a list of
77    assertions that should be inserted in the IL.  */
78 static bitmap need_assert_for;
79
80 /* Array of locations lists where to insert assertions.  ASSERTS_FOR[I]
81    holds a list of ASSERT_LOCUS_T nodes that describe where
82    ASSERT_EXPRs for SSA name N_I should be inserted.  */
83 static assert_locus_t *asserts_for;
84
85 /* Set of blocks visited in find_assert_locations.  Used to avoid
86    visiting the same block more than once.  */
87 static sbitmap blocks_visited;
88
89 /* Value range array.  After propagation, VR_VALUE[I] holds the range
90    of values that SSA name N_I may take.  */
91 static value_range_t **vr_value;
92
93
94 /* Return true if ARG is marked with the nonnull attribute in the
95    current function signature.  */
96
97 static bool
98 nonnull_arg_p (tree arg)
99 {
100   tree t, attrs, fntype;
101   unsigned HOST_WIDE_INT arg_num;
102
103   gcc_assert (TREE_CODE (arg) == PARM_DECL && POINTER_TYPE_P (TREE_TYPE (arg)));
104
105   fntype = TREE_TYPE (current_function_decl);
106   attrs = lookup_attribute ("nonnull", TYPE_ATTRIBUTES (fntype));
107
108   /* If "nonnull" wasn't specified, we know nothing about the argument.  */
109   if (attrs == NULL_TREE)
110     return false;
111
112   /* If "nonnull" applies to all the arguments, then ARG is non-null.  */
113   if (TREE_VALUE (attrs) == NULL_TREE)
114     return true;
115
116   /* Get the position number for ARG in the function signature.  */
117   for (arg_num = 1, t = DECL_ARGUMENTS (current_function_decl);
118        t;
119        t = TREE_CHAIN (t), arg_num++)
120     {
121       if (t == arg)
122         break;
123     }
124
125   gcc_assert (t == arg);
126
127   /* Now see if ARG_NUM is mentioned in the nonnull list.  */
128   for (t = TREE_VALUE (attrs); t; t = TREE_CHAIN (t))
129     {
130       if (compare_tree_int (TREE_VALUE (t), arg_num) == 0)
131         return true;
132     }
133
134   return false;
135 }
136
137
138 /* Set value range VR to {T, MIN, MAX, EQUIV}.  */
139
140 static void
141 set_value_range (value_range_t *vr, enum value_range_type t, tree min,
142                  tree max, bitmap equiv)
143 {
144 #if defined ENABLE_CHECKING
145   /* Check the validity of the range.  */
146   if (t == VR_RANGE || t == VR_ANTI_RANGE)
147     {
148       int cmp;
149
150       gcc_assert (min && max);
151
152       if (INTEGRAL_TYPE_P (TREE_TYPE (min)) && t == VR_ANTI_RANGE)
153         gcc_assert (min != TYPE_MIN_VALUE (TREE_TYPE (min))
154                     || max != TYPE_MAX_VALUE (TREE_TYPE (max)));
155
156       cmp = compare_values (min, max);
157       gcc_assert (cmp == 0 || cmp == -1 || cmp == -2);
158     }
159
160   if (t == VR_UNDEFINED || t == VR_VARYING)
161     gcc_assert (min == NULL_TREE && max == NULL_TREE);
162
163   if (t == VR_UNDEFINED || t == VR_VARYING)
164     gcc_assert (equiv == NULL || bitmap_empty_p (equiv));
165 #endif
166
167   vr->type = t;
168   vr->min = min;
169   vr->max = max;
170
171   /* Since updating the equivalence set involves deep copying the
172      bitmaps, only do it if absolutely necessary.  */
173   if (vr->equiv == NULL)
174     vr->equiv = BITMAP_ALLOC (NULL);
175
176   if (equiv != vr->equiv)
177     {
178       if (equiv && !bitmap_empty_p (equiv))
179         bitmap_copy (vr->equiv, equiv);
180       else
181         bitmap_clear (vr->equiv);
182     }
183 }
184
185
186 /* Copy value range FROM into value range TO.  */
187
188 static inline void
189 copy_value_range (value_range_t *to, value_range_t *from)
190 {
191   set_value_range (to, from->type, from->min, from->max, from->equiv);
192 }
193
194 /* Set value range VR to a non-negative range of type TYPE.  */
195
196 static inline void
197 set_value_range_to_nonnegative (value_range_t *vr, tree type)
198 {
199   tree zero = build_int_cst (type, 0);
200   set_value_range (vr, VR_RANGE, zero, TYPE_MAX_VALUE (type), vr->equiv);
201 }
202
203 /* Set value range VR to a non-NULL range of type TYPE.  */
204
205 static inline void
206 set_value_range_to_nonnull (value_range_t *vr, tree type)
207 {
208   tree zero = build_int_cst (type, 0);
209   set_value_range (vr, VR_ANTI_RANGE, zero, zero, vr->equiv);
210 }
211
212
213 /* Set value range VR to a NULL range of type TYPE.  */
214
215 static inline void
216 set_value_range_to_null (value_range_t *vr, tree type)
217 {
218   tree zero = build_int_cst (type, 0);
219   set_value_range (vr, VR_RANGE, zero, zero, vr->equiv);
220 }
221
222
223 /* Set value range VR to VR_VARYING.  */
224
225 static inline void
226 set_value_range_to_varying (value_range_t *vr)
227 {
228   vr->type = VR_VARYING;
229   vr->min = vr->max = NULL_TREE;
230   if (vr->equiv)
231     bitmap_clear (vr->equiv);
232 }
233
234
235 /* Set value range VR to VR_UNDEFINED.  */
236
237 static inline void
238 set_value_range_to_undefined (value_range_t *vr)
239 {
240   vr->type = VR_UNDEFINED;
241   vr->min = vr->max = NULL_TREE;
242   if (vr->equiv)
243     bitmap_clear (vr->equiv);
244 }
245
246
247 /* Return value range information for VAR.  
248
249    If we have no values ranges recorded (ie, VRP is not running), then
250    return NULL.  Otherwise create an empty range if none existed for VAR.  */
251
252 static value_range_t *
253 get_value_range (tree var)
254 {
255   value_range_t *vr;
256   tree sym;
257   unsigned ver = SSA_NAME_VERSION (var);
258
259   /* If we have no recorded ranges, then return NULL.  */
260   if (! vr_value)
261     return NULL;
262
263   vr = vr_value[ver];
264   if (vr)
265     return vr;
266
267   /* Create a default value range.  */
268   vr_value[ver] = vr = XNEW (value_range_t);
269   memset (vr, 0, sizeof (*vr));
270
271   /* Allocate an equivalence set.  */
272   vr->equiv = BITMAP_ALLOC (NULL);
273
274   /* If VAR is a default definition, the variable can take any value
275      in VAR's type.  */
276   sym = SSA_NAME_VAR (var);
277   if (var == default_def (sym))
278     {
279       /* Try to use the "nonnull" attribute to create ~[0, 0]
280          anti-ranges for pointers.  Note that this is only valid with
281          default definitions of PARM_DECLs.  */
282       if (TREE_CODE (sym) == PARM_DECL
283           && POINTER_TYPE_P (TREE_TYPE (sym))
284           && nonnull_arg_p (sym))
285         set_value_range_to_nonnull (vr, TREE_TYPE (sym));
286       else
287         set_value_range_to_varying (vr);
288     }
289
290   return vr;
291 }
292
293
294 /* Update the value range and equivalence set for variable VAR to
295    NEW_VR.  Return true if NEW_VR is different from VAR's previous
296    value.
297
298    NOTE: This function assumes that NEW_VR is a temporary value range
299    object created for the sole purpose of updating VAR's range.  The
300    storage used by the equivalence set from NEW_VR will be freed by
301    this function.  Do not call update_value_range when NEW_VR
302    is the range object associated with another SSA name.  */
303
304 static inline bool
305 update_value_range (tree var, value_range_t *new_vr)
306 {
307   value_range_t *old_vr;
308   bool is_new;
309
310   /* Update the value range, if necessary.  */
311   old_vr = get_value_range (var);
312   is_new = old_vr->type != new_vr->type
313            || old_vr->min != new_vr->min
314            || old_vr->max != new_vr->max
315            || (old_vr->equiv == NULL && new_vr->equiv)
316            || (old_vr->equiv && new_vr->equiv == NULL)
317            || (!bitmap_equal_p (old_vr->equiv, new_vr->equiv));
318
319   if (is_new)
320     set_value_range (old_vr, new_vr->type, new_vr->min, new_vr->max,
321                      new_vr->equiv);
322
323   BITMAP_FREE (new_vr->equiv);
324   new_vr->equiv = NULL;
325
326   return is_new;
327 }
328
329
330 /* Add VAR and VAR's equivalence set to EQUIV.  */
331
332 static void
333 add_equivalence (bitmap equiv, tree var)
334 {
335   unsigned ver = SSA_NAME_VERSION (var);
336   value_range_t *vr = vr_value[ver];
337
338   bitmap_set_bit (equiv, ver);
339   if (vr && vr->equiv)
340     bitmap_ior_into (equiv, vr->equiv);
341 }
342
343
344 /* Return true if VR is ~[0, 0].  */
345
346 static inline bool
347 range_is_nonnull (value_range_t *vr)
348 {
349   return vr->type == VR_ANTI_RANGE
350          && integer_zerop (vr->min)
351          && integer_zerop (vr->max);
352 }
353
354
355 /* Return true if VR is [0, 0].  */
356
357 static inline bool
358 range_is_null (value_range_t *vr)
359 {
360   return vr->type == VR_RANGE
361          && integer_zerop (vr->min)
362          && integer_zerop (vr->max);
363 }
364
365
366 /* Return true if value range VR involves at least one symbol.  */
367
368 static inline bool
369 symbolic_range_p (value_range_t *vr)
370 {
371   return (!is_gimple_min_invariant (vr->min)
372           || !is_gimple_min_invariant (vr->max));
373 }
374
375 /* Like tree_expr_nonnegative_p, but this function uses value ranges
376    obtained so far.  */
377
378 static bool
379 vrp_expr_computes_nonnegative (tree expr)
380 {
381   return tree_expr_nonnegative_p (expr);
382 }
383
384 /* Like tree_expr_nonzero_p, but this function uses value ranges
385    obtained so far.  */
386
387 static bool
388 vrp_expr_computes_nonzero (tree expr)
389 {
390   if (tree_expr_nonzero_p (expr))
391     return true;
392
393   /* If we have an expression of the form &X->a, then the expression
394      is nonnull if X is nonnull.  */
395   if (TREE_CODE (expr) == ADDR_EXPR)
396     {
397       tree base = get_base_address (TREE_OPERAND (expr, 0));
398
399       if (base != NULL_TREE
400           && TREE_CODE (base) == INDIRECT_REF
401           && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME)
402         {
403           value_range_t *vr = get_value_range (TREE_OPERAND (base, 0));
404           if (range_is_nonnull (vr))
405             return true;
406         }
407     }
408
409   return false;
410 }
411
412
413 /* Compare two values VAL1 and VAL2.  Return
414    
415         -2 if VAL1 and VAL2 cannot be compared at compile-time,
416         -1 if VAL1 < VAL2,
417          0 if VAL1 == VAL2,
418         +1 if VAL1 > VAL2, and
419         +2 if VAL1 != VAL2
420
421    This is similar to tree_int_cst_compare but supports pointer values
422    and values that cannot be compared at compile time.  */
423
424 static int
425 compare_values (tree val1, tree val2)
426 {
427   if (val1 == val2)
428     return 0;
429
430   /* Below we rely on the fact that VAL1 and VAL2 are both pointers or
431      both integers.  */
432   gcc_assert (POINTER_TYPE_P (TREE_TYPE (val1))
433               == POINTER_TYPE_P (TREE_TYPE (val2)));
434
435   /* Do some limited symbolic comparisons.  */
436   if (!POINTER_TYPE_P (TREE_TYPE (val1)))
437     {
438       /* We can determine some comparisons against +INF and -INF even
439          if the other value is an expression.  */
440       if (val1 == TYPE_MAX_VALUE (TREE_TYPE (val1))
441           && TREE_CODE (val2) == MINUS_EXPR)
442         {
443           /* +INF > NAME - CST.  */
444           return 1;
445         }
446       else if (val1 == TYPE_MIN_VALUE (TREE_TYPE (val1))
447                && TREE_CODE (val2) == PLUS_EXPR)
448         {
449           /* -INF < NAME + CST.  */
450           return -1;
451         }
452       else if (TREE_CODE (val1) == MINUS_EXPR
453                && val2 == TYPE_MAX_VALUE (TREE_TYPE (val2)))
454         {
455           /* NAME - CST < +INF.  */
456           return -1;
457         }
458       else if (TREE_CODE (val1) == PLUS_EXPR
459                && val2 == TYPE_MIN_VALUE (TREE_TYPE (val2)))
460         {
461           /* NAME + CST > -INF.  */
462           return 1;
463         }
464     }
465
466   if ((TREE_CODE (val1) == SSA_NAME
467        || TREE_CODE (val1) == PLUS_EXPR
468        || TREE_CODE (val1) == MINUS_EXPR)
469       && (TREE_CODE (val2) == SSA_NAME
470           || TREE_CODE (val2) == PLUS_EXPR
471           || TREE_CODE (val2) == MINUS_EXPR))
472     {
473       tree n1, c1, n2, c2;
474   
475       /* If VAL1 and VAL2 are of the form 'NAME [+-] CST' or 'NAME',
476          return -1 or +1 accordingly.  If VAL1 and VAL2 don't use the
477          same name, return -2.  */
478       if (TREE_CODE (val1) == SSA_NAME)
479         {
480           n1 = val1;
481           c1 = NULL_TREE;
482         }
483       else
484         {
485           n1 = TREE_OPERAND (val1, 0);
486           c1 = TREE_OPERAND (val1, 1);
487         }
488
489       if (TREE_CODE (val2) == SSA_NAME)
490         {
491           n2 = val2;
492           c2 = NULL_TREE;
493         }
494       else
495         {
496           n2 = TREE_OPERAND (val2, 0);
497           c2 = TREE_OPERAND (val2, 1);
498         }
499
500       /* Both values must use the same name.  */
501       if (n1 != n2)
502         return -2;
503
504       if (TREE_CODE (val1) == SSA_NAME)
505         {
506           if (TREE_CODE (val2) == SSA_NAME)
507             /* NAME == NAME  */
508             return 0;
509           else if (TREE_CODE (val2) == PLUS_EXPR)
510             /* NAME < NAME + CST  */
511             return -1;
512           else if (TREE_CODE (val2) == MINUS_EXPR)
513             /* NAME > NAME - CST  */
514             return 1;
515         }
516       else if (TREE_CODE (val1) == PLUS_EXPR)
517         {
518           if (TREE_CODE (val2) == SSA_NAME)
519             /* NAME + CST > NAME  */
520             return 1;
521           else if (TREE_CODE (val2) == PLUS_EXPR)
522             /* NAME + CST1 > NAME + CST2, if CST1 > CST2  */
523             return compare_values (c1, c2);
524           else if (TREE_CODE (val2) == MINUS_EXPR)
525             /* NAME + CST1 > NAME - CST2  */
526             return 1;
527         }
528       else if (TREE_CODE (val1) == MINUS_EXPR)
529         {
530           if (TREE_CODE (val2) == SSA_NAME)
531             /* NAME - CST < NAME  */
532             return -1;
533           else if (TREE_CODE (val2) == PLUS_EXPR)
534             /* NAME - CST1 < NAME + CST2  */
535             return -1;
536           else if (TREE_CODE (val2) == MINUS_EXPR)
537             /* NAME - CST1 > NAME - CST2, if CST1 < CST2.  Notice that
538                C1 and C2 are swapped in the call to compare_values.  */
539             return compare_values (c2, c1);
540         }
541
542       gcc_unreachable ();
543     }
544
545   /* We cannot compare non-constants.  */
546   if (!is_gimple_min_invariant (val1) || !is_gimple_min_invariant (val2))
547     return -2;
548
549   if (!POINTER_TYPE_P (TREE_TYPE (val1)))
550     {
551       /* We cannot compare overflowed values.  */
552       if (TREE_OVERFLOW (val1) || TREE_OVERFLOW (val2))
553         return -2;
554
555       return tree_int_cst_compare (val1, val2);
556     }
557   else
558     {
559       tree t;
560
561       /* First see if VAL1 and VAL2 are not the same.  */
562       if (val1 == val2 || operand_equal_p (val1, val2, 0))
563         return 0;
564       
565       /* If VAL1 is a lower address than VAL2, return -1.  */
566       t = fold_binary (LT_EXPR, boolean_type_node, val1, val2);
567       if (t == boolean_true_node)
568         return -1;
569
570       /* If VAL1 is a higher address than VAL2, return +1.  */
571       t = fold_binary (GT_EXPR, boolean_type_node, val1, val2);
572       if (t == boolean_true_node)
573         return 1;
574
575       /* If VAL1 is different than VAL2, return +2.  */
576       t = fold_binary (NE_EXPR, boolean_type_node, val1, val2);
577       if (t == boolean_true_node)
578         return 2;
579
580       return -2;
581     }
582 }
583
584
585 /* Return 1 if VAL is inside value range VR (VR->MIN <= VAL <= VR->MAX),
586           0 if VAL is not inside VR,
587          -2 if we cannot tell either way.
588
589    FIXME, the current semantics of this functions are a bit quirky
590           when taken in the context of VRP.  In here we do not care
591           about VR's type.  If VR is the anti-range ~[3, 5] the call
592           value_inside_range (4, VR) will return 1.
593
594           This is counter-intuitive in a strict sense, but the callers
595           currently expect this.  They are calling the function
596           merely to determine whether VR->MIN <= VAL <= VR->MAX.  The
597           callers are applying the VR_RANGE/VR_ANTI_RANGE semantics
598           themselves.
599
600           This also applies to value_ranges_intersect_p and
601           range_includes_zero_p.  The semantics of VR_RANGE and
602           VR_ANTI_RANGE should be encoded here, but that also means
603           adapting the users of these functions to the new semantics.  */
604
605 static inline int
606 value_inside_range (tree val, value_range_t *vr)
607 {
608   int cmp1, cmp2;
609
610   cmp1 = compare_values (val, vr->min);
611   if (cmp1 == -2 || cmp1 == 2)
612     return -2;
613
614   cmp2 = compare_values (val, vr->max);
615   if (cmp2 == -2 || cmp2 == 2)
616     return -2;
617
618   return (cmp1 == 0 || cmp1 == 1) && (cmp2 == -1 || cmp2 == 0);
619 }
620
621
622 /* Return true if value ranges VR0 and VR1 have a non-empty
623    intersection.  */
624
625 static inline bool
626 value_ranges_intersect_p (value_range_t *vr0, value_range_t *vr1)
627 {
628   return (value_inside_range (vr1->min, vr0) == 1
629           || value_inside_range (vr1->max, vr0) == 1
630           || value_inside_range (vr0->min, vr1) == 1
631           || value_inside_range (vr0->max, vr1) == 1);
632 }
633
634
635 /* Return true if VR includes the value zero, false otherwise.  FIXME,
636    currently this will return false for an anti-range like ~[-4, 3].
637    This will be wrong when the semantics of value_inside_range are
638    modified (currently the users of this function expect these
639    semantics).  */
640
641 static inline bool
642 range_includes_zero_p (value_range_t *vr)
643 {
644   tree zero;
645
646   gcc_assert (vr->type != VR_UNDEFINED
647               && vr->type != VR_VARYING
648               && !symbolic_range_p (vr));
649
650   zero = build_int_cst (TREE_TYPE (vr->min), 0);
651   return (value_inside_range (zero, vr) == 1);
652 }
653
654 /* Return true if T, an SSA_NAME, is known to be nonnegative.  Return
655    false otherwise or if no value range information is available.  */
656
657 bool
658 ssa_name_nonnegative_p (tree t)
659 {
660   value_range_t *vr = get_value_range (t);
661
662   if (!vr)
663     return false;
664
665   /* Testing for VR_ANTI_RANGE is not useful here as any anti-range
666      which would return a useful value should be encoded as a VR_RANGE.  */
667   if (vr->type == VR_RANGE)
668     {
669       int result = compare_values (vr->min, integer_zero_node);
670
671       return (result == 0 || result == 1);
672     }
673   return false;
674 }
675
676 /* Return true if T, an SSA_NAME, is known to be nonzero.  Return
677    false otherwise or if no value range information is available.  */
678
679 bool
680 ssa_name_nonzero_p (tree t)
681 {
682   value_range_t *vr = get_value_range (t);
683
684   if (!vr)
685     return false;
686
687   /* A VR_RANGE which does not include zero is a nonzero value.  */
688   if (vr->type == VR_RANGE && !symbolic_range_p (vr))
689     return ! range_includes_zero_p (vr);
690
691   /* A VR_ANTI_RANGE which does include zero is a nonzero value.  */
692   if (vr->type == VR_ANTI_RANGE && !symbolic_range_p (vr))
693     return range_includes_zero_p (vr);
694
695   return false;
696 }
697
698
699 /* When extracting ranges from X_i = ASSERT_EXPR <Y_j, pred>, we will
700    initially consider X_i and Y_j equivalent, so the equivalence set
701    of Y_j is added to the equivalence set of X_i.  However, it is
702    possible to have a chain of ASSERT_EXPRs whose predicates are
703    actually incompatible.  This is usually the result of nesting of
704    contradictory if-then-else statements.  For instance, in PR 24670:
705
706         count_4 has range [-INF, 63]
707
708         if (count_4 != 0)
709           {
710             count_19 = ASSERT_EXPR <count_4, count_4 != 0>
711             if (count_19 > 63)
712               {
713                 count_18 = ASSERT_EXPR <count_19, count_19 > 63>
714                 if (count_18 <= 63)
715                   ...
716               }
717           }
718
719    Notice that 'if (count_19 > 63)' is trivially false and will be
720    folded out at the end.  However, during propagation, the flowgraph
721    is not cleaned up and so, VRP will evaluate predicates more
722    predicates than necessary, so it must support these
723    inconsistencies.  The problem here is that because of the chaining
724    of ASSERT_EXPRs, the equivalency set for count_18 includes count_4.
725    Since count_4 has an incompatible range, we ICE when evaluating the
726    ranges in the equivalency set.  So, we need to remove count_4 from
727    it.  */
728
729 static void
730 fix_equivalence_set (value_range_t *vr_p)
731 {
732   bitmap_iterator bi;
733   unsigned i;
734   bitmap e = vr_p->equiv;
735   bitmap to_remove = BITMAP_ALLOC (NULL);
736
737   /* Only detect inconsistencies on numeric ranges.  */
738   if (vr_p->type == VR_VARYING
739       || vr_p->type == VR_UNDEFINED
740       || symbolic_range_p (vr_p))
741     return;
742
743   EXECUTE_IF_SET_IN_BITMAP (e, 0, i, bi)
744     {
745       value_range_t *equiv_vr = vr_value[i];
746
747       if (equiv_vr->type == VR_VARYING
748           || equiv_vr->type == VR_UNDEFINED
749           || symbolic_range_p (equiv_vr))
750         continue;
751
752       if (equiv_vr->type == VR_RANGE
753           && vr_p->type == VR_RANGE
754           && !value_ranges_intersect_p (vr_p, equiv_vr))
755         bitmap_set_bit (to_remove, i);
756       else if ((equiv_vr->type == VR_RANGE && vr_p->type == VR_ANTI_RANGE)
757                || (equiv_vr->type == VR_ANTI_RANGE && vr_p->type == VR_RANGE))
758         {
759           /* A range and an anti-range have an empty intersection if
760              their end points are the same.  FIXME,
761              value_ranges_intersect_p should handle this
762              automatically.  */
763           if (compare_values (equiv_vr->min, vr_p->min) == 0
764               && compare_values (equiv_vr->max, vr_p->max) == 0)
765             bitmap_set_bit (to_remove, i);
766         }
767     }
768
769   bitmap_and_compl_into (vr_p->equiv, to_remove);
770   BITMAP_FREE (to_remove);
771 }
772
773
774 /* Extract value range information from an ASSERT_EXPR EXPR and store
775    it in *VR_P.  */
776
777 static void
778 extract_range_from_assert (value_range_t *vr_p, tree expr)
779 {
780   tree var, cond, limit, min, max, type;
781   value_range_t *var_vr, *limit_vr;
782   enum tree_code cond_code;
783
784   var = ASSERT_EXPR_VAR (expr);
785   cond = ASSERT_EXPR_COND (expr);
786
787   gcc_assert (COMPARISON_CLASS_P (cond));
788
789   /* Find VAR in the ASSERT_EXPR conditional.  */
790   if (var == TREE_OPERAND (cond, 0))
791     {
792       /* If the predicate is of the form VAR COMP LIMIT, then we just
793          take LIMIT from the RHS and use the same comparison code.  */
794       limit = TREE_OPERAND (cond, 1);
795       cond_code = TREE_CODE (cond);
796     }
797   else
798     {
799       /* If the predicate is of the form LIMIT COMP VAR, then we need
800          to flip around the comparison code to create the proper range
801          for VAR.  */
802       limit = TREE_OPERAND (cond, 0);
803       cond_code = swap_tree_comparison (TREE_CODE (cond));
804     }
805
806   type = TREE_TYPE (limit);
807   gcc_assert (limit != var);
808
809   /* For pointer arithmetic, we only keep track of pointer equality
810      and inequality.  */
811   if (POINTER_TYPE_P (type) && cond_code != NE_EXPR && cond_code != EQ_EXPR)
812     {
813       set_value_range_to_varying (vr_p);
814       return;
815     }
816
817   /* If LIMIT is another SSA name and LIMIT has a range of its own,
818      try to use LIMIT's range to avoid creating symbolic ranges
819      unnecessarily. */
820   limit_vr = (TREE_CODE (limit) == SSA_NAME) ? get_value_range (limit) : NULL;
821
822   /* LIMIT's range is only interesting if it has any useful information.  */
823   if (limit_vr
824       && (limit_vr->type == VR_UNDEFINED
825           || limit_vr->type == VR_VARYING
826           || symbolic_range_p (limit_vr)))
827     limit_vr = NULL;
828
829   /* Initially, the new range has the same set of equivalences of
830      VAR's range.  This will be revised before returning the final
831      value.  Since assertions may be chained via mutually exclusive
832      predicates, we will need to trim the set of equivalences before
833      we are done.  */
834   gcc_assert (vr_p->equiv == NULL);
835   vr_p->equiv = BITMAP_ALLOC (NULL);
836   add_equivalence (vr_p->equiv, var);
837
838   /* Extract a new range based on the asserted comparison for VAR and
839      LIMIT's value range.  Notice that if LIMIT has an anti-range, we
840      will only use it for equality comparisons (EQ_EXPR).  For any
841      other kind of assertion, we cannot derive a range from LIMIT's
842      anti-range that can be used to describe the new range.  For
843      instance, ASSERT_EXPR <x_2, x_2 <= b_4>.  If b_4 is ~[2, 10],
844      then b_4 takes on the ranges [-INF, 1] and [11, +INF].  There is
845      no single range for x_2 that could describe LE_EXPR, so we might
846      as well build the range [b_4, +INF] for it.  */
847   if (cond_code == EQ_EXPR)
848     {
849       enum value_range_type range_type;
850
851       if (limit_vr)
852         {
853           range_type = limit_vr->type;
854           min = limit_vr->min;
855           max = limit_vr->max;
856         }
857       else
858         {
859           range_type = VR_RANGE;
860           min = limit;
861           max = limit;
862         }
863
864       set_value_range (vr_p, range_type, min, max, vr_p->equiv);
865
866       /* When asserting the equality VAR == LIMIT and LIMIT is another
867          SSA name, the new range will also inherit the equivalence set
868          from LIMIT.  */
869       if (TREE_CODE (limit) == SSA_NAME)
870         add_equivalence (vr_p->equiv, limit);
871     }
872   else if (cond_code == NE_EXPR)
873     {
874       /* As described above, when LIMIT's range is an anti-range and
875          this assertion is an inequality (NE_EXPR), then we cannot
876          derive anything from the anti-range.  For instance, if
877          LIMIT's range was ~[0, 0], the assertion 'VAR != LIMIT' does
878          not imply that VAR's range is [0, 0].  So, in the case of
879          anti-ranges, we just assert the inequality using LIMIT and
880          not its anti-range.
881
882          If LIMIT_VR is a range, we can only use it to build a new
883          anti-range if LIMIT_VR is a single-valued range.  For
884          instance, if LIMIT_VR is [0, 1], the predicate
885          VAR != [0, 1] does not mean that VAR's range is ~[0, 1].
886          Rather, it means that for value 0 VAR should be ~[0, 0]
887          and for value 1, VAR should be ~[1, 1].  We cannot
888          represent these ranges.
889
890          The only situation in which we can build a valid
891          anti-range is when LIMIT_VR is a single-valued range
892          (i.e., LIMIT_VR->MIN == LIMIT_VR->MAX).  In that case, 
893          build the anti-range ~[LIMIT_VR->MIN, LIMIT_VR->MAX].  */
894       if (limit_vr
895           && limit_vr->type == VR_RANGE
896           && compare_values (limit_vr->min, limit_vr->max) == 0)
897         {
898           min = limit_vr->min;
899           max = limit_vr->max;
900         }
901       else
902         {
903           /* In any other case, we cannot use LIMIT's range to build a
904              valid anti-range.  */
905           min = max = limit;
906         }
907
908       /* If MIN and MAX cover the whole range for their type, then
909          just use the original LIMIT.  */
910       if (INTEGRAL_TYPE_P (type)
911           && min == TYPE_MIN_VALUE (type)
912           && max == TYPE_MAX_VALUE (type))
913         min = max = limit;
914
915       set_value_range (vr_p, VR_ANTI_RANGE, min, max, vr_p->equiv);
916     }
917   else if (cond_code == LE_EXPR || cond_code == LT_EXPR)
918     {
919       min = TYPE_MIN_VALUE (type);
920
921       if (limit_vr == NULL || limit_vr->type == VR_ANTI_RANGE)
922         max = limit;
923       else
924         {
925           /* If LIMIT_VR is of the form [N1, N2], we need to build the
926              range [MIN, N2] for LE_EXPR and [MIN, N2 - 1] for
927              LT_EXPR.  */
928           max = limit_vr->max;
929         }
930
931       /* For LT_EXPR, we create the range [MIN, MAX - 1].  */
932       if (cond_code == LT_EXPR)
933         {
934           tree one = build_int_cst (type, 1);
935           max = fold_build2 (MINUS_EXPR, type, max, one);
936         }
937
938       set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
939     }
940   else if (cond_code == GE_EXPR || cond_code == GT_EXPR)
941     {
942       max = TYPE_MAX_VALUE (type);
943
944       if (limit_vr == NULL || limit_vr->type == VR_ANTI_RANGE)
945         min = limit;
946       else
947         {
948           /* If LIMIT_VR is of the form [N1, N2], we need to build the
949              range [N1, MAX] for GE_EXPR and [N1 + 1, MAX] for
950              GT_EXPR.  */
951           min = limit_vr->min;
952         }
953
954       /* For GT_EXPR, we create the range [MIN + 1, MAX].  */
955       if (cond_code == GT_EXPR)
956         {
957           tree one = build_int_cst (type, 1);
958           min = fold_build2 (PLUS_EXPR, type, min, one);
959         }
960
961       set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
962     }
963   else
964     gcc_unreachable ();
965
966   /* If VAR already had a known range, it may happen that the new
967      range we have computed and VAR's range are not compatible.  For
968      instance,
969
970         if (p_5 == NULL)
971           p_6 = ASSERT_EXPR <p_5, p_5 == NULL>;
972           x_7 = p_6->fld;
973           p_8 = ASSERT_EXPR <p_6, p_6 != NULL>;
974
975      While the above comes from a faulty program, it will cause an ICE
976      later because p_8 and p_6 will have incompatible ranges and at
977      the same time will be considered equivalent.  A similar situation
978      would arise from
979
980         if (i_5 > 10)
981           i_6 = ASSERT_EXPR <i_5, i_5 > 10>;
982           if (i_5 < 5)
983             i_7 = ASSERT_EXPR <i_6, i_6 < 5>;
984
985      Again i_6 and i_7 will have incompatible ranges.  It would be
986      pointless to try and do anything with i_7's range because
987      anything dominated by 'if (i_5 < 5)' will be optimized away.
988      Note, due to the wa in which simulation proceeds, the statement
989      i_7 = ASSERT_EXPR <...> we would never be visited because the
990      conditional 'if (i_5 < 5)' always evaluates to false.  However,
991      this extra check does not hurt and may protect against future
992      changes to VRP that may get into a situation similar to the
993      NULL pointer dereference example.
994
995      Note that these compatibility tests are only needed when dealing
996      with ranges or a mix of range and anti-range.  If VAR_VR and VR_P
997      are both anti-ranges, they will always be compatible, because two
998      anti-ranges will always have a non-empty intersection.  */
999
1000   var_vr = get_value_range (var);
1001
1002   /* We may need to make adjustments when VR_P and VAR_VR are numeric
1003      ranges or anti-ranges.  */
1004   if (vr_p->type == VR_VARYING
1005       || vr_p->type == VR_UNDEFINED
1006       || var_vr->type == VR_VARYING
1007       || var_vr->type == VR_UNDEFINED
1008       || symbolic_range_p (vr_p)
1009       || symbolic_range_p (var_vr))
1010     goto done;
1011
1012   if (var_vr->type == VR_RANGE && vr_p->type == VR_RANGE)
1013     {
1014       /* If the two ranges have a non-empty intersection, we can
1015          refine the resulting range.  Since the assert expression
1016          creates an equivalency and at the same time it asserts a
1017          predicate, we can take the intersection of the two ranges to
1018          get better precision.  */
1019       if (value_ranges_intersect_p (var_vr, vr_p))
1020         {
1021           /* Use the larger of the two minimums.  */
1022           if (compare_values (vr_p->min, var_vr->min) == -1)
1023             min = var_vr->min;
1024           else
1025             min = vr_p->min;
1026
1027           /* Use the smaller of the two maximums.  */
1028           if (compare_values (vr_p->max, var_vr->max) == 1)
1029             max = var_vr->max;
1030           else
1031             max = vr_p->max;
1032
1033           set_value_range (vr_p, vr_p->type, min, max, vr_p->equiv);
1034         }
1035       else
1036         {
1037           /* The two ranges do not intersect, set the new range to
1038              VARYING, because we will not be able to do anything
1039              meaningful with it.  */
1040           set_value_range_to_varying (vr_p);
1041         }
1042     }
1043   else if ((var_vr->type == VR_RANGE && vr_p->type == VR_ANTI_RANGE)
1044            || (var_vr->type == VR_ANTI_RANGE && vr_p->type == VR_RANGE))
1045     {
1046       /* A range and an anti-range will cancel each other only if
1047          their ends are the same.  For instance, in the example above,
1048          p_8's range ~[0, 0] and p_6's range [0, 0] are incompatible,
1049          so VR_P should be set to VR_VARYING.  */
1050       if (compare_values (var_vr->min, vr_p->min) == 0
1051           && compare_values (var_vr->max, vr_p->max) == 0)
1052         set_value_range_to_varying (vr_p);
1053       else
1054         {
1055           tree min, max, anti_min, anti_max, real_min, real_max;
1056
1057           /* We want to compute the logical AND of the two ranges;
1058              there are three cases to consider.
1059
1060
1061              1. The VR_ANTI_RANGE range is completely within the 
1062                 VR_RANGE and the endpoints of the ranges are
1063                 different.  In that case the resulting range
1064                 should be whichever range is more precise.
1065                 Typically that will be the VR_RANGE.
1066
1067              2. The VR_ANTI_RANGE is completely disjoint from
1068                 the VR_RANGE.  In this case the resulting range
1069                 should be the VR_RANGE.
1070
1071              3. There is some overlap between the VR_ANTI_RANGE
1072                 and the VR_RANGE.
1073
1074                 3a. If the high limit of the VR_ANTI_RANGE resides
1075                     within the VR_RANGE, then the result is a new
1076                     VR_RANGE starting at the high limit of the
1077                     the VR_ANTI_RANGE + 1 and extending to the
1078                     high limit of the original VR_RANGE.
1079
1080                 3b. If the low limit of the VR_ANTI_RANGE resides
1081                     within the VR_RANGE, then the result is a new
1082                     VR_RANGE starting at the low limit of the original
1083                     VR_RANGE and extending to the low limit of the
1084                     VR_ANTI_RANGE - 1.  */
1085           if (vr_p->type == VR_ANTI_RANGE)
1086             {
1087               anti_min = vr_p->min;
1088               anti_max = vr_p->max;
1089               real_min = var_vr->min;
1090               real_max = var_vr->max;
1091             }
1092           else
1093             {
1094               anti_min = var_vr->min;
1095               anti_max = var_vr->max;
1096               real_min = vr_p->min;
1097               real_max = vr_p->max;
1098             }
1099
1100
1101           /* Case 1, VR_ANTI_RANGE completely within VR_RANGE,
1102              not including any endpoints.  */
1103           if (compare_values (anti_max, real_max) == -1
1104               && compare_values (anti_min, real_min) == 1)
1105             {
1106               set_value_range (vr_p, VR_RANGE, real_min,
1107                                real_max, vr_p->equiv);
1108             }
1109           /* Case 2, VR_ANTI_RANGE completely disjoint from
1110              VR_RANGE.  */
1111           else if (compare_values (anti_min, real_max) == 1
1112                    || compare_values (anti_max, real_min) == -1)
1113             {
1114               set_value_range (vr_p, VR_RANGE, real_min,
1115                                real_max, vr_p->equiv);
1116             }
1117           /* Case 3a, the anti-range extends into the low
1118              part of the real range.  Thus creating a new
1119              low for the real reange.  */
1120           else if ((compare_values (anti_max, real_min) == 1
1121                     || compare_values (anti_max, real_min) == 0)
1122                    && compare_values (anti_max, real_max) == -1)
1123             {
1124               min = fold_build2 (PLUS_EXPR, TREE_TYPE (var_vr->min),
1125                                  anti_max,
1126                                  build_int_cst (TREE_TYPE (var_vr->min), 1));
1127               max = real_max;
1128               set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
1129             }
1130           /* Case 3b, the anti-range extends into the high
1131              part of the real range.  Thus creating a new
1132              higher for the real reange.  */
1133           else if (compare_values (anti_min, real_min) == 1
1134                    && (compare_values (anti_min, real_max) == -1
1135                        || compare_values (anti_min, real_max) == 0))
1136             {
1137               max = fold_build2 (MINUS_EXPR, TREE_TYPE (var_vr->min),
1138                                  anti_min,
1139                                  build_int_cst (TREE_TYPE (var_vr->min), 1));
1140               min = real_min;
1141               set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
1142             }
1143         }
1144     }
1145
1146   /* Remove names from the equivalence set that have ranges
1147      incompatible with VR_P.  */
1148 done:
1149   fix_equivalence_set (vr_p);
1150 }
1151
1152
1153 /* Extract range information from SSA name VAR and store it in VR.  If
1154    VAR has an interesting range, use it.  Otherwise, create the
1155    range [VAR, VAR] and return it.  This is useful in situations where
1156    we may have conditionals testing values of VARYING names.  For
1157    instance,
1158
1159         x_3 = y_5;
1160         if (x_3 > y_5)
1161           ...
1162
1163     Even if y_5 is deemed VARYING, we can determine that x_3 > y_5 is
1164     always false.  */
1165
1166 static void
1167 extract_range_from_ssa_name (value_range_t *vr, tree var)
1168 {
1169   value_range_t *var_vr = get_value_range (var);
1170
1171   if (var_vr->type != VR_UNDEFINED && var_vr->type != VR_VARYING)
1172     copy_value_range (vr, var_vr);
1173   else
1174     set_value_range (vr, VR_RANGE, var, var, NULL);
1175
1176   add_equivalence (vr->equiv, var);
1177 }
1178
1179
1180 /* Wrapper around int_const_binop.  If the operation overflows and we
1181    are not using wrapping arithmetic, then adjust the result to be
1182    -INF or +INF depending on CODE, VAL1 and VAL2.  */
1183
1184 static inline tree
1185 vrp_int_const_binop (enum tree_code code, tree val1, tree val2)
1186 {
1187   tree res;
1188
1189   if (flag_wrapv)
1190     return int_const_binop (code, val1, val2, 0);
1191
1192   /* If we are not using wrapping arithmetic, operate symbolically
1193      on -INF and +INF.  */
1194   res = int_const_binop (code, val1, val2, 0);
1195
1196   if (TYPE_UNSIGNED (TREE_TYPE (val1)))
1197     {
1198       int checkz = compare_values (res, val1);
1199
1200       /* Ensure that res = val1 [+*] val2 >= val1
1201          or that res = val1 - val2 <= val1.  */
1202       if (((code == PLUS_EXPR || code == MULT_EXPR)
1203            && !(checkz == 1 || checkz == 0))
1204           || (code == MINUS_EXPR
1205               && !(checkz == 0 || checkz == -1)))
1206         {
1207           res = copy_node (res);
1208           TREE_OVERFLOW (res) = 1;
1209         }
1210     }
1211   else if (TREE_OVERFLOW (res)
1212            && !TREE_OVERFLOW (val1)
1213            && !TREE_OVERFLOW (val2))
1214     {
1215       /* If the operation overflowed but neither VAL1 nor VAL2 are
1216          overflown, return -INF or +INF depending on the operation
1217          and the combination of signs of the operands.  */
1218       int sgn1 = tree_int_cst_sgn (val1);
1219       int sgn2 = tree_int_cst_sgn (val2);
1220
1221       /* Notice that we only need to handle the restricted set of
1222          operations handled by extract_range_from_binary_expr.
1223          Among them, only multiplication, addition and subtraction
1224          can yield overflow without overflown operands because we
1225          are working with integral types only... except in the
1226          case VAL1 = -INF and VAL2 = -1 which overflows to +INF
1227          for division too.  */
1228
1229       /* For multiplication, the sign of the overflow is given
1230          by the comparison of the signs of the operands.  */
1231       if ((code == MULT_EXPR && sgn1 == sgn2)
1232           /* For addition, the operands must be of the same sign
1233              to yield an overflow.  Its sign is therefore that
1234              of one of the operands, for example the first.  */
1235           || (code == PLUS_EXPR && sgn1 > 0)
1236           /* For subtraction, the operands must be of different
1237              signs to yield an overflow.  Its sign is therefore
1238              that of the first operand or the opposite of that
1239              of the second operand.  A first operand of 0 counts
1240              as positive here, for the corner case 0 - (-INF),
1241              which overflows, but must yield +INF.  */
1242           || (code == MINUS_EXPR && sgn1 >= 0)
1243           /* For division, the only case is -INF / -1 = +INF.  */
1244           || code == TRUNC_DIV_EXPR
1245           || code == FLOOR_DIV_EXPR
1246           || code == CEIL_DIV_EXPR
1247           || code == EXACT_DIV_EXPR
1248           || code == ROUND_DIV_EXPR)
1249         return TYPE_MAX_VALUE (TREE_TYPE (res));
1250       else
1251         return TYPE_MIN_VALUE (TREE_TYPE (res));
1252     }
1253
1254   return res;
1255 }
1256
1257
1258 /* Extract range information from a binary expression EXPR based on
1259    the ranges of each of its operands and the expression code.  */
1260
1261 static void
1262 extract_range_from_binary_expr (value_range_t *vr, tree expr)
1263 {
1264   enum tree_code code = TREE_CODE (expr);
1265   enum value_range_type type;
1266   tree op0, op1, min, max;
1267   int cmp;
1268   value_range_t vr0 = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
1269   value_range_t vr1 = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
1270
1271   /* Not all binary expressions can be applied to ranges in a
1272      meaningful way.  Handle only arithmetic operations.  */
1273   if (code != PLUS_EXPR
1274       && code != MINUS_EXPR
1275       && code != MULT_EXPR
1276       && code != TRUNC_DIV_EXPR
1277       && code != FLOOR_DIV_EXPR
1278       && code != CEIL_DIV_EXPR
1279       && code != EXACT_DIV_EXPR
1280       && code != ROUND_DIV_EXPR
1281       && code != MIN_EXPR
1282       && code != MAX_EXPR
1283       && code != BIT_AND_EXPR
1284       && code != TRUTH_ANDIF_EXPR
1285       && code != TRUTH_ORIF_EXPR
1286       && code != TRUTH_AND_EXPR
1287       && code != TRUTH_OR_EXPR)
1288     {
1289       set_value_range_to_varying (vr);
1290       return;
1291     }
1292
1293   /* Get value ranges for each operand.  For constant operands, create
1294      a new value range with the operand to simplify processing.  */
1295   op0 = TREE_OPERAND (expr, 0);
1296   if (TREE_CODE (op0) == SSA_NAME)
1297     vr0 = *(get_value_range (op0));
1298   else if (is_gimple_min_invariant (op0))
1299     set_value_range (&vr0, VR_RANGE, op0, op0, NULL);
1300   else
1301     set_value_range_to_varying (&vr0);
1302
1303   op1 = TREE_OPERAND (expr, 1);
1304   if (TREE_CODE (op1) == SSA_NAME)
1305     vr1 = *(get_value_range (op1));
1306   else if (is_gimple_min_invariant (op1))
1307     set_value_range (&vr1, VR_RANGE, op1, op1, NULL);
1308   else
1309     set_value_range_to_varying (&vr1);
1310
1311   /* If either range is UNDEFINED, so is the result.  */
1312   if (vr0.type == VR_UNDEFINED || vr1.type == VR_UNDEFINED)
1313     {
1314       set_value_range_to_undefined (vr);
1315       return;
1316     }
1317
1318   /* The type of the resulting value range defaults to VR0.TYPE.  */
1319   type = vr0.type;
1320
1321   /* Refuse to operate on VARYING ranges, ranges of different kinds
1322      and symbolic ranges.  As an exception, we allow BIT_AND_EXPR
1323      because we may be able to derive a useful range even if one of
1324      the operands is VR_VARYING or symbolic range.  TODO, we may be
1325      able to derive anti-ranges in some cases.  */
1326   if (code != BIT_AND_EXPR
1327       && code != TRUTH_AND_EXPR
1328       && code != TRUTH_OR_EXPR
1329       && (vr0.type == VR_VARYING
1330           || vr1.type == VR_VARYING
1331           || vr0.type != vr1.type
1332           || symbolic_range_p (&vr0)
1333           || symbolic_range_p (&vr1)))
1334     {
1335       set_value_range_to_varying (vr);
1336       return;
1337     }
1338
1339   /* Now evaluate the expression to determine the new range.  */
1340   if (POINTER_TYPE_P (TREE_TYPE (expr))
1341       || POINTER_TYPE_P (TREE_TYPE (op0))
1342       || POINTER_TYPE_P (TREE_TYPE (op1)))
1343     {
1344       /* For pointer types, we are really only interested in asserting
1345          whether the expression evaluates to non-NULL.  FIXME, we used
1346          to gcc_assert (code == PLUS_EXPR || code == MINUS_EXPR), but
1347          ivopts is generating expressions with pointer multiplication
1348          in them.  */
1349       if (code == PLUS_EXPR)
1350         {
1351           if (range_is_nonnull (&vr0) || range_is_nonnull (&vr1))
1352             set_value_range_to_nonnull (vr, TREE_TYPE (expr));
1353           else if (range_is_null (&vr0) && range_is_null (&vr1))
1354             set_value_range_to_null (vr, TREE_TYPE (expr));
1355           else
1356             set_value_range_to_varying (vr);
1357         }
1358       else
1359         {
1360           /* Subtracting from a pointer, may yield 0, so just drop the
1361              resulting range to varying.  */
1362           set_value_range_to_varying (vr);
1363         }
1364
1365       return;
1366     }
1367
1368   /* For integer ranges, apply the operation to each end of the
1369      range and see what we end up with.  */
1370   if (code == TRUTH_ANDIF_EXPR
1371       || code == TRUTH_ORIF_EXPR
1372       || code == TRUTH_AND_EXPR
1373       || code == TRUTH_OR_EXPR)
1374     {
1375       /* If one of the operands is zero, we know that the whole
1376          expression evaluates zero.  */
1377       if (code == TRUTH_AND_EXPR
1378           && ((vr0.type == VR_RANGE
1379                && integer_zerop (vr0.min)
1380                && integer_zerop (vr0.max))
1381               || (vr1.type == VR_RANGE
1382                   && integer_zerop (vr1.min)
1383                   && integer_zerop (vr1.max))))
1384         {
1385           type = VR_RANGE;
1386           min = max = build_int_cst (TREE_TYPE (expr), 0);
1387         }
1388       /* If one of the operands is one, we know that the whole
1389          expression evaluates one.  */
1390       else if (code == TRUTH_OR_EXPR
1391                && ((vr0.type == VR_RANGE
1392                     && integer_onep (vr0.min)
1393                     && integer_onep (vr0.max))
1394                    || (vr1.type == VR_RANGE
1395                        && integer_onep (vr1.min)
1396                        && integer_onep (vr1.max))))
1397         {
1398           type = VR_RANGE;
1399           min = max = build_int_cst (TREE_TYPE (expr), 1);
1400         }
1401       else if (vr0.type != VR_VARYING
1402                && vr1.type != VR_VARYING
1403                && vr0.type == vr1.type
1404                && !symbolic_range_p (&vr0)
1405                && !symbolic_range_p (&vr1))
1406         {
1407           /* Boolean expressions cannot be folded with int_const_binop.  */
1408           min = fold_binary (code, TREE_TYPE (expr), vr0.min, vr1.min);
1409           max = fold_binary (code, TREE_TYPE (expr), vr0.max, vr1.max);
1410         }
1411       else
1412         {
1413           set_value_range_to_varying (vr);
1414           return;
1415         }
1416     }
1417   else if (code == PLUS_EXPR
1418            || code == MIN_EXPR
1419            || code == MAX_EXPR)
1420     {
1421       /* If we have a PLUS_EXPR with two VR_ANTI_RANGEs, drop to
1422          VR_VARYING.  It would take more effort to compute a precise
1423          range for such a case.  For example, if we have op0 == 1 and
1424          op1 == -1 with their ranges both being ~[0,0], we would have
1425          op0 + op1 == 0, so we cannot claim that the sum is in ~[0,0].
1426          Note that we are guaranteed to have vr0.type == vr1.type at
1427          this point.  */
1428       if (code == PLUS_EXPR && vr0.type == VR_ANTI_RANGE)
1429         {
1430           set_value_range_to_varying (vr);
1431           return;
1432         }
1433
1434       /* For operations that make the resulting range directly
1435          proportional to the original ranges, apply the operation to
1436          the same end of each range.  */
1437       min = vrp_int_const_binop (code, vr0.min, vr1.min);
1438       max = vrp_int_const_binop (code, vr0.max, vr1.max);
1439     }
1440   else if (code == MULT_EXPR
1441            || code == TRUNC_DIV_EXPR
1442            || code == FLOOR_DIV_EXPR
1443            || code == CEIL_DIV_EXPR
1444            || code == EXACT_DIV_EXPR
1445            || code == ROUND_DIV_EXPR)
1446     {
1447       tree val[4];
1448       size_t i;
1449
1450       /* If we have an unsigned MULT_EXPR with two VR_ANTI_RANGEs,
1451          drop to VR_VARYING.  It would take more effort to compute a
1452          precise range for such a case.  For example, if we have
1453          op0 == 65536 and op1 == 65536 with their ranges both being
1454          ~[0,0] on a 32-bit machine, we would have op0 * op1 == 0, so
1455          we cannot claim that the product is in ~[0,0].  Note that we
1456          are guaranteed to have vr0.type == vr1.type at this
1457          point.  */
1458       if (code == MULT_EXPR
1459           && vr0.type == VR_ANTI_RANGE
1460           && (flag_wrapv || TYPE_UNSIGNED (TREE_TYPE (op0))))
1461         {
1462           set_value_range_to_varying (vr);
1463           return;
1464         }
1465
1466       /* Multiplications and divisions are a bit tricky to handle,
1467          depending on the mix of signs we have in the two ranges, we
1468          need to operate on different values to get the minimum and
1469          maximum values for the new range.  One approach is to figure
1470          out all the variations of range combinations and do the
1471          operations.
1472
1473          However, this involves several calls to compare_values and it
1474          is pretty convoluted.  It's simpler to do the 4 operations
1475          (MIN0 OP MIN1, MIN0 OP MAX1, MAX0 OP MIN1 and MAX0 OP MAX0 OP
1476          MAX1) and then figure the smallest and largest values to form
1477          the new range.  */
1478
1479       /* Divisions by zero result in a VARYING value.  */
1480       if (code != MULT_EXPR
1481           && (vr0.type == VR_ANTI_RANGE || range_includes_zero_p (&vr1)))
1482         {
1483           set_value_range_to_varying (vr);
1484           return;
1485         }
1486
1487       /* Compute the 4 cross operations.  */
1488       val[0] = vrp_int_const_binop (code, vr0.min, vr1.min);
1489
1490       val[1] = (vr1.max != vr1.min)
1491                ? vrp_int_const_binop (code, vr0.min, vr1.max)
1492                : NULL_TREE;
1493
1494       val[2] = (vr0.max != vr0.min)
1495                ? vrp_int_const_binop (code, vr0.max, vr1.min)
1496                : NULL_TREE;
1497
1498       val[3] = (vr0.min != vr0.max && vr1.min != vr1.max)
1499                ? vrp_int_const_binop (code, vr0.max, vr1.max)
1500                : NULL_TREE;
1501
1502       /* Set MIN to the minimum of VAL[i] and MAX to the maximum
1503          of VAL[i].  */
1504       min = val[0];
1505       max = val[0];
1506       for (i = 1; i < 4; i++)
1507         {
1508           if (!is_gimple_min_invariant (min) || TREE_OVERFLOW (min)
1509               || !is_gimple_min_invariant (max) || TREE_OVERFLOW (max))
1510             break;
1511
1512           if (val[i])
1513             {
1514               if (!is_gimple_min_invariant (val[i]) || TREE_OVERFLOW (val[i]))
1515                 {
1516                   /* If we found an overflowed value, set MIN and MAX
1517                      to it so that we set the resulting range to
1518                      VARYING.  */
1519                   min = max = val[i];
1520                   break;
1521                 }
1522
1523               if (compare_values (val[i], min) == -1)
1524                 min = val[i];
1525
1526               if (compare_values (val[i], max) == 1)
1527                 max = val[i];
1528             }
1529         }
1530     }
1531   else if (code == MINUS_EXPR)
1532     {
1533       /* If we have a MINUS_EXPR with two VR_ANTI_RANGEs, drop to
1534          VR_VARYING.  It would take more effort to compute a precise
1535          range for such a case.  For example, if we have op0 == 1 and
1536          op1 == 1 with their ranges both being ~[0,0], we would have
1537          op0 - op1 == 0, so we cannot claim that the difference is in
1538          ~[0,0].  Note that we are guaranteed to have
1539          vr0.type == vr1.type at this point.  */
1540       if (vr0.type == VR_ANTI_RANGE)
1541         {
1542           set_value_range_to_varying (vr);
1543           return;
1544         }
1545
1546       /* For MINUS_EXPR, apply the operation to the opposite ends of
1547          each range.  */
1548       min = vrp_int_const_binop (code, vr0.min, vr1.max);
1549       max = vrp_int_const_binop (code, vr0.max, vr1.min);
1550     }
1551   else if (code == BIT_AND_EXPR)
1552     {
1553       if (vr0.type == VR_RANGE
1554           && vr0.min == vr0.max
1555           && tree_expr_nonnegative_p (vr0.max)
1556           && TREE_CODE (vr0.max) == INTEGER_CST)
1557         {
1558           min = build_int_cst (TREE_TYPE (expr), 0);
1559           max = vr0.max;
1560         }
1561       else if (vr1.type == VR_RANGE
1562           && vr1.min == vr1.max
1563           && tree_expr_nonnegative_p (vr1.max)
1564           && TREE_CODE (vr1.max) == INTEGER_CST)
1565         {
1566           type = VR_RANGE;
1567           min = build_int_cst (TREE_TYPE (expr), 0);
1568           max = vr1.max;
1569         }
1570       else
1571         {
1572           set_value_range_to_varying (vr);
1573           return;
1574         }
1575     }
1576   else
1577     gcc_unreachable ();
1578
1579   /* If either MIN or MAX overflowed, then set the resulting range to
1580      VARYING.  */
1581   if (!is_gimple_min_invariant (min) || TREE_OVERFLOW (min)
1582       || !is_gimple_min_invariant (max) || TREE_OVERFLOW (max))
1583     {
1584       set_value_range_to_varying (vr);
1585       return;
1586     }
1587
1588   cmp = compare_values (min, max);
1589   if (cmp == -2 || cmp == 1)
1590     {
1591       /* If the new range has its limits swapped around (MIN > MAX),
1592          then the operation caused one of them to wrap around, mark
1593          the new range VARYING.  */
1594       set_value_range_to_varying (vr);
1595     }
1596   else
1597     set_value_range (vr, type, min, max, NULL);
1598 }
1599
1600
1601 /* Extract range information from a unary expression EXPR based on
1602    the range of its operand and the expression code.  */
1603
1604 static void
1605 extract_range_from_unary_expr (value_range_t *vr, tree expr)
1606 {
1607   enum tree_code code = TREE_CODE (expr);
1608   tree min, max, op0;
1609   int cmp;
1610   value_range_t vr0 = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
1611
1612   /* Refuse to operate on certain unary expressions for which we
1613      cannot easily determine a resulting range.  */
1614   if (code == FIX_TRUNC_EXPR
1615       || code == FIX_CEIL_EXPR
1616       || code == FIX_FLOOR_EXPR
1617       || code == FIX_ROUND_EXPR
1618       || code == FLOAT_EXPR
1619       || code == BIT_NOT_EXPR
1620       || code == NON_LVALUE_EXPR
1621       || code == CONJ_EXPR)
1622     {
1623       set_value_range_to_varying (vr);
1624       return;
1625     }
1626
1627   /* Get value ranges for the operand.  For constant operands, create
1628      a new value range with the operand to simplify processing.  */
1629   op0 = TREE_OPERAND (expr, 0);
1630   if (TREE_CODE (op0) == SSA_NAME)
1631     vr0 = *(get_value_range (op0));
1632   else if (is_gimple_min_invariant (op0))
1633     set_value_range (&vr0, VR_RANGE, op0, op0, NULL);
1634   else
1635     set_value_range_to_varying (&vr0);
1636
1637   /* If VR0 is UNDEFINED, so is the result.  */
1638   if (vr0.type == VR_UNDEFINED)
1639     {
1640       set_value_range_to_undefined (vr);
1641       return;
1642     }
1643
1644   /* Refuse to operate on symbolic ranges, or if neither operand is
1645      a pointer or integral type.  */
1646   if ((!INTEGRAL_TYPE_P (TREE_TYPE (op0))
1647        && !POINTER_TYPE_P (TREE_TYPE (op0)))
1648       || (vr0.type != VR_VARYING
1649           && symbolic_range_p (&vr0)))
1650     {
1651       set_value_range_to_varying (vr);
1652       return;
1653     }
1654
1655   /* If the expression involves pointers, we are only interested in
1656      determining if it evaluates to NULL [0, 0] or non-NULL (~[0, 0]).  */
1657   if (POINTER_TYPE_P (TREE_TYPE (expr)) || POINTER_TYPE_P (TREE_TYPE (op0)))
1658     {
1659       if (range_is_nonnull (&vr0) || tree_expr_nonzero_p (expr))
1660         set_value_range_to_nonnull (vr, TREE_TYPE (expr));
1661       else if (range_is_null (&vr0))
1662         set_value_range_to_null (vr, TREE_TYPE (expr));
1663       else
1664         set_value_range_to_varying (vr);
1665
1666       return;
1667     }
1668
1669   /* Handle unary expressions on integer ranges.  */
1670   if (code == NOP_EXPR || code == CONVERT_EXPR)
1671     {
1672       tree inner_type = TREE_TYPE (op0);
1673       tree outer_type = TREE_TYPE (expr);
1674
1675       /* If VR0 represents a simple range, then try to convert
1676          the min and max values for the range to the same type
1677          as OUTER_TYPE.  If the results compare equal to VR0's
1678          min and max values and the new min is still less than
1679          or equal to the new max, then we can safely use the newly
1680          computed range for EXPR.  This allows us to compute
1681          accurate ranges through many casts.  */
1682       if (vr0.type == VR_RANGE
1683           || (vr0.type == VR_VARYING
1684               && TYPE_PRECISION (outer_type) > TYPE_PRECISION (inner_type)))
1685         {
1686           tree new_min, new_max, orig_min, orig_max;
1687
1688           /* Convert the input operand min/max to OUTER_TYPE.   If
1689              the input has no range information, then use the min/max
1690              for the input's type.  */
1691           if (vr0.type == VR_RANGE)
1692             {
1693               orig_min = vr0.min;
1694               orig_max = vr0.max;
1695             }
1696           else
1697             {
1698               orig_min = TYPE_MIN_VALUE (inner_type);
1699               orig_max = TYPE_MAX_VALUE (inner_type);
1700             }
1701
1702           new_min = fold_convert (outer_type, orig_min);
1703           new_max = fold_convert (outer_type, orig_max);
1704
1705           /* Verify the new min/max values are gimple values and
1706              that they compare equal to the orignal input's
1707              min/max values.  */
1708           if (is_gimple_val (new_min)
1709               && is_gimple_val (new_max)
1710               && tree_int_cst_equal (new_min, orig_min)
1711               && tree_int_cst_equal (new_max, orig_max)
1712               && compare_values (new_min, new_max) <= 0
1713               && compare_values (new_min, new_max) >= -1)
1714             {
1715               set_value_range (vr, VR_RANGE, new_min, new_max, vr->equiv);
1716               return;
1717             }
1718         }
1719
1720       /* When converting types of different sizes, set the result to
1721          VARYING.  Things like sign extensions and precision loss may
1722          change the range.  For instance, if x_3 is of type 'long long
1723          int' and 'y_5 = (unsigned short) x_3', if x_3 is ~[0, 0], it
1724          is impossible to know at compile time whether y_5 will be
1725          ~[0, 0].  */
1726       if (TYPE_SIZE (inner_type) != TYPE_SIZE (outer_type)
1727           || TYPE_PRECISION (inner_type) != TYPE_PRECISION (outer_type))
1728         {
1729           set_value_range_to_varying (vr);
1730           return;
1731         }
1732     }
1733
1734   /* Conversion of a VR_VARYING value to a wider type can result
1735      in a usable range.  So wait until after we've handled conversions
1736      before dropping the result to VR_VARYING if we had a source
1737      operand that is VR_VARYING.  */
1738   if (vr0.type == VR_VARYING)
1739     {
1740       set_value_range_to_varying (vr);
1741       return;
1742     }
1743
1744   /* Apply the operation to each end of the range and see what we end
1745      up with.  */
1746   if (code == NEGATE_EXPR
1747       && !TYPE_UNSIGNED (TREE_TYPE (expr)))
1748     {
1749       /* NEGATE_EXPR flips the range around.  */
1750       min = (vr0.max == TYPE_MAX_VALUE (TREE_TYPE (expr)) && !flag_wrapv)
1751              ? TYPE_MIN_VALUE (TREE_TYPE (expr))
1752              : fold_unary_to_constant (code, TREE_TYPE (expr), vr0.max);
1753
1754       max = (vr0.min == TYPE_MIN_VALUE (TREE_TYPE (expr)) && !flag_wrapv)
1755              ? TYPE_MAX_VALUE (TREE_TYPE (expr))
1756              : fold_unary_to_constant (code, TREE_TYPE (expr), vr0.min);
1757
1758     }
1759   else if (code == NEGATE_EXPR
1760            && TYPE_UNSIGNED (TREE_TYPE (expr)))
1761     {
1762       if (!range_includes_zero_p (&vr0))
1763         {
1764           max = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.min);
1765           min = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.max);
1766         }
1767       else
1768         {
1769           if (range_is_null (&vr0))
1770             set_value_range_to_null (vr, TREE_TYPE (expr));
1771           else
1772             set_value_range_to_varying (vr);
1773           return;
1774         }
1775     }
1776   else if (code == ABS_EXPR
1777            && !TYPE_UNSIGNED (TREE_TYPE (expr)))
1778     {
1779       /* -TYPE_MIN_VALUE = TYPE_MIN_VALUE with flag_wrapv so we can't get a
1780          useful range.  */
1781       if (flag_wrapv
1782           && ((vr0.type == VR_RANGE
1783                && vr0.min == TYPE_MIN_VALUE (TREE_TYPE (expr)))
1784               || (vr0.type == VR_ANTI_RANGE
1785                   && vr0.min != TYPE_MIN_VALUE (TREE_TYPE (expr))
1786                   && !range_includes_zero_p (&vr0))))
1787         {
1788           set_value_range_to_varying (vr);
1789           return;
1790         }
1791         
1792       /* ABS_EXPR may flip the range around, if the original range
1793          included negative values.  */
1794       min = (vr0.min == TYPE_MIN_VALUE (TREE_TYPE (expr)))
1795             ? TYPE_MAX_VALUE (TREE_TYPE (expr))
1796             : fold_unary_to_constant (code, TREE_TYPE (expr), vr0.min);
1797
1798       max = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.max);
1799
1800       cmp = compare_values (min, max);
1801
1802       /* If a VR_ANTI_RANGEs contains zero, then we have
1803          ~[-INF, min(MIN, MAX)].  */
1804       if (vr0.type == VR_ANTI_RANGE)
1805         { 
1806           if (range_includes_zero_p (&vr0))
1807             {
1808               tree type_min_value = TYPE_MIN_VALUE (TREE_TYPE (expr));
1809
1810               /* Take the lower of the two values.  */
1811               if (cmp != 1)
1812                 max = min;
1813
1814               /* Create ~[-INF, min (abs(MIN), abs(MAX))]
1815                  or ~[-INF + 1, min (abs(MIN), abs(MAX))] when
1816                  flag_wrapv is set and the original anti-range doesn't include
1817                  TYPE_MIN_VALUE, remember -TYPE_MIN_VALUE = TYPE_MIN_VALUE.  */
1818               min = (flag_wrapv && vr0.min != type_min_value
1819                      ? int_const_binop (PLUS_EXPR,
1820                                         type_min_value,
1821                                         integer_one_node, 0)
1822                      : type_min_value);
1823             }
1824           else
1825             {
1826               /* All else has failed, so create the range [0, INF], even for
1827                  flag_wrapv since TYPE_MIN_VALUE is in the original
1828                  anti-range.  */
1829               vr0.type = VR_RANGE;
1830               min = build_int_cst (TREE_TYPE (expr), 0);
1831               max = TYPE_MAX_VALUE (TREE_TYPE (expr));
1832             }
1833         }
1834
1835       /* If the range contains zero then we know that the minimum value in the
1836          range will be zero.  */
1837       else if (range_includes_zero_p (&vr0))
1838         {
1839           if (cmp == 1)
1840             max = min;
1841           min = build_int_cst (TREE_TYPE (expr), 0);
1842         }
1843       else
1844         {
1845           /* If the range was reversed, swap MIN and MAX.  */
1846           if (cmp == 1)
1847             {
1848               tree t = min;
1849               min = max;
1850               max = t;
1851             }
1852         }
1853     }
1854   else
1855     {
1856       /* Otherwise, operate on each end of the range.  */
1857       min = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.min);
1858       max = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.max);
1859     }
1860
1861   cmp = compare_values (min, max);
1862   if (cmp == -2 || cmp == 1)
1863     {
1864       /* If the new range has its limits swapped around (MIN > MAX),
1865          then the operation caused one of them to wrap around, mark
1866          the new range VARYING.  */
1867       set_value_range_to_varying (vr);
1868     }
1869   else
1870     set_value_range (vr, vr0.type, min, max, NULL);
1871 }
1872
1873
1874 /* Extract range information from a comparison expression EXPR based
1875    on the range of its operand and the expression code.  */
1876
1877 static void
1878 extract_range_from_comparison (value_range_t *vr, tree expr)
1879 {
1880   tree val = vrp_evaluate_conditional (expr, false);
1881   if (val)
1882     {
1883       /* Since this expression was found on the RHS of an assignment,
1884          its type may be different from _Bool.  Convert VAL to EXPR's
1885          type.  */
1886       val = fold_convert (TREE_TYPE (expr), val);
1887       set_value_range (vr, VR_RANGE, val, val, vr->equiv);
1888     }
1889   else
1890     set_value_range_to_varying (vr);
1891 }
1892
1893
1894 /* Try to compute a useful range out of expression EXPR and store it
1895    in *VR.  */
1896
1897 static void
1898 extract_range_from_expr (value_range_t *vr, tree expr)
1899 {
1900   enum tree_code code = TREE_CODE (expr);
1901
1902   if (code == ASSERT_EXPR)
1903     extract_range_from_assert (vr, expr);
1904   else if (code == SSA_NAME)
1905     extract_range_from_ssa_name (vr, expr);
1906   else if (TREE_CODE_CLASS (code) == tcc_binary
1907            || code == TRUTH_ANDIF_EXPR
1908            || code == TRUTH_ORIF_EXPR
1909            || code == TRUTH_AND_EXPR
1910            || code == TRUTH_OR_EXPR
1911            || code == TRUTH_XOR_EXPR)
1912     extract_range_from_binary_expr (vr, expr);
1913   else if (TREE_CODE_CLASS (code) == tcc_unary)
1914     extract_range_from_unary_expr (vr, expr);
1915   else if (TREE_CODE_CLASS (code) == tcc_comparison)
1916     extract_range_from_comparison (vr, expr);
1917   else if (is_gimple_min_invariant (expr))
1918     set_value_range (vr, VR_RANGE, expr, expr, NULL);
1919   else
1920     set_value_range_to_varying (vr);
1921
1922   /* If we got a varying range from the tests above, try a final
1923      time to derive a nonnegative or nonzero range.  This time
1924      relying primarily on generic routines in fold in conjunction
1925      with range data.  */
1926   if (vr->type == VR_VARYING)
1927     {
1928       if (INTEGRAL_TYPE_P (TREE_TYPE (expr))
1929           && vrp_expr_computes_nonnegative (expr))
1930         set_value_range_to_nonnegative (vr, TREE_TYPE (expr));
1931       else if (vrp_expr_computes_nonzero (expr))
1932         set_value_range_to_nonnull (vr, TREE_TYPE (expr));
1933     }
1934 }
1935
1936 /* Given a range VR, a LOOP and a variable VAR, determine whether it
1937    would be profitable to adjust VR using scalar evolution information
1938    for VAR.  If so, update VR with the new limits.  */
1939
1940 static void
1941 adjust_range_with_scev (value_range_t *vr, struct loop *loop, tree stmt,
1942                         tree var)
1943 {
1944   tree init, step, chrec;
1945   bool init_is_max, unknown_max;
1946
1947   /* TODO.  Don't adjust anti-ranges.  An anti-range may provide
1948      better opportunities than a regular range, but I'm not sure.  */
1949   if (vr->type == VR_ANTI_RANGE)
1950     return;
1951
1952   chrec = instantiate_parameters (loop, analyze_scalar_evolution (loop, var));
1953   if (TREE_CODE (chrec) != POLYNOMIAL_CHREC)
1954     return;
1955
1956   init = initial_condition_in_loop_num (chrec, loop->num);
1957   step = evolution_part_in_loop_num (chrec, loop->num);
1958
1959   /* If STEP is symbolic, we can't know whether INIT will be the
1960      minimum or maximum value in the range.  */
1961   if (step == NULL_TREE
1962       || !is_gimple_min_invariant (step))
1963     return;
1964
1965   /* Do not adjust ranges when chrec may wrap.  */
1966   if (scev_probably_wraps_p (chrec_type (chrec), init, step, stmt,
1967                              current_loops->parray[CHREC_VARIABLE (chrec)],
1968                              &init_is_max, &unknown_max)
1969       || unknown_max)
1970     return;
1971
1972   if (!POINTER_TYPE_P (TREE_TYPE (init))
1973       && (vr->type == VR_VARYING || vr->type == VR_UNDEFINED))
1974     {
1975       /* For VARYING or UNDEFINED ranges, just about anything we get
1976          from scalar evolutions should be better.  */
1977       tree min = TYPE_MIN_VALUE (TREE_TYPE (init));
1978       tree max = TYPE_MAX_VALUE (TREE_TYPE (init));
1979
1980       if (init_is_max)
1981         max = init;
1982       else
1983         min = init;
1984
1985       /* If we would create an invalid range, then just assume we
1986          know absolutely nothing.  This may be over-conservative,
1987          but it's clearly safe.  */
1988       if (compare_values (min, max) == 1)
1989         return;
1990
1991       set_value_range (vr, VR_RANGE, min, max, vr->equiv);
1992     }
1993   else if (vr->type == VR_RANGE)
1994     {
1995       tree min = vr->min;
1996       tree max = vr->max;
1997
1998       if (init_is_max)
1999         {
2000           /* INIT is the maximum value.  If INIT is lower than VR->MAX
2001              but no smaller than VR->MIN, set VR->MAX to INIT.  */
2002           if (compare_values (init, max) == -1)
2003             {
2004               max = init;
2005
2006               /* If we just created an invalid range with the minimum
2007                  greater than the maximum, take the minimum all the
2008                  way to -INF.  */
2009               if (compare_values (min, max) == 1)
2010                 min = TYPE_MIN_VALUE (TREE_TYPE (min));
2011             }
2012         }
2013       else
2014         {
2015           /* If INIT is bigger than VR->MIN, set VR->MIN to INIT.  */
2016           if (compare_values (init, min) == 1)
2017             {
2018               min = init;
2019
2020               /* If we just created an invalid range with the minimum
2021                  greater than the maximum, take the maximum all the
2022                  way to +INF.  */
2023               if (compare_values (min, max) == 1)
2024                 max = TYPE_MAX_VALUE (TREE_TYPE (max));
2025             }
2026         }
2027
2028       set_value_range (vr, VR_RANGE, min, max, vr->equiv);
2029     }
2030 }
2031
2032
2033 /* Given two numeric value ranges VR0, VR1 and a comparison code COMP:
2034    
2035    - Return BOOLEAN_TRUE_NODE if VR0 COMP VR1 always returns true for
2036      all the values in the ranges.
2037
2038    - Return BOOLEAN_FALSE_NODE if the comparison always returns false.
2039
2040    - Return NULL_TREE if it is not always possible to determine the
2041      value of the comparison.  */
2042
2043
2044 static tree
2045 compare_ranges (enum tree_code comp, value_range_t *vr0, value_range_t *vr1)
2046 {
2047   /* VARYING or UNDEFINED ranges cannot be compared.  */
2048   if (vr0->type == VR_VARYING
2049       || vr0->type == VR_UNDEFINED
2050       || vr1->type == VR_VARYING
2051       || vr1->type == VR_UNDEFINED)
2052     return NULL_TREE;
2053
2054   /* Anti-ranges need to be handled separately.  */
2055   if (vr0->type == VR_ANTI_RANGE || vr1->type == VR_ANTI_RANGE)
2056     {
2057       /* If both are anti-ranges, then we cannot compute any
2058          comparison.  */
2059       if (vr0->type == VR_ANTI_RANGE && vr1->type == VR_ANTI_RANGE)
2060         return NULL_TREE;
2061
2062       /* These comparisons are never statically computable.  */
2063       if (comp == GT_EXPR
2064           || comp == GE_EXPR
2065           || comp == LT_EXPR
2066           || comp == LE_EXPR)
2067         return NULL_TREE;
2068
2069       /* Equality can be computed only between a range and an
2070          anti-range.  ~[VAL1, VAL2] == [VAL1, VAL2] is always false.  */
2071       if (vr0->type == VR_RANGE)
2072         {
2073           /* To simplify processing, make VR0 the anti-range.  */
2074           value_range_t *tmp = vr0;
2075           vr0 = vr1;
2076           vr1 = tmp;
2077         }
2078
2079       gcc_assert (comp == NE_EXPR || comp == EQ_EXPR);
2080
2081       if (compare_values (vr0->min, vr1->min) == 0
2082           && compare_values (vr0->max, vr1->max) == 0)
2083         return (comp == NE_EXPR) ? boolean_true_node : boolean_false_node;
2084
2085       return NULL_TREE;
2086     }
2087
2088   /* Simplify processing.  If COMP is GT_EXPR or GE_EXPR, switch the
2089      operands around and change the comparison code.  */
2090   if (comp == GT_EXPR || comp == GE_EXPR)
2091     {
2092       value_range_t *tmp;
2093       comp = (comp == GT_EXPR) ? LT_EXPR : LE_EXPR;
2094       tmp = vr0;
2095       vr0 = vr1;
2096       vr1 = tmp;
2097     }
2098
2099   if (comp == EQ_EXPR)
2100     {
2101       /* Equality may only be computed if both ranges represent
2102          exactly one value.  */
2103       if (compare_values (vr0->min, vr0->max) == 0
2104           && compare_values (vr1->min, vr1->max) == 0)
2105         {
2106           int cmp_min = compare_values (vr0->min, vr1->min);
2107           int cmp_max = compare_values (vr0->max, vr1->max);
2108           if (cmp_min == 0 && cmp_max == 0)
2109             return boolean_true_node;
2110           else if (cmp_min != -2 && cmp_max != -2)
2111             return boolean_false_node;
2112         }
2113       /* If [V0_MIN, V1_MAX] < [V1_MIN, V1_MAX] then V0 != V1.  */
2114       else if (compare_values (vr0->min, vr1->max) == 1
2115                || compare_values (vr1->min, vr0->max) == 1)
2116         return boolean_false_node;
2117
2118       return NULL_TREE;
2119     }
2120   else if (comp == NE_EXPR)
2121     {
2122       int cmp1, cmp2;
2123
2124       /* If VR0 is completely to the left or completely to the right
2125          of VR1, they are always different.  Notice that we need to
2126          make sure that both comparisons yield similar results to
2127          avoid comparing values that cannot be compared at
2128          compile-time.  */
2129       cmp1 = compare_values (vr0->max, vr1->min);
2130       cmp2 = compare_values (vr0->min, vr1->max);
2131       if ((cmp1 == -1 && cmp2 == -1) || (cmp1 == 1 && cmp2 == 1))
2132         return boolean_true_node;
2133
2134       /* If VR0 and VR1 represent a single value and are identical,
2135          return false.  */
2136       else if (compare_values (vr0->min, vr0->max) == 0
2137                && compare_values (vr1->min, vr1->max) == 0
2138                && compare_values (vr0->min, vr1->min) == 0
2139                && compare_values (vr0->max, vr1->max) == 0)
2140         return boolean_false_node;
2141
2142       /* Otherwise, they may or may not be different.  */
2143       else
2144         return NULL_TREE;
2145     }
2146   else if (comp == LT_EXPR || comp == LE_EXPR)
2147     {
2148       int tst;
2149
2150       /* If VR0 is to the left of VR1, return true.  */
2151       tst = compare_values (vr0->max, vr1->min);
2152       if ((comp == LT_EXPR && tst == -1)
2153           || (comp == LE_EXPR && (tst == -1 || tst == 0)))
2154         return boolean_true_node;
2155
2156       /* If VR0 is to the right of VR1, return false.  */
2157       tst = compare_values (vr0->min, vr1->max);
2158       if ((comp == LT_EXPR && (tst == 0 || tst == 1))
2159           || (comp == LE_EXPR && tst == 1))
2160         return boolean_false_node;
2161
2162       /* Otherwise, we don't know.  */
2163       return NULL_TREE;
2164     }
2165     
2166   gcc_unreachable ();
2167 }
2168
2169
2170 /* Given a value range VR, a value VAL and a comparison code COMP, return
2171    BOOLEAN_TRUE_NODE if VR COMP VAL always returns true for all the
2172    values in VR.  Return BOOLEAN_FALSE_NODE if the comparison
2173    always returns false.  Return NULL_TREE if it is not always
2174    possible to determine the value of the comparison.  */
2175
2176 static tree
2177 compare_range_with_value (enum tree_code comp, value_range_t *vr, tree val)
2178 {
2179   if (vr->type == VR_VARYING || vr->type == VR_UNDEFINED)
2180     return NULL_TREE;
2181
2182   /* Anti-ranges need to be handled separately.  */
2183   if (vr->type == VR_ANTI_RANGE)
2184     {
2185       /* For anti-ranges, the only predicates that we can compute at
2186          compile time are equality and inequality.  */
2187       if (comp == GT_EXPR
2188           || comp == GE_EXPR
2189           || comp == LT_EXPR
2190           || comp == LE_EXPR)
2191         return NULL_TREE;
2192
2193       /* ~[VAL_1, VAL_2] OP VAL is known if VAL_1 <= VAL <= VAL_2.  */
2194       if (value_inside_range (val, vr) == 1)
2195         return (comp == NE_EXPR) ? boolean_true_node : boolean_false_node;
2196
2197       return NULL_TREE;
2198     }
2199
2200   if (comp == EQ_EXPR)
2201     {
2202       /* EQ_EXPR may only be computed if VR represents exactly
2203          one value.  */
2204       if (compare_values (vr->min, vr->max) == 0)
2205         {
2206           int cmp = compare_values (vr->min, val);
2207           if (cmp == 0)
2208             return boolean_true_node;
2209           else if (cmp == -1 || cmp == 1 || cmp == 2)
2210             return boolean_false_node;
2211         }
2212       else if (compare_values (val, vr->min) == -1
2213                || compare_values (vr->max, val) == -1)
2214         return boolean_false_node;
2215
2216       return NULL_TREE;
2217     }
2218   else if (comp == NE_EXPR)
2219     {
2220       /* If VAL is not inside VR, then they are always different.  */
2221       if (compare_values (vr->max, val) == -1
2222           || compare_values (vr->min, val) == 1)
2223         return boolean_true_node;
2224
2225       /* If VR represents exactly one value equal to VAL, then return
2226          false.  */
2227       if (compare_values (vr->min, vr->max) == 0
2228           && compare_values (vr->min, val) == 0)
2229         return boolean_false_node;
2230
2231       /* Otherwise, they may or may not be different.  */
2232       return NULL_TREE;
2233     }
2234   else if (comp == LT_EXPR || comp == LE_EXPR)
2235     {
2236       int tst;
2237
2238       /* If VR is to the left of VAL, return true.  */
2239       tst = compare_values (vr->max, val);
2240       if ((comp == LT_EXPR && tst == -1)
2241           || (comp == LE_EXPR && (tst == -1 || tst == 0)))
2242         return boolean_true_node;
2243
2244       /* If VR is to the right of VAL, return false.  */
2245       tst = compare_values (vr->min, val);
2246       if ((comp == LT_EXPR && (tst == 0 || tst == 1))
2247           || (comp == LE_EXPR && tst == 1))
2248         return boolean_false_node;
2249
2250       /* Otherwise, we don't know.  */
2251       return NULL_TREE;
2252     }
2253   else if (comp == GT_EXPR || comp == GE_EXPR)
2254     {
2255       int tst;
2256
2257       /* If VR is to the right of VAL, return true.  */
2258       tst = compare_values (vr->min, val);
2259       if ((comp == GT_EXPR && tst == 1)
2260           || (comp == GE_EXPR && (tst == 0 || tst == 1)))
2261         return boolean_true_node;
2262
2263       /* If VR is to the left of VAL, return false.  */
2264       tst = compare_values (vr->max, val);
2265       if ((comp == GT_EXPR && (tst == -1 || tst == 0))
2266           || (comp == GE_EXPR && tst == -1))
2267         return boolean_false_node;
2268
2269       /* Otherwise, we don't know.  */
2270       return NULL_TREE;
2271     }
2272
2273   gcc_unreachable ();
2274 }
2275
2276
2277 /* Debugging dumps.  */
2278
2279 void dump_value_range (FILE *, value_range_t *);
2280 void debug_value_range (value_range_t *);
2281 void dump_all_value_ranges (FILE *);
2282 void debug_all_value_ranges (void);
2283 void dump_vr_equiv (FILE *, bitmap);
2284 void debug_vr_equiv (bitmap);
2285
2286
2287 /* Dump value range VR to FILE.  */
2288
2289 void
2290 dump_value_range (FILE *file, value_range_t *vr)
2291 {
2292   if (vr == NULL)
2293     fprintf (file, "[]");
2294   else if (vr->type == VR_UNDEFINED)
2295     fprintf (file, "UNDEFINED");
2296   else if (vr->type == VR_RANGE || vr->type == VR_ANTI_RANGE)
2297     {
2298       tree type = TREE_TYPE (vr->min);
2299
2300       fprintf (file, "%s[", (vr->type == VR_ANTI_RANGE) ? "~" : "");
2301
2302       if (INTEGRAL_TYPE_P (type)
2303           && !TYPE_UNSIGNED (type)
2304           && vr->min == TYPE_MIN_VALUE (type))
2305         fprintf (file, "-INF");
2306       else
2307         print_generic_expr (file, vr->min, 0);
2308
2309       fprintf (file, ", ");
2310
2311       if (INTEGRAL_TYPE_P (type)
2312           && vr->max == TYPE_MAX_VALUE (type))
2313         fprintf (file, "+INF");
2314       else
2315         print_generic_expr (file, vr->max, 0);
2316
2317       fprintf (file, "]");
2318
2319       if (vr->equiv)
2320         {
2321           bitmap_iterator bi;
2322           unsigned i, c = 0;
2323
2324           fprintf (file, "  EQUIVALENCES: { ");
2325
2326           EXECUTE_IF_SET_IN_BITMAP (vr->equiv, 0, i, bi)
2327             {
2328               print_generic_expr (file, ssa_name (i), 0);
2329               fprintf (file, " ");
2330               c++;
2331             }
2332
2333           fprintf (file, "} (%u elements)", c);
2334         }
2335     }
2336   else if (vr->type == VR_VARYING)
2337     fprintf (file, "VARYING");
2338   else
2339     fprintf (file, "INVALID RANGE");
2340 }
2341
2342
2343 /* Dump value range VR to stderr.  */
2344
2345 void
2346 debug_value_range (value_range_t *vr)
2347 {
2348   dump_value_range (stderr, vr);
2349 }
2350
2351
2352 /* Dump value ranges of all SSA_NAMEs to FILE.  */
2353
2354 void
2355 dump_all_value_ranges (FILE *file)
2356 {
2357   size_t i;
2358
2359   for (i = 0; i < num_ssa_names; i++)
2360     {
2361       if (vr_value[i])
2362         {
2363           print_generic_expr (file, ssa_name (i), 0);
2364           fprintf (file, ": ");
2365           dump_value_range (file, vr_value[i]);
2366           fprintf (file, "\n");
2367         }
2368     }
2369
2370   fprintf (file, "\n");
2371 }
2372
2373
2374 /* Dump all value ranges to stderr.  */
2375
2376 void
2377 debug_all_value_ranges (void)
2378 {
2379   dump_all_value_ranges (stderr);
2380 }
2381
2382
2383 /* Given a COND_EXPR COND of the form 'V OP W', and an SSA name V,
2384    create a new SSA name N and return the assertion assignment
2385    'V = ASSERT_EXPR <V, V OP W>'.  */
2386
2387 static tree
2388 build_assert_expr_for (tree cond, tree v)
2389 {
2390   tree n, assertion;
2391
2392   gcc_assert (TREE_CODE (v) == SSA_NAME);
2393   n = duplicate_ssa_name (v, NULL_TREE);
2394
2395   if (COMPARISON_CLASS_P (cond))
2396     {
2397       tree a = build2 (ASSERT_EXPR, TREE_TYPE (v), v, cond); 
2398       assertion = build2 (MODIFY_EXPR, TREE_TYPE (v), n, a);
2399     }
2400   else if (TREE_CODE (cond) == TRUTH_NOT_EXPR)
2401     {
2402       /* Given !V, build the assignment N = false.  */
2403       tree op0 = TREE_OPERAND (cond, 0);
2404       gcc_assert (op0 == v);
2405       assertion = build2 (MODIFY_EXPR, TREE_TYPE (v), n, boolean_false_node);
2406     }
2407   else if (TREE_CODE (cond) == SSA_NAME)
2408     {
2409       /* Given V, build the assignment N = true.  */
2410       gcc_assert (v == cond);
2411       assertion = build2 (MODIFY_EXPR, TREE_TYPE (v), n, boolean_true_node);
2412     }
2413   else
2414     gcc_unreachable ();
2415
2416   SSA_NAME_DEF_STMT (n) = assertion;
2417
2418   /* The new ASSERT_EXPR, creates a new SSA name that replaces the
2419      operand of the ASSERT_EXPR. Register the new name and the old one
2420      in the replacement table so that we can fix the SSA web after
2421      adding all the ASSERT_EXPRs.  */
2422   register_new_name_mapping (n, v);
2423
2424   return assertion;
2425 }
2426
2427
2428 /* Return false if EXPR is a predicate expression involving floating
2429    point values.  */
2430
2431 static inline bool
2432 fp_predicate (tree expr)
2433 {
2434   return (COMPARISON_CLASS_P (expr)
2435           && FLOAT_TYPE_P (TREE_TYPE (TREE_OPERAND (expr, 0))));
2436 }
2437
2438
2439 /* If the range of values taken by OP can be inferred after STMT executes,
2440    return the comparison code (COMP_CODE_P) and value (VAL_P) that
2441    describes the inferred range.  Return true if a range could be
2442    inferred.  */
2443
2444 static bool
2445 infer_value_range (tree stmt, tree op, enum tree_code *comp_code_p, tree *val_p)
2446 {
2447   *val_p = NULL_TREE;
2448   *comp_code_p = ERROR_MARK;
2449
2450   /* Do not attempt to infer anything in names that flow through
2451      abnormal edges.  */
2452   if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op))
2453     return false;
2454
2455   /* Similarly, don't infer anything from statements that may throw
2456      exceptions.  */
2457   if (tree_could_throw_p (stmt))
2458     return false;
2459
2460   /* If STMT is the last statement of a basic block with no
2461      successors, there is no point inferring anything about any of its
2462      operands.  We would not be able to find a proper insertion point
2463      for the assertion, anyway.  */
2464   if (stmt_ends_bb_p (stmt) && EDGE_COUNT (bb_for_stmt (stmt)->succs) == 0)
2465     return false;
2466
2467   /* We can only assume that a pointer dereference will yield
2468      non-NULL if -fdelete-null-pointer-checks is enabled.  */
2469   if (flag_delete_null_pointer_checks && POINTER_TYPE_P (TREE_TYPE (op)))
2470     {
2471       bool is_store;
2472       unsigned num_uses, num_derefs;
2473
2474       count_uses_and_derefs (op, stmt, &num_uses, &num_derefs, &is_store);
2475       if (num_derefs > 0)
2476         {
2477           *val_p = build_int_cst (TREE_TYPE (op), 0);
2478           *comp_code_p = NE_EXPR;
2479           return true;
2480         }
2481     }
2482
2483   return false;
2484 }
2485
2486
2487 void dump_asserts_for (FILE *, tree);
2488 void debug_asserts_for (tree);
2489 void dump_all_asserts (FILE *);
2490 void debug_all_asserts (void);
2491
2492 /* Dump all the registered assertions for NAME to FILE.  */
2493
2494 void
2495 dump_asserts_for (FILE *file, tree name)
2496 {
2497   assert_locus_t loc;
2498
2499   fprintf (file, "Assertions to be inserted for ");
2500   print_generic_expr (file, name, 0);
2501   fprintf (file, "\n");
2502
2503   loc = asserts_for[SSA_NAME_VERSION (name)];
2504   while (loc)
2505     {
2506       fprintf (file, "\t");
2507       print_generic_expr (file, bsi_stmt (loc->si), 0);
2508       fprintf (file, "\n\tBB #%d", loc->bb->index);
2509       if (loc->e)
2510         {
2511           fprintf (file, "\n\tEDGE %d->%d", loc->e->src->index,
2512                    loc->e->dest->index);
2513           dump_edge_info (file, loc->e, 0);
2514         }
2515       fprintf (file, "\n\tPREDICATE: ");
2516       print_generic_expr (file, name, 0);
2517       fprintf (file, " %s ", tree_code_name[(int)loc->comp_code]);
2518       print_generic_expr (file, loc->val, 0);
2519       fprintf (file, "\n\n");
2520       loc = loc->next;
2521     }
2522
2523   fprintf (file, "\n");
2524 }
2525
2526
2527 /* Dump all the registered assertions for NAME to stderr.  */
2528
2529 void
2530 debug_asserts_for (tree name)
2531 {
2532   dump_asserts_for (stderr, name);
2533 }
2534
2535
2536 /* Dump all the registered assertions for all the names to FILE.  */
2537
2538 void
2539 dump_all_asserts (FILE *file)
2540 {
2541   unsigned i;
2542   bitmap_iterator bi;
2543
2544   fprintf (file, "\nASSERT_EXPRs to be inserted\n\n");
2545   EXECUTE_IF_SET_IN_BITMAP (need_assert_for, 0, i, bi)
2546     dump_asserts_for (file, ssa_name (i));
2547   fprintf (file, "\n");
2548 }
2549
2550
2551 /* Dump all the registered assertions for all the names to stderr.  */
2552
2553 void
2554 debug_all_asserts (void)
2555 {
2556   dump_all_asserts (stderr);
2557 }
2558
2559
2560 /* If NAME doesn't have an ASSERT_EXPR registered for asserting
2561    'NAME COMP_CODE VAL' at a location that dominates block BB or
2562    E->DEST, then register this location as a possible insertion point
2563    for ASSERT_EXPR <NAME, NAME COMP_CODE VAL>.
2564
2565    BB, E and SI provide the exact insertion point for the new
2566    ASSERT_EXPR.  If BB is NULL, then the ASSERT_EXPR is to be inserted
2567    on edge E.  Otherwise, if E is NULL, the ASSERT_EXPR is inserted on
2568    BB.  If SI points to a COND_EXPR or a SWITCH_EXPR statement, then E
2569    must not be NULL.  */
2570
2571 static void
2572 register_new_assert_for (tree name,
2573                          enum tree_code comp_code,
2574                          tree val,
2575                          basic_block bb,
2576                          edge e,
2577                          block_stmt_iterator si)
2578 {
2579   assert_locus_t n, loc, last_loc;
2580   bool found;
2581   basic_block dest_bb;
2582
2583 #if defined ENABLE_CHECKING
2584   gcc_assert (bb == NULL || e == NULL);
2585
2586   if (e == NULL)
2587     gcc_assert (TREE_CODE (bsi_stmt (si)) != COND_EXPR
2588                 && TREE_CODE (bsi_stmt (si)) != SWITCH_EXPR);
2589 #endif
2590
2591   /* The new assertion A will be inserted at BB or E.  We need to
2592      determine if the new location is dominated by a previously
2593      registered location for A.  If we are doing an edge insertion,
2594      assume that A will be inserted at E->DEST.  Note that this is not
2595      necessarily true.
2596      
2597      If E is a critical edge, it will be split.  But even if E is
2598      split, the new block will dominate the same set of blocks that
2599      E->DEST dominates.
2600      
2601      The reverse, however, is not true, blocks dominated by E->DEST
2602      will not be dominated by the new block created to split E.  So,
2603      if the insertion location is on a critical edge, we will not use
2604      the new location to move another assertion previously registered
2605      at a block dominated by E->DEST.  */
2606   dest_bb = (bb) ? bb : e->dest;
2607
2608   /* If NAME already has an ASSERT_EXPR registered for COMP_CODE and
2609      VAL at a block dominating DEST_BB, then we don't need to insert a new
2610      one.  Similarly, if the same assertion already exists at a block
2611      dominated by DEST_BB and the new location is not on a critical
2612      edge, then update the existing location for the assertion (i.e.,
2613      move the assertion up in the dominance tree).
2614
2615      Note, this is implemented as a simple linked list because there
2616      should not be more than a handful of assertions registered per
2617      name.  If this becomes a performance problem, a table hashed by
2618      COMP_CODE and VAL could be implemented.  */
2619   loc = asserts_for[SSA_NAME_VERSION (name)];
2620   last_loc = loc;
2621   found = false;
2622   while (loc)
2623     {
2624       if (loc->comp_code == comp_code
2625           && (loc->val == val
2626               || operand_equal_p (loc->val, val, 0)))
2627         {
2628           /* If the assertion NAME COMP_CODE VAL has already been
2629              registered at a basic block that dominates DEST_BB, then
2630              we don't need to insert the same assertion again.  Note
2631              that we don't check strict dominance here to avoid
2632              replicating the same assertion inside the same basic
2633              block more than once (e.g., when a pointer is
2634              dereferenced several times inside a block).
2635
2636              An exception to this rule are edge insertions.  If the
2637              new assertion is to be inserted on edge E, then it will
2638              dominate all the other insertions that we may want to
2639              insert in DEST_BB.  So, if we are doing an edge
2640              insertion, don't do this dominance check.  */
2641           if (e == NULL
2642               && dominated_by_p (CDI_DOMINATORS, dest_bb, loc->bb))
2643             return;
2644
2645           /* Otherwise, if E is not a critical edge and DEST_BB
2646              dominates the existing location for the assertion, move
2647              the assertion up in the dominance tree by updating its
2648              location information.  */
2649           if ((e == NULL || !EDGE_CRITICAL_P (e))
2650               && dominated_by_p (CDI_DOMINATORS, loc->bb, dest_bb))
2651             {
2652               loc->bb = dest_bb;
2653               loc->e = e;
2654               loc->si = si;
2655               return;
2656             }
2657         }
2658
2659       /* Update the last node of the list and move to the next one.  */
2660       last_loc = loc;
2661       loc = loc->next;
2662     }
2663
2664   /* If we didn't find an assertion already registered for
2665      NAME COMP_CODE VAL, add a new one at the end of the list of
2666      assertions associated with NAME.  */
2667   n = XNEW (struct assert_locus_d);
2668   n->bb = dest_bb;
2669   n->e = e;
2670   n->si = si;
2671   n->comp_code = comp_code;
2672   n->val = val;
2673   n->next = NULL;
2674
2675   if (last_loc)
2676     last_loc->next = n;
2677   else
2678     asserts_for[SSA_NAME_VERSION (name)] = n;
2679
2680   bitmap_set_bit (need_assert_for, SSA_NAME_VERSION (name));
2681 }
2682
2683
2684 /* Try to register an edge assertion for SSA name NAME on edge E for
2685    the conditional jump pointed to by SI.  Return true if an assertion
2686    for NAME could be registered.  */
2687
2688 static bool
2689 register_edge_assert_for (tree name, edge e, block_stmt_iterator si)
2690 {
2691   tree val, stmt;
2692   enum tree_code comp_code;
2693
2694   stmt = bsi_stmt (si);
2695
2696   /* Do not attempt to infer anything in names that flow through
2697      abnormal edges.  */
2698   if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name))
2699     return false;
2700
2701   /* If NAME was not found in the sub-graph reachable from E, then
2702      there's nothing to do.  */
2703   if (!TEST_BIT (found_in_subgraph, SSA_NAME_VERSION (name)))
2704     return false;
2705
2706   /* We found a use of NAME in the sub-graph rooted at E->DEST.
2707      Register an assertion for NAME according to the value that NAME
2708      takes on edge E.  */
2709   if (TREE_CODE (stmt) == COND_EXPR)
2710     {
2711       /* If BB ends in a COND_EXPR then NAME then we should insert
2712          the original predicate on EDGE_TRUE_VALUE and the
2713          opposite predicate on EDGE_FALSE_VALUE.  */
2714       tree cond = COND_EXPR_COND (stmt);
2715       bool is_else_edge = (e->flags & EDGE_FALSE_VALUE) != 0;
2716
2717       /* Predicates may be a single SSA name or NAME OP VAL.  */
2718       if (cond == name)
2719         {
2720           /* If the predicate is a name, it must be NAME, in which
2721              case we create the predicate NAME == true or
2722              NAME == false accordingly.  */
2723           comp_code = EQ_EXPR;
2724           val = (is_else_edge) ? boolean_false_node : boolean_true_node;
2725         }
2726       else
2727         {
2728           /* Otherwise, we have a comparison of the form NAME COMP VAL
2729              or VAL COMP NAME.  */
2730           if (name == TREE_OPERAND (cond, 1))
2731             {
2732               /* If the predicate is of the form VAL COMP NAME, flip
2733                  COMP around because we need to register NAME as the
2734                  first operand in the predicate.  */
2735               comp_code = swap_tree_comparison (TREE_CODE (cond));
2736               val = TREE_OPERAND (cond, 0);
2737             }
2738           else
2739             {
2740               /* The comparison is of the form NAME COMP VAL, so the
2741                  comparison code remains unchanged.  */
2742               comp_code = TREE_CODE (cond);
2743               val = TREE_OPERAND (cond, 1);
2744             }
2745
2746           /* If we are inserting the assertion on the ELSE edge, we
2747              need to invert the sign comparison.  */
2748           if (is_else_edge)
2749             comp_code = invert_tree_comparison (comp_code, 0);
2750
2751           /* Do not register always-false predicates.  FIXME, this
2752              works around a limitation in fold() when dealing with
2753              enumerations.  Given 'enum { N1, N2 } x;', fold will not
2754              fold 'if (x > N2)' to 'if (0)'.  */
2755           if ((comp_code == GT_EXPR || comp_code == LT_EXPR)
2756               && (INTEGRAL_TYPE_P (TREE_TYPE (val))
2757                   || SCALAR_FLOAT_TYPE_P (TREE_TYPE (val))))
2758             {
2759               tree min = TYPE_MIN_VALUE (TREE_TYPE (val));
2760               tree max = TYPE_MAX_VALUE (TREE_TYPE (val));
2761
2762               if (comp_code == GT_EXPR && compare_values (val, max) == 0)
2763                 return false;
2764
2765               if (comp_code == LT_EXPR && compare_values (val, min) == 0)
2766                 return false;
2767             }
2768         }
2769     }
2770   else
2771     {
2772       /* FIXME.  Handle SWITCH_EXPR.  */
2773       gcc_unreachable ();
2774     }
2775
2776   register_new_assert_for (name, comp_code, val, NULL, e, si);
2777   return true;
2778 }
2779
2780
2781 static bool find_assert_locations (basic_block bb);
2782
2783 /* Determine whether the outgoing edges of BB should receive an
2784    ASSERT_EXPR for each of the operands of BB's last statement.  The
2785    last statement of BB must be a COND_EXPR or a SWITCH_EXPR.
2786
2787    If any of the sub-graphs rooted at BB have an interesting use of
2788    the predicate operands, an assert location node is added to the
2789    list of assertions for the corresponding operands.  */
2790
2791 static bool
2792 find_conditional_asserts (basic_block bb)
2793 {
2794   bool need_assert;
2795   block_stmt_iterator last_si;
2796   tree op, last;
2797   edge_iterator ei;
2798   edge e;
2799   ssa_op_iter iter;
2800
2801   need_assert = false;
2802   last_si = bsi_last (bb);
2803   last = bsi_stmt (last_si);
2804
2805   /* Look for uses of the operands in each of the sub-graphs
2806      rooted at BB.  We need to check each of the outgoing edges
2807      separately, so that we know what kind of ASSERT_EXPR to
2808      insert.  */
2809   FOR_EACH_EDGE (e, ei, bb->succs)
2810     {
2811       if (e->dest == bb)
2812         continue;
2813
2814       /* Remove the COND_EXPR operands from the FOUND_IN_SUBGRAPH bitmap.
2815          Otherwise, when we finish traversing each of the sub-graphs, we
2816          won't know whether the variables were found in the sub-graphs or
2817          if they had been found in a block upstream from BB. 
2818
2819          This is actually a bad idea is some cases, particularly jump
2820          threading.  Consider a CFG like the following:
2821
2822                     0
2823                    /|
2824                   1 |
2825                    \|
2826                     2
2827                    / \
2828                   3   4
2829
2830          Assume that one or more operands in the conditional at the
2831          end of block 0 are used in a conditional in block 2, but not
2832          anywhere in block 1.  In this case we will not insert any
2833          assert statements in block 1, which may cause us to miss
2834          opportunities to optimize, particularly for jump threading.  */
2835       FOR_EACH_SSA_TREE_OPERAND (op, last, iter, SSA_OP_USE)
2836         RESET_BIT (found_in_subgraph, SSA_NAME_VERSION (op));
2837
2838       /* Traverse the strictly dominated sub-graph rooted at E->DEST
2839          to determine if any of the operands in the conditional
2840          predicate are used.  */
2841       if (e->dest != bb)
2842         need_assert |= find_assert_locations (e->dest);
2843
2844       /* Register the necessary assertions for each operand in the
2845          conditional predicate.  */
2846       FOR_EACH_SSA_TREE_OPERAND (op, last, iter, SSA_OP_USE)
2847         need_assert |= register_edge_assert_for (op, e, last_si);
2848     }
2849
2850   /* Finally, indicate that we have found the operands in the
2851      conditional.  */
2852   FOR_EACH_SSA_TREE_OPERAND (op, last, iter, SSA_OP_USE)
2853     SET_BIT (found_in_subgraph, SSA_NAME_VERSION (op));
2854
2855   return need_assert;
2856 }
2857
2858
2859 /* Traverse all the statements in block BB looking for statements that
2860    may generate useful assertions for the SSA names in their operand.
2861    If a statement produces a useful assertion A for name N_i, then the
2862    list of assertions already generated for N_i is scanned to
2863    determine if A is actually needed.
2864    
2865    If N_i already had the assertion A at a location dominating the
2866    current location, then nothing needs to be done.  Otherwise, the
2867    new location for A is recorded instead.
2868
2869    1- For every statement S in BB, all the variables used by S are
2870       added to bitmap FOUND_IN_SUBGRAPH.
2871
2872    2- If statement S uses an operand N in a way that exposes a known
2873       value range for N, then if N was not already generated by an
2874       ASSERT_EXPR, create a new assert location for N.  For instance,
2875       if N is a pointer and the statement dereferences it, we can
2876       assume that N is not NULL.
2877
2878    3- COND_EXPRs are a special case of #2.  We can derive range
2879       information from the predicate but need to insert different
2880       ASSERT_EXPRs for each of the sub-graphs rooted at the
2881       conditional block.  If the last statement of BB is a conditional
2882       expression of the form 'X op Y', then
2883
2884       a) Remove X and Y from the set FOUND_IN_SUBGRAPH.
2885
2886       b) If the conditional is the only entry point to the sub-graph
2887          corresponding to the THEN_CLAUSE, recurse into it.  On
2888          return, if X and/or Y are marked in FOUND_IN_SUBGRAPH, then
2889          an ASSERT_EXPR is added for the corresponding variable.
2890
2891       c) Repeat step (b) on the ELSE_CLAUSE.
2892
2893       d) Mark X and Y in FOUND_IN_SUBGRAPH.
2894
2895       For instance,
2896
2897             if (a == 9)
2898               b = a;
2899             else
2900               b = c + 1;
2901
2902       In this case, an assertion on the THEN clause is useful to
2903       determine that 'a' is always 9 on that edge.  However, an assertion
2904       on the ELSE clause would be unnecessary.
2905
2906    4- If BB does not end in a conditional expression, then we recurse
2907       into BB's dominator children.
2908    
2909    At the end of the recursive traversal, every SSA name will have a
2910    list of locations where ASSERT_EXPRs should be added.  When a new
2911    location for name N is found, it is registered by calling
2912    register_new_assert_for.  That function keeps track of all the
2913    registered assertions to prevent adding unnecessary assertions.
2914    For instance, if a pointer P_4 is dereferenced more than once in a
2915    dominator tree, only the location dominating all the dereference of
2916    P_4 will receive an ASSERT_EXPR.
2917
2918    If this function returns true, then it means that there are names
2919    for which we need to generate ASSERT_EXPRs.  Those assertions are
2920    inserted by process_assert_insertions.
2921
2922    TODO.  Handle SWITCH_EXPR.  */
2923
2924 static bool
2925 find_assert_locations (basic_block bb)
2926 {
2927   block_stmt_iterator si;
2928   tree last, phi;
2929   bool need_assert;
2930   basic_block son;
2931
2932   if (TEST_BIT (blocks_visited, bb->index))
2933     return false;
2934
2935   SET_BIT (blocks_visited, bb->index);
2936
2937   need_assert = false;
2938
2939   /* Traverse all PHI nodes in BB marking used operands.  */
2940   for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
2941     {
2942       use_operand_p arg_p;
2943       ssa_op_iter i;
2944
2945       FOR_EACH_PHI_ARG (arg_p, phi, i, SSA_OP_USE)
2946         {
2947           tree arg = USE_FROM_PTR (arg_p);
2948           if (TREE_CODE (arg) == SSA_NAME)
2949             {
2950               gcc_assert (is_gimple_reg (PHI_RESULT (phi)));
2951               SET_BIT (found_in_subgraph, SSA_NAME_VERSION (arg));
2952             }
2953         }
2954     }
2955
2956   /* Traverse all the statements in BB marking used names and looking
2957      for statements that may infer assertions for their used operands.  */
2958   last = NULL_TREE;
2959   for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
2960     {
2961       tree stmt, op;
2962       ssa_op_iter i;
2963
2964       stmt = bsi_stmt (si);
2965
2966       /* See if we can derive an assertion for any of STMT's operands.  */
2967       FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_USE)
2968         {
2969           tree value;
2970           enum tree_code comp_code;
2971
2972           /* Mark OP in bitmap FOUND_IN_SUBGRAPH.  If STMT is inside
2973              the sub-graph of a conditional block, when we return from
2974              this recursive walk, our parent will use the
2975              FOUND_IN_SUBGRAPH bitset to determine if one of the
2976              operands it was looking for was present in the sub-graph.  */
2977           SET_BIT (found_in_subgraph, SSA_NAME_VERSION (op));
2978
2979           /* If OP is used in such a way that we can infer a value
2980              range for it, and we don't find a previous assertion for
2981              it, create a new assertion location node for OP.  */
2982           if (infer_value_range (stmt, op, &comp_code, &value))
2983             {
2984               /* If we are able to infer a non-zero value range for OP,
2985                  then walk backwards through the use-def chain to see if OP
2986                  was set via a typecast.
2987
2988                  If so, then we can also infer a nonzero value range
2989                  for the operand of the NOP_EXPR.  */
2990               if (comp_code == NE_EXPR && integer_zerop (value))
2991                 {
2992                   tree t = op;
2993                   tree def_stmt = SSA_NAME_DEF_STMT (t);
2994         
2995                   while (TREE_CODE (def_stmt) == MODIFY_EXPR
2996                          && TREE_CODE (TREE_OPERAND (def_stmt, 1)) == NOP_EXPR
2997                          && TREE_CODE (TREE_OPERAND (TREE_OPERAND (def_stmt, 1), 0)) == SSA_NAME
2998                          && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (def_stmt, 1), 0))))
2999                     {
3000                       t = TREE_OPERAND (TREE_OPERAND (def_stmt, 1), 0);
3001                       def_stmt = SSA_NAME_DEF_STMT (t);
3002
3003                       /* Note we want to register the assert for the
3004                          operand of the NOP_EXPR after SI, not after the
3005                          conversion.  */
3006                       if (! has_single_use (t))
3007                         {
3008                           register_new_assert_for (t, comp_code, value,
3009                                                    bb, NULL, si);
3010                           need_assert = true;
3011                         }
3012                     }
3013                 }
3014
3015               /* If OP is used only once, namely in this STMT, don't
3016                  bother creating an ASSERT_EXPR for it.  Such an
3017                  ASSERT_EXPR would do nothing but increase compile time.  */
3018               if (!has_single_use (op))
3019                 {
3020                   register_new_assert_for (op, comp_code, value, bb, NULL, si);
3021                   need_assert = true;
3022                 }
3023             }
3024         }
3025
3026       /* Remember the last statement of the block.  */
3027       last = stmt;
3028     }
3029
3030   /* If BB's last statement is a conditional expression
3031      involving integer operands, recurse into each of the sub-graphs
3032      rooted at BB to determine if we need to add ASSERT_EXPRs.  */
3033   if (last
3034       && TREE_CODE (last) == COND_EXPR
3035       && !fp_predicate (COND_EXPR_COND (last))
3036       && !ZERO_SSA_OPERANDS (last, SSA_OP_USE))
3037     need_assert |= find_conditional_asserts (bb);
3038
3039   /* Recurse into the dominator children of BB.  */
3040   for (son = first_dom_son (CDI_DOMINATORS, bb);
3041        son;
3042        son = next_dom_son (CDI_DOMINATORS, son))
3043     need_assert |= find_assert_locations (son);
3044
3045   return need_assert;
3046 }
3047
3048
3049 /* Create an ASSERT_EXPR for NAME and insert it in the location
3050    indicated by LOC.  Return true if we made any edge insertions.  */
3051
3052 static bool
3053 process_assert_insertions_for (tree name, assert_locus_t loc)
3054 {
3055   /* Build the comparison expression NAME_i COMP_CODE VAL.  */
3056   tree stmt, cond, assert_expr;
3057   edge_iterator ei;
3058   edge e;
3059
3060   cond = build2 (loc->comp_code, boolean_type_node, name, loc->val);
3061   assert_expr = build_assert_expr_for (cond, name);
3062
3063   if (loc->e)
3064     {
3065       /* We have been asked to insert the assertion on an edge.  This
3066          is used only by COND_EXPR and SWITCH_EXPR assertions.  */
3067 #if defined ENABLE_CHECKING
3068       gcc_assert (TREE_CODE (bsi_stmt (loc->si)) == COND_EXPR
3069           || TREE_CODE (bsi_stmt (loc->si)) == SWITCH_EXPR);
3070 #endif
3071
3072       bsi_insert_on_edge (loc->e, assert_expr);
3073       return true;
3074     }
3075
3076   /* Otherwise, we can insert right after LOC->SI iff the
3077      statement must not be the last statement in the block.  */
3078   stmt = bsi_stmt (loc->si);
3079   if (!stmt_ends_bb_p (stmt))
3080     {
3081       bsi_insert_after (&loc->si, assert_expr, BSI_SAME_STMT);
3082       return false;
3083     }
3084
3085   /* If STMT must be the last statement in BB, we can only insert new
3086      assertions on the non-abnormal edge out of BB.  Note that since
3087      STMT is not control flow, there may only be one non-abnormal edge
3088      out of BB.  */
3089   FOR_EACH_EDGE (e, ei, loc->bb->succs)
3090     if (!(e->flags & EDGE_ABNORMAL))
3091       {
3092         bsi_insert_on_edge (e, assert_expr);
3093         return true;
3094       }
3095
3096   gcc_unreachable ();
3097 }
3098
3099
3100 /* Process all the insertions registered for every name N_i registered
3101    in NEED_ASSERT_FOR.  The list of assertions to be inserted are
3102    found in ASSERTS_FOR[i].  */
3103
3104 static void
3105 process_assert_insertions (void)
3106 {
3107   unsigned i;
3108   bitmap_iterator bi;
3109   bool update_edges_p = false;
3110   int num_asserts = 0;
3111
3112   if (dump_file && (dump_flags & TDF_DETAILS))
3113     dump_all_asserts (dump_file);
3114
3115   EXECUTE_IF_SET_IN_BITMAP (need_assert_for, 0, i, bi)
3116     {
3117       assert_locus_t loc = asserts_for[i];
3118       gcc_assert (loc);
3119
3120       while (loc)
3121         {
3122           assert_locus_t next = loc->next;
3123           update_edges_p |= process_assert_insertions_for (ssa_name (i), loc);
3124           free (loc);
3125           loc = next;
3126           num_asserts++;
3127         }
3128     }
3129
3130   if (update_edges_p)
3131     bsi_commit_edge_inserts ();
3132
3133   if (dump_file && (dump_flags & TDF_STATS))
3134     fprintf (dump_file, "\nNumber of ASSERT_EXPR expressions inserted: %d\n\n",
3135              num_asserts);
3136 }
3137
3138
3139 /* Traverse the flowgraph looking for conditional jumps to insert range
3140    expressions.  These range expressions are meant to provide information
3141    to optimizations that need to reason in terms of value ranges.  They
3142    will not be expanded into RTL.  For instance, given:
3143
3144    x = ...
3145    y = ...
3146    if (x < y)
3147      y = x - 2;
3148    else
3149      x = y + 3;
3150
3151    this pass will transform the code into:
3152
3153    x = ...
3154    y = ...
3155    if (x < y)
3156     {
3157       x = ASSERT_EXPR <x, x < y>
3158       y = x - 2
3159     }
3160    else
3161     {
3162       y = ASSERT_EXPR <y, x <= y>
3163       x = y + 3
3164     }
3165
3166    The idea is that once copy and constant propagation have run, other
3167    optimizations will be able to determine what ranges of values can 'x'
3168    take in different paths of the code, simply by checking the reaching
3169    definition of 'x'.  */
3170
3171 static void
3172 insert_range_assertions (void)
3173 {
3174   edge e;
3175   edge_iterator ei;
3176   bool update_ssa_p;
3177   
3178   found_in_subgraph = sbitmap_alloc (num_ssa_names);
3179   sbitmap_zero (found_in_subgraph);
3180
3181   blocks_visited = sbitmap_alloc (last_basic_block);
3182   sbitmap_zero (blocks_visited);
3183
3184   need_assert_for = BITMAP_ALLOC (NULL);
3185   asserts_for = XNEWVEC (assert_locus_t, num_ssa_names);
3186   memset (asserts_for, 0, num_ssa_names * sizeof (assert_locus_t));
3187
3188   calculate_dominance_info (CDI_DOMINATORS);
3189
3190   update_ssa_p = false;
3191   FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
3192     if (find_assert_locations (e->dest))
3193       update_ssa_p = true;
3194
3195   if (update_ssa_p)
3196     {
3197       process_assert_insertions ();
3198       update_ssa (TODO_update_ssa_no_phi);
3199     }
3200
3201   if (dump_file && (dump_flags & TDF_DETAILS))
3202     {
3203       fprintf (dump_file, "\nSSA form after inserting ASSERT_EXPRs\n");
3204       dump_function_to_file (current_function_decl, dump_file, dump_flags);
3205     }
3206
3207   sbitmap_free (found_in_subgraph);
3208   free (asserts_for);
3209   BITMAP_FREE (need_assert_for);
3210 }
3211
3212
3213 /* Convert range assertion expressions into the implied copies and
3214    copy propagate away the copies.  Doing the trivial copy propagation
3215    here avoids the need to run the full copy propagation pass after
3216    VRP. 
3217    
3218    FIXME, this will eventually lead to copy propagation removing the
3219    names that had useful range information attached to them.  For
3220    instance, if we had the assertion N_i = ASSERT_EXPR <N_j, N_j > 3>,
3221    then N_i will have the range [3, +INF].
3222    
3223    However, by converting the assertion into the implied copy
3224    operation N_i = N_j, we will then copy-propagate N_j into the uses
3225    of N_i and lose the range information.  We may want to hold on to
3226    ASSERT_EXPRs a little while longer as the ranges could be used in
3227    things like jump threading.
3228    
3229    The problem with keeping ASSERT_EXPRs around is that passes after
3230    VRP need to handle them appropriately. 
3231
3232    Another approach would be to make the range information a first
3233    class property of the SSA_NAME so that it can be queried from
3234    any pass.  This is made somewhat more complex by the need for
3235    multiple ranges to be associated with one SSA_NAME.  */
3236
3237 static void
3238 remove_range_assertions (void)
3239 {
3240   basic_block bb;
3241   block_stmt_iterator si;
3242
3243   /* Note that the BSI iterator bump happens at the bottom of the
3244      loop and no bump is necessary if we're removing the statement
3245      referenced by the current BSI.  */
3246   FOR_EACH_BB (bb)
3247     for (si = bsi_start (bb); !bsi_end_p (si);)
3248       {
3249         tree stmt = bsi_stmt (si);
3250
3251         if (TREE_CODE (stmt) == MODIFY_EXPR
3252             && TREE_CODE (TREE_OPERAND (stmt, 1)) == ASSERT_EXPR)
3253           {
3254             tree rhs = TREE_OPERAND (stmt, 1), var;
3255             tree cond = fold (ASSERT_EXPR_COND (rhs));
3256             use_operand_p use_p;
3257             imm_use_iterator iter;
3258
3259             gcc_assert (cond != boolean_false_node);
3260
3261             /* Propagate the RHS into every use of the LHS.  */
3262             var = ASSERT_EXPR_VAR (rhs);
3263             FOR_EACH_IMM_USE_SAFE (use_p, iter, TREE_OPERAND (stmt, 0))
3264               {
3265                 SET_USE (use_p, var);
3266                 gcc_assert (TREE_CODE (var) == SSA_NAME);
3267               }
3268
3269             /* And finally, remove the copy, it is not needed.  */
3270             bsi_remove (&si, true);
3271           }
3272         else
3273           bsi_next (&si);
3274       }
3275
3276   sbitmap_free (blocks_visited);
3277 }
3278
3279
3280 /* Return true if STMT is interesting for VRP.  */
3281
3282 static bool
3283 stmt_interesting_for_vrp (tree stmt)
3284 {
3285   if (TREE_CODE (stmt) == PHI_NODE
3286       && is_gimple_reg (PHI_RESULT (stmt))
3287       && (INTEGRAL_TYPE_P (TREE_TYPE (PHI_RESULT (stmt)))
3288           || POINTER_TYPE_P (TREE_TYPE (PHI_RESULT (stmt)))))
3289     return true;
3290   else if (TREE_CODE (stmt) == MODIFY_EXPR)
3291     {
3292       tree lhs = TREE_OPERAND (stmt, 0);
3293       tree rhs = TREE_OPERAND (stmt, 1);
3294
3295       /* In general, assignments with virtual operands are not useful
3296          for deriving ranges, with the obvious exception of calls to
3297          builtin functions.  */
3298       if (TREE_CODE (lhs) == SSA_NAME
3299           && (INTEGRAL_TYPE_P (TREE_TYPE (lhs))
3300               || POINTER_TYPE_P (TREE_TYPE (lhs)))
3301           && ((TREE_CODE (rhs) == CALL_EXPR
3302                && TREE_CODE (TREE_OPERAND (rhs, 0)) == ADDR_EXPR
3303                && DECL_P (TREE_OPERAND (TREE_OPERAND (rhs, 0), 0))
3304                && DECL_IS_BUILTIN (TREE_OPERAND (TREE_OPERAND (rhs, 0), 0)))
3305               || ZERO_SSA_OPERANDS (stmt, SSA_OP_ALL_VIRTUALS)))
3306         return true;
3307     }
3308   else if (TREE_CODE (stmt) == COND_EXPR || TREE_CODE (stmt) == SWITCH_EXPR)
3309     return true;
3310
3311   return false;
3312 }
3313
3314
3315 /* Initialize local data structures for VRP.  */
3316
3317 static void
3318 vrp_initialize (void)
3319 {
3320   basic_block bb;
3321
3322   vr_value = XNEWVEC (value_range_t *, num_ssa_names);
3323   memset (vr_value, 0, num_ssa_names * sizeof (value_range_t *));
3324
3325   FOR_EACH_BB (bb)
3326     {
3327       block_stmt_iterator si;
3328       tree phi;
3329
3330       for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
3331         {
3332           if (!stmt_interesting_for_vrp (phi))
3333             {
3334               tree lhs = PHI_RESULT (phi);
3335               set_value_range_to_varying (get_value_range (lhs));
3336               DONT_SIMULATE_AGAIN (phi) = true;
3337             }
3338           else
3339             DONT_SIMULATE_AGAIN (phi) = false;
3340         }
3341
3342       for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
3343         {
3344           tree stmt = bsi_stmt (si);
3345
3346           if (!stmt_interesting_for_vrp (stmt))
3347             {
3348               ssa_op_iter i;
3349               tree def;
3350               FOR_EACH_SSA_TREE_OPERAND (def, stmt, i, SSA_OP_DEF)
3351                 set_value_range_to_varying (get_value_range (def));
3352               DONT_SIMULATE_AGAIN (stmt) = true;
3353             }
3354           else
3355             {
3356               DONT_SIMULATE_AGAIN (stmt) = false;
3357             }
3358         }
3359     }
3360 }
3361
3362
3363 /* Visit assignment STMT.  If it produces an interesting range, record
3364    the SSA name in *OUTPUT_P.  */
3365
3366 static enum ssa_prop_result
3367 vrp_visit_assignment (tree stmt, tree *output_p)
3368 {
3369   tree lhs, rhs, def;
3370   ssa_op_iter iter;
3371
3372   lhs = TREE_OPERAND (stmt, 0);
3373   rhs = TREE_OPERAND (stmt, 1);
3374
3375   /* We only keep track of ranges in integral and pointer types.  */
3376   if (TREE_CODE (lhs) == SSA_NAME
3377       && ((INTEGRAL_TYPE_P (TREE_TYPE (lhs))
3378            /* It is valid to have NULL MIN/MAX values on a type.  See
3379               build_range_type.  */
3380            && TYPE_MIN_VALUE (TREE_TYPE (lhs))
3381            && TYPE_MAX_VALUE (TREE_TYPE (lhs)))
3382           || POINTER_TYPE_P (TREE_TYPE (lhs))))
3383     {
3384       struct loop *l;
3385       value_range_t new_vr = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
3386
3387       extract_range_from_expr (&new_vr, rhs);
3388
3389       /* If STMT is inside a loop, we may be able to know something
3390          else about the range of LHS by examining scalar evolution
3391          information.  */
3392       if (current_loops && (l = loop_containing_stmt (stmt)))
3393         adjust_range_with_scev (&new_vr, l, stmt, lhs);
3394
3395       if (update_value_range (lhs, &new_vr))
3396         {
3397           *output_p = lhs;
3398
3399           if (dump_file && (dump_flags & TDF_DETAILS))
3400             {
3401               fprintf (dump_file, "Found new range for ");
3402               print_generic_expr (dump_file, lhs, 0);
3403               fprintf (dump_file, ": ");
3404               dump_value_range (dump_file, &new_vr);
3405               fprintf (dump_file, "\n\n");
3406             }
3407
3408           if (new_vr.type == VR_VARYING)
3409             return SSA_PROP_VARYING;
3410
3411           return SSA_PROP_INTERESTING;
3412         }
3413
3414       return SSA_PROP_NOT_INTERESTING;
3415     }
3416   
3417   /* Every other statement produces no useful ranges.  */
3418   FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF)
3419     set_value_range_to_varying (get_value_range (def));
3420
3421   return SSA_PROP_VARYING;
3422 }
3423
3424
3425 /* Compare all the value ranges for names equivalent to VAR with VAL
3426    using comparison code COMP.  Return the same value returned by
3427    compare_range_with_value.  */
3428
3429 static tree
3430 compare_name_with_value (enum tree_code comp, tree var, tree val)
3431 {
3432   bitmap_iterator bi;
3433   unsigned i;
3434   bitmap e;
3435   tree retval, t;
3436   
3437   t = retval = NULL_TREE;
3438
3439   /* Get the set of equivalences for VAR.  */
3440   e = get_value_range (var)->equiv;
3441
3442   /* Add VAR to its own set of equivalences so that VAR's value range
3443      is processed by this loop (otherwise, we would have to replicate
3444      the body of the loop just to check VAR's value range).  */
3445   bitmap_set_bit (e, SSA_NAME_VERSION (var));
3446
3447   EXECUTE_IF_SET_IN_BITMAP (e, 0, i, bi)
3448     {
3449       value_range_t equiv_vr = *(vr_value[i]);
3450
3451       /* If name N_i does not have a valid range, use N_i as its own
3452          range.  This allows us to compare against names that may
3453          have N_i in their ranges.  */
3454       if (equiv_vr.type == VR_VARYING || equiv_vr.type == VR_UNDEFINED)
3455         {
3456           equiv_vr.type = VR_RANGE;
3457           equiv_vr.min = ssa_name (i);
3458           equiv_vr.max = ssa_name (i);
3459         }
3460
3461       t = compare_range_with_value (comp, &equiv_vr, val);
3462       if (t)
3463         {
3464           /* All the ranges should compare the same against VAL.  */
3465           gcc_assert (retval == NULL || t == retval);
3466           retval = t;
3467         }
3468     }
3469
3470   /* Remove VAR from its own equivalence set.  */
3471   bitmap_clear_bit (e, SSA_NAME_VERSION (var));
3472
3473   if (retval)
3474     return retval;
3475
3476   /* We couldn't find a non-NULL value for the predicate.  */
3477   return NULL_TREE;
3478 }
3479
3480
3481 /* Given a comparison code COMP and names N1 and N2, compare all the
3482    ranges equivalent to N1 against all the ranges equivalent to N2
3483    to determine the value of N1 COMP N2.  Return the same value
3484    returned by compare_ranges.  */
3485
3486 static tree
3487 compare_names (enum tree_code comp, tree n1, tree n2)
3488 {
3489   tree t, retval;
3490   bitmap e1, e2;
3491   bitmap_iterator bi1, bi2;
3492   unsigned i1, i2;
3493
3494   /* Compare the ranges of every name equivalent to N1 against the
3495      ranges of every name equivalent to N2.  */
3496   e1 = get_value_range (n1)->equiv;
3497   e2 = get_value_range (n2)->equiv;
3498
3499   /* Add N1 and N2 to their own set of equivalences to avoid
3500      duplicating the body of the loop just to check N1 and N2
3501      ranges.  */
3502   bitmap_set_bit (e1, SSA_NAME_VERSION (n1));
3503   bitmap_set_bit (e2, SSA_NAME_VERSION (n2));
3504
3505   /* If the equivalence sets have a common intersection, then the two
3506      names can be compared without checking their ranges.  */
3507   if (bitmap_intersect_p (e1, e2))
3508     {
3509       bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
3510       bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
3511
3512       return (comp == EQ_EXPR || comp == GE_EXPR || comp == LE_EXPR)
3513              ? boolean_true_node
3514              : boolean_false_node;
3515     }
3516
3517   /* Otherwise, compare all the equivalent ranges.  First, add N1 and
3518      N2 to their own set of equivalences to avoid duplicating the body
3519      of the loop just to check N1 and N2 ranges.  */
3520   EXECUTE_IF_SET_IN_BITMAP (e1, 0, i1, bi1)
3521     {
3522       value_range_t vr1 = *(vr_value[i1]);
3523
3524       /* If the range is VARYING or UNDEFINED, use the name itself.  */
3525       if (vr1.type == VR_VARYING || vr1.type == VR_UNDEFINED)
3526         {
3527           vr1.type = VR_RANGE;
3528           vr1.min = ssa_name (i1);
3529           vr1.max = ssa_name (i1);
3530         }
3531
3532       t = retval = NULL_TREE;
3533       EXECUTE_IF_SET_IN_BITMAP (e2, 0, i2, bi2)
3534         {
3535           value_range_t vr2 = *(vr_value[i2]);
3536
3537           if (vr2.type == VR_VARYING || vr2.type == VR_UNDEFINED)
3538             {
3539               vr2.type = VR_RANGE;
3540               vr2.min = ssa_name (i2);
3541               vr2.max = ssa_name (i2);
3542             }
3543
3544           t = compare_ranges (comp, &vr1, &vr2);
3545           if (t)
3546             {
3547               /* All the ranges in the equivalent sets should compare
3548                  the same.  */
3549               gcc_assert (retval == NULL || t == retval);
3550               retval = t;
3551             }
3552         }
3553
3554       if (retval)
3555         {
3556           bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
3557           bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
3558           return retval;
3559         }
3560     }
3561
3562   /* None of the equivalent ranges are useful in computing this
3563      comparison.  */
3564   bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
3565   bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
3566   return NULL_TREE;
3567 }
3568
3569
3570 /* Given a conditional predicate COND, try to determine if COND yields
3571    true or false based on the value ranges of its operands.  Return
3572    BOOLEAN_TRUE_NODE if the conditional always evaluates to true,
3573    BOOLEAN_FALSE_NODE if the conditional always evaluates to false, and,
3574    NULL if the conditional cannot be evaluated at compile time.
3575
3576    If USE_EQUIV_P is true, the ranges of all the names equivalent with
3577    the operands in COND are used when trying to compute its value.
3578    This is only used during final substitution.  During propagation,
3579    we only check the range of each variable and not its equivalents.  */
3580
3581 tree
3582 vrp_evaluate_conditional (tree cond, bool use_equiv_p)
3583 {
3584   gcc_assert (TREE_CODE (cond) == SSA_NAME
3585               || TREE_CODE_CLASS (TREE_CODE (cond)) == tcc_comparison);
3586
3587   if (TREE_CODE (cond) == SSA_NAME)
3588     {
3589       value_range_t *vr;
3590       tree retval;
3591
3592       if (use_equiv_p)
3593         retval = compare_name_with_value (NE_EXPR, cond, boolean_false_node);
3594       else
3595         {
3596           value_range_t *vr = get_value_range (cond);
3597           retval = compare_range_with_value (NE_EXPR, vr, boolean_false_node);
3598         }
3599
3600       /* If COND has a known boolean range, return it.  */
3601       if (retval)
3602         return retval;
3603
3604       /* Otherwise, if COND has a symbolic range of exactly one value,
3605          return it.  */
3606       vr = get_value_range (cond);
3607       if (vr->type == VR_RANGE && vr->min == vr->max)
3608         return vr->min;
3609     }
3610   else
3611     {
3612       tree op0 = TREE_OPERAND (cond, 0);
3613       tree op1 = TREE_OPERAND (cond, 1);
3614
3615       /* We only deal with integral and pointer types.  */
3616       if (!INTEGRAL_TYPE_P (TREE_TYPE (op0))
3617           && !POINTER_TYPE_P (TREE_TYPE (op0)))
3618         return NULL_TREE;
3619
3620       if (use_equiv_p)
3621         {
3622           if (TREE_CODE (op0) == SSA_NAME && TREE_CODE (op1) == SSA_NAME)
3623             return compare_names (TREE_CODE (cond), op0, op1);
3624           else if (TREE_CODE (op0) == SSA_NAME)
3625             return compare_name_with_value (TREE_CODE (cond), op0, op1);
3626           else if (TREE_CODE (op1) == SSA_NAME)
3627             return compare_name_with_value (
3628                     swap_tree_comparison (TREE_CODE (cond)), op1, op0);
3629         }
3630       else
3631         {
3632           value_range_t *vr0, *vr1;
3633
3634           vr0 = (TREE_CODE (op0) == SSA_NAME) ? get_value_range (op0) : NULL;
3635           vr1 = (TREE_CODE (op1) == SSA_NAME) ? get_value_range (op1) : NULL;
3636
3637           if (vr0 && vr1)
3638             return compare_ranges (TREE_CODE (cond), vr0, vr1);
3639           else if (vr0 && vr1 == NULL)
3640             return compare_range_with_value (TREE_CODE (cond), vr0, op1);
3641           else if (vr0 == NULL && vr1)
3642             return compare_range_with_value (
3643                     swap_tree_comparison (TREE_CODE (cond)), vr1, op0);
3644         }
3645     }
3646
3647   /* Anything else cannot be computed statically.  */
3648   return NULL_TREE;
3649 }
3650
3651
3652 /* Visit conditional statement STMT.  If we can determine which edge
3653    will be taken out of STMT's basic block, record it in
3654    *TAKEN_EDGE_P and return SSA_PROP_INTERESTING.  Otherwise, return
3655    SSA_PROP_VARYING.  */
3656
3657 static enum ssa_prop_result
3658 vrp_visit_cond_stmt (tree stmt, edge *taken_edge_p)
3659 {
3660   tree cond, val;
3661
3662   *taken_edge_p = NULL;
3663
3664   /* FIXME.  Handle SWITCH_EXPRs.  But first, the assert pass needs to
3665      add ASSERT_EXPRs for them.  */
3666   if (TREE_CODE (stmt) == SWITCH_EXPR)
3667     return SSA_PROP_VARYING;
3668
3669   cond = COND_EXPR_COND (stmt);
3670
3671   if (dump_file && (dump_flags & TDF_DETAILS))
3672     {
3673       tree use;
3674       ssa_op_iter i;
3675
3676       fprintf (dump_file, "\nVisiting conditional with predicate: ");
3677       print_generic_expr (dump_file, cond, 0);
3678       fprintf (dump_file, "\nWith known ranges\n");
3679       
3680       FOR_EACH_SSA_TREE_OPERAND (use, stmt, i, SSA_OP_USE)
3681         {
3682           fprintf (dump_file, "\t");
3683           print_generic_expr (dump_file, use, 0);
3684           fprintf (dump_file, ": ");
3685           dump_value_range (dump_file, vr_value[SSA_NAME_VERSION (use)]);
3686         }
3687
3688       fprintf (dump_file, "\n");
3689     }
3690
3691   /* Compute the value of the predicate COND by checking the known
3692      ranges of each of its operands.
3693      
3694      Note that we cannot evaluate all the equivalent ranges here
3695      because those ranges may not yet be final and with the current
3696      propagation strategy, we cannot determine when the value ranges
3697      of the names in the equivalence set have changed.
3698
3699      For instance, given the following code fragment
3700
3701         i_5 = PHI <8, i_13>
3702         ...
3703         i_14 = ASSERT_EXPR <i_5, i_5 != 0>
3704         if (i_14 == 1)
3705           ...
3706
3707      Assume that on the first visit to i_14, i_5 has the temporary
3708      range [8, 8] because the second argument to the PHI function is
3709      not yet executable.  We derive the range ~[0, 0] for i_14 and the
3710      equivalence set { i_5 }.  So, when we visit 'if (i_14 == 1)' for
3711      the first time, since i_14 is equivalent to the range [8, 8], we
3712      determine that the predicate is always false.
3713
3714      On the next round of propagation, i_13 is determined to be
3715      VARYING, which causes i_5 to drop down to VARYING.  So, another
3716      visit to i_14 is scheduled.  In this second visit, we compute the
3717      exact same range and equivalence set for i_14, namely ~[0, 0] and
3718      { i_5 }.  But we did not have the previous range for i_5
3719      registered, so vrp_visit_assignment thinks that the range for
3720      i_14 has not changed.  Therefore, the predicate 'if (i_14 == 1)'
3721      is not visited again, which stops propagation from visiting
3722      statements in the THEN clause of that if().
3723
3724      To properly fix this we would need to keep the previous range
3725      value for the names in the equivalence set.  This way we would've
3726      discovered that from one visit to the other i_5 changed from
3727      range [8, 8] to VR_VARYING.
3728
3729      However, fixing this apparent limitation may not be worth the
3730      additional checking.  Testing on several code bases (GCC, DLV,
3731      MICO, TRAMP3D and SPEC2000) showed that doing this results in
3732      4 more predicates folded in SPEC.  */
3733   val = vrp_evaluate_conditional (cond, false);
3734   if (val)
3735     *taken_edge_p = find_taken_edge (bb_for_stmt (stmt), val);
3736
3737   if (dump_file && (dump_flags & TDF_DETAILS))
3738     {
3739       fprintf (dump_file, "\nPredicate evaluates to: ");
3740       if (val == NULL_TREE)
3741         fprintf (dump_file, "DON'T KNOW\n");
3742       else
3743         print_generic_stmt (dump_file, val, 0);
3744     }
3745
3746   return (*taken_edge_p) ? SSA_PROP_INTERESTING : SSA_PROP_VARYING;
3747 }
3748
3749
3750 /* Evaluate statement STMT.  If the statement produces a useful range,
3751    return SSA_PROP_INTERESTING and record the SSA name with the
3752    interesting range into *OUTPUT_P.
3753
3754    If STMT is a conditional branch and we can determine its truth
3755    value, the taken edge is recorded in *TAKEN_EDGE_P.
3756
3757    If STMT produces a varying value, return SSA_PROP_VARYING.  */
3758
3759 static enum ssa_prop_result
3760 vrp_visit_stmt (tree stmt, edge *taken_edge_p, tree *output_p)
3761 {
3762   tree def;
3763   ssa_op_iter iter;
3764   stmt_ann_t ann;
3765
3766   if (dump_file && (dump_flags & TDF_DETAILS))
3767     {
3768       fprintf (dump_file, "\nVisiting statement:\n");
3769       print_generic_stmt (dump_file, stmt, dump_flags);
3770       fprintf (dump_file, "\n");
3771     }
3772
3773   ann = stmt_ann (stmt);
3774   if (TREE_CODE (stmt) == MODIFY_EXPR)
3775     {
3776       tree rhs = TREE_OPERAND (stmt, 1);
3777
3778       /* In general, assignments with virtual operands are not useful
3779          for deriving ranges, with the obvious exception of calls to
3780          builtin functions.  */
3781       if ((TREE_CODE (rhs) == CALL_EXPR
3782            && TREE_CODE (TREE_OPERAND (rhs, 0)) == ADDR_EXPR
3783            && DECL_P (TREE_OPERAND (TREE_OPERAND (rhs, 0), 0))
3784            && DECL_IS_BUILTIN (TREE_OPERAND (TREE_OPERAND (rhs, 0), 0)))
3785           || ZERO_SSA_OPERANDS (stmt, SSA_OP_ALL_VIRTUALS))
3786         return vrp_visit_assignment (stmt, output_p);
3787     }
3788   else if (TREE_CODE (stmt) == COND_EXPR || TREE_CODE (stmt) == SWITCH_EXPR)
3789     return vrp_visit_cond_stmt (stmt, taken_edge_p);
3790
3791   /* All other statements produce nothing of interest for VRP, so mark
3792      their outputs varying and prevent further simulation.  */
3793   FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF)
3794     set_value_range_to_varying (get_value_range (def));
3795
3796   return SSA_PROP_VARYING;
3797 }
3798
3799
3800 /* Meet operation for value ranges.  Given two value ranges VR0 and
3801    VR1, store in VR0 the result of meeting VR0 and VR1.
3802    
3803    The meeting rules are as follows:
3804
3805    1- If VR0 and VR1 have an empty intersection, set VR0 to VR_VARYING.
3806
3807    2- If VR0 and VR1 have a non-empty intersection, set VR0 to the
3808       union of VR0 and VR1.  */
3809
3810 static void
3811 vrp_meet (value_range_t *vr0, value_range_t *vr1)
3812 {
3813   if (vr0->type == VR_UNDEFINED)
3814     {
3815       copy_value_range (vr0, vr1);
3816       return;
3817     }
3818
3819   if (vr1->type == VR_UNDEFINED)
3820     {
3821       /* Nothing to do.  VR0 already has the resulting range.  */
3822       return;
3823     }
3824
3825   if (vr0->type == VR_VARYING)
3826     {
3827       /* Nothing to do.  VR0 already has the resulting range.  */
3828       return;
3829     }
3830
3831   if (vr1->type == VR_VARYING)
3832     {
3833       set_value_range_to_varying (vr0);
3834       return;
3835     }
3836
3837   if (vr0->type == VR_RANGE && vr1->type == VR_RANGE)
3838     {
3839       /* If VR0 and VR1 have a non-empty intersection, compute the
3840          union of both ranges.  */
3841       if (value_ranges_intersect_p (vr0, vr1))
3842         {
3843           int cmp;
3844           tree min, max;
3845
3846           /* The lower limit of the new range is the minimum of the
3847              two ranges.  If they cannot be compared, the result is
3848              VARYING.  */
3849           cmp = compare_values (vr0->min, vr1->min);
3850           if (cmp == 0 || cmp == 1)
3851             min = vr1->min;
3852           else if (cmp == -1)
3853             min = vr0->min;
3854           else
3855             {
3856               set_value_range_to_varying (vr0);
3857               return;
3858             }
3859
3860           /* Similarly, the upper limit of the new range is the
3861              maximum of the two ranges.  If they cannot be compared,
3862              the result is VARYING.  */
3863           cmp = compare_values (vr0->max, vr1->max);
3864           if (cmp == 0 || cmp == -1)
3865             max = vr1->max;
3866           else if (cmp == 1)
3867             max = vr0->max;
3868           else
3869             {
3870               set_value_range_to_varying (vr0);
3871               return;
3872             }
3873
3874           /* The resulting set of equivalences is the intersection of
3875              the two sets.  */
3876           if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
3877             bitmap_and_into (vr0->equiv, vr1->equiv);
3878           else if (vr0->equiv && !vr1->equiv)
3879             bitmap_clear (vr0->equiv);
3880
3881           set_value_range (vr0, vr0->type, min, max, vr0->equiv);
3882         }
3883       else
3884         goto no_meet;
3885     }
3886   else if (vr0->type == VR_ANTI_RANGE && vr1->type == VR_ANTI_RANGE)
3887     {
3888       /* Two anti-ranges meet only if they are both identical.  */
3889       if (compare_values (vr0->min, vr1->min) == 0
3890           && compare_values (vr0->max, vr1->max) == 0
3891           && compare_values (vr0->min, vr0->max) == 0)
3892         {
3893           /* The resulting set of equivalences is the intersection of
3894              the two sets.  */
3895           if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
3896             bitmap_and_into (vr0->equiv, vr1->equiv);
3897           else if (vr0->equiv && !vr1->equiv)
3898             bitmap_clear (vr0->equiv);
3899         }
3900       else
3901         goto no_meet;
3902     }
3903   else if (vr0->type == VR_ANTI_RANGE || vr1->type == VR_ANTI_RANGE)
3904     {
3905       /* A numeric range [VAL1, VAL2] and an anti-range ~[VAL3, VAL4]
3906          meet only if the ranges have an empty intersection.  The
3907          result of the meet operation is the anti-range.  */
3908       if (!symbolic_range_p (vr0)
3909           && !symbolic_range_p (vr1)
3910           && !value_ranges_intersect_p (vr0, vr1))
3911         {
3912           /* Copy most of VR1 into VR0.  Don't copy VR1's equivalence
3913              set.  We need to compute the intersection of the two
3914              equivalence sets.  */
3915           if (vr1->type == VR_ANTI_RANGE)
3916             set_value_range (vr0, vr1->type, vr1->min, vr1->max, vr0->equiv);
3917
3918           /* The resulting set of equivalences is the intersection of
3919              the two sets.  */
3920           if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
3921             bitmap_and_into (vr0->equiv, vr1->equiv);
3922           else if (vr0->equiv && !vr1->equiv)
3923             bitmap_clear (vr0->equiv);
3924         }
3925       else
3926         goto no_meet;
3927     }
3928   else
3929     gcc_unreachable ();
3930
3931   return;
3932
3933 no_meet:
3934   /* The two range VR0 and VR1 do not meet.  Before giving up and
3935      setting the result to VARYING, see if we can at least derive a
3936      useful anti-range.  FIXME, all this nonsense about distinguishing
3937      anti-ranges from ranges is necessary because of the odd
3938      semantics of range_includes_zero_p and friends.  */
3939   if (!symbolic_range_p (vr0)
3940       && ((vr0->type == VR_RANGE && !range_includes_zero_p (vr0))
3941           || (vr0->type == VR_ANTI_RANGE && range_includes_zero_p (vr0)))
3942       && !symbolic_range_p (vr1)
3943       && ((vr1->type == VR_RANGE && !range_includes_zero_p (vr1))
3944           || (vr1->type == VR_ANTI_RANGE && range_includes_zero_p (vr1))))
3945     {
3946       set_value_range_to_nonnull (vr0, TREE_TYPE (vr0->min));
3947
3948       /* Since this meet operation did not result from the meeting of
3949          two equivalent names, VR0 cannot have any equivalences.  */
3950       if (vr0->equiv)
3951         bitmap_clear (vr0->equiv);
3952     }
3953   else
3954     set_value_range_to_varying (vr0);
3955 }
3956
3957
3958 /* Visit all arguments for PHI node PHI that flow through executable
3959    edges.  If a valid value range can be derived from all the incoming
3960    value ranges, set a new range for the LHS of PHI.  */
3961
3962 static enum ssa_prop_result
3963 vrp_visit_phi_node (tree phi)
3964 {
3965   int i;
3966   tree lhs = PHI_RESULT (phi);
3967   value_range_t *lhs_vr = get_value_range (lhs);
3968   value_range_t vr_result = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
3969
3970   copy_value_range (&vr_result, lhs_vr);
3971
3972   if (dump_file && (dump_flags & TDF_DETAILS))
3973     {
3974       fprintf (dump_file, "\nVisiting PHI node: ");
3975       print_generic_expr (dump_file, phi, dump_flags);
3976     }
3977
3978   for (i = 0; i < PHI_NUM_ARGS (phi); i++)
3979     {
3980       edge e = PHI_ARG_EDGE (phi, i);
3981
3982       if (dump_file && (dump_flags & TDF_DETAILS))
3983         {
3984           fprintf (dump_file,
3985               "\n    Argument #%d (%d -> %d %sexecutable)\n",
3986               i, e->src->index, e->dest->index,
3987               (e->flags & EDGE_EXECUTABLE) ? "" : "not ");
3988         }
3989
3990       if (e->flags & EDGE_EXECUTABLE)
3991         {
3992           tree arg = PHI_ARG_DEF (phi, i);
3993           value_range_t vr_arg;
3994
3995           if (TREE_CODE (arg) == SSA_NAME)
3996             vr_arg = *(get_value_range (arg));
3997           else
3998             {
3999               vr_arg.type = VR_RANGE;
4000               vr_arg.min = arg;
4001               vr_arg.max = arg;
4002               vr_arg.equiv = NULL;
4003             }
4004
4005           if (dump_file && (dump_flags & TDF_DETAILS))
4006             {
4007               fprintf (dump_file, "\t");
4008               print_generic_expr (dump_file, arg, dump_flags);
4009               fprintf (dump_file, "\n\tValue: ");
4010               dump_value_range (dump_file, &vr_arg);
4011               fprintf (dump_file, "\n");
4012             }
4013
4014           vrp_meet (&vr_result, &vr_arg);
4015
4016           if (vr_result.type == VR_VARYING)
4017             break;
4018         }
4019     }
4020
4021   if (vr_result.type == VR_VARYING)
4022     goto varying;
4023
4024   /* To prevent infinite iterations in the algorithm, derive ranges
4025      when the new value is slightly bigger or smaller than the
4026      previous one.  */
4027   if (lhs_vr->type == VR_RANGE && vr_result.type == VR_RANGE)
4028     {
4029       if (!POINTER_TYPE_P (TREE_TYPE (lhs)))
4030         {
4031           int cmp_min = compare_values (lhs_vr->min, vr_result.min);
4032           int cmp_max = compare_values (lhs_vr->max, vr_result.max);
4033
4034           /* If the new minimum is smaller or larger than the previous
4035              one, go all the way to -INF.  In the first case, to avoid
4036              iterating millions of times to reach -INF, and in the
4037              other case to avoid infinite bouncing between different
4038              minimums.  */
4039           if (cmp_min > 0 || cmp_min < 0)
4040             vr_result.min = TYPE_MIN_VALUE (TREE_TYPE (vr_result.min));
4041
4042           /* Similarly, if the new maximum is smaller or larger than
4043              the previous one, go all the way to +INF.  */
4044           if (cmp_max < 0 || cmp_max > 0)
4045             vr_result.max = TYPE_MAX_VALUE (TREE_TYPE (vr_result.max));
4046
4047           /* If we ended up with a (-INF, +INF) range, set it to
4048              VARYING.  */
4049           if (vr_result.min == TYPE_MIN_VALUE (TREE_TYPE (vr_result.min))
4050               && vr_result.max == TYPE_MAX_VALUE (TREE_TYPE (vr_result.max)))
4051             goto varying;
4052         }
4053     }
4054
4055   /* If the new range is different than the previous value, keep
4056      iterating.  */
4057   if (update_value_range (lhs, &vr_result))
4058     return SSA_PROP_INTERESTING;
4059
4060   /* Nothing changed, don't add outgoing edges.  */
4061   return SSA_PROP_NOT_INTERESTING;
4062
4063   /* No match found.  Set the LHS to VARYING.  */
4064 varying:
4065   set_value_range_to_varying (lhs_vr);
4066   return SSA_PROP_VARYING;
4067 }
4068
4069 /* Simplify a division or modulo operator to a right shift or
4070    bitwise and if the first operand is unsigned or is greater
4071    than zero and the second operand is an exact power of two.  */
4072
4073 static void
4074 simplify_div_or_mod_using_ranges (tree stmt, tree rhs, enum tree_code rhs_code)
4075 {
4076   tree val = NULL;
4077   tree op = TREE_OPERAND (rhs, 0);
4078   value_range_t *vr = get_value_range (TREE_OPERAND (rhs, 0));
4079
4080   if (TYPE_UNSIGNED (TREE_TYPE (op)))
4081     {
4082       val = integer_one_node;
4083     }
4084   else
4085     {
4086       val = compare_range_with_value (GT_EXPR, vr, integer_zero_node);
4087     }
4088
4089   if (val && integer_onep (val))
4090     {
4091       tree t;
4092       tree op0 = TREE_OPERAND (rhs, 0);
4093       tree op1 = TREE_OPERAND (rhs, 1);
4094
4095       if (rhs_code == TRUNC_DIV_EXPR)
4096         {
4097           t = build_int_cst (NULL_TREE, tree_log2 (op1));
4098           t = build2 (RSHIFT_EXPR, TREE_TYPE (op0), op0, t);
4099         }
4100       else
4101         {
4102           t = build_int_cst (TREE_TYPE (op1), 1);
4103           t = int_const_binop (MINUS_EXPR, op1, t, 0);
4104           t = fold_convert (TREE_TYPE (op0), t);
4105           t = build2 (BIT_AND_EXPR, TREE_TYPE (op0), op0, t);
4106         }
4107
4108       TREE_OPERAND (stmt, 1) = t;
4109       update_stmt (stmt);
4110     }
4111 }
4112
4113 /* If the operand to an ABS_EXPR is >= 0, then eliminate the
4114    ABS_EXPR.  If the operand is <= 0, then simplify the
4115    ABS_EXPR into a NEGATE_EXPR.  */
4116
4117 static void
4118 simplify_abs_using_ranges (tree stmt, tree rhs)
4119 {
4120   tree val = NULL;
4121   tree op = TREE_OPERAND (rhs, 0);
4122   tree type = TREE_TYPE (op);
4123   value_range_t *vr = get_value_range (TREE_OPERAND (rhs, 0));
4124
4125   if (TYPE_UNSIGNED (type))
4126     {
4127       val = integer_zero_node;
4128     }
4129   else if (vr)
4130     {
4131       val = compare_range_with_value (LE_EXPR, vr, integer_zero_node);
4132       if (!val)
4133         {
4134           val = compare_range_with_value (GE_EXPR, vr, integer_zero_node);
4135
4136           if (val)
4137             {
4138               if (integer_zerop (val))
4139                 val = integer_one_node;
4140               else if (integer_onep (val))
4141                 val = integer_zero_node;
4142             }
4143         }
4144
4145       if (val
4146           && (integer_onep (val) || integer_zerop (val)))
4147         {
4148           tree t;
4149
4150           if (integer_onep (val))
4151             t = build1 (NEGATE_EXPR, TREE_TYPE (op), op);
4152           else
4153             t = op;
4154
4155           TREE_OPERAND (stmt, 1) = t;
4156           update_stmt (stmt);
4157         }
4158     }
4159 }
4160
4161 /* We are comparing trees OP0 and OP1 using COND_CODE.  OP0 has
4162    a known value range VR.
4163
4164    If there is one and only one value which will satisfy the
4165    conditional, then return that value.  Else return NULL.  */
4166
4167 static tree
4168 test_for_singularity (enum tree_code cond_code, tree op0,
4169                       tree op1, value_range_t *vr)
4170 {
4171   tree min = NULL;
4172   tree max = NULL;
4173
4174   /* Extract minimum/maximum values which satisfy the
4175      the conditional as it was written.  */
4176   if (cond_code == LE_EXPR || cond_code == LT_EXPR)
4177     {
4178       min = TYPE_MIN_VALUE (TREE_TYPE (op0));
4179
4180       max = op1;
4181       if (cond_code == LT_EXPR)
4182         {
4183           tree one = build_int_cst (TREE_TYPE (op0), 1);
4184           max = fold_build2 (MINUS_EXPR, TREE_TYPE (op0), max, one);
4185         }
4186     }
4187   else if (cond_code == GE_EXPR || cond_code == GT_EXPR)
4188     {
4189       max = TYPE_MAX_VALUE (TREE_TYPE (op0));
4190
4191       min = op1;
4192       if (cond_code == GT_EXPR)
4193         {
4194           tree one = build_int_cst (TREE_TYPE (op0), 1);
4195           min = fold_build2 (PLUS_EXPR, TREE_TYPE (op0), min, one);
4196         }
4197     }
4198
4199   /* Now refine the minimum and maximum values using any
4200      value range information we have for op0.  */
4201   if (min && max)
4202     {
4203       if (compare_values (vr->min, min) == -1)
4204         min = min;
4205       else
4206         min = vr->min;
4207       if (compare_values (vr->max, max) == 1)
4208         max = max;
4209       else
4210         max = vr->max;
4211
4212       /* If the new min/max values have converged to a single value,
4213          then there is only one value which can satisfy the condition,
4214          return that value.  */
4215       if (operand_equal_p (min, max, 0) && is_gimple_min_invariant (min))
4216         return min;
4217     }
4218   return NULL;
4219 }
4220
4221 /* Simplify a conditional using a relational operator to an equality
4222    test if the range information indicates only one value can satisfy
4223    the original conditional.  */
4224
4225 static void
4226 simplify_cond_using_ranges (tree stmt)
4227 {
4228   tree cond = COND_EXPR_COND (stmt);
4229   tree op0 = TREE_OPERAND (cond, 0);
4230   tree op1 = TREE_OPERAND (cond, 1);
4231   enum tree_code cond_code = TREE_CODE (cond);
4232
4233   if (cond_code != NE_EXPR
4234       && cond_code != EQ_EXPR
4235       && TREE_CODE (op0) == SSA_NAME
4236       && INTEGRAL_TYPE_P (TREE_TYPE (op0))
4237       && is_gimple_min_invariant (op1))
4238     {
4239       value_range_t *vr = get_value_range (op0);
4240           
4241       /* If we have range information for OP0, then we might be
4242          able to simplify this conditional. */
4243       if (vr->type == VR_RANGE)
4244         {
4245           tree new = test_for_singularity (cond_code, op0, op1, vr);
4246
4247           if (new)
4248             {
4249               if (dump_file)
4250                 {
4251                   fprintf (dump_file, "Simplified relational ");
4252                   print_generic_expr (dump_file, cond, 0);
4253                   fprintf (dump_file, " into ");
4254                 }
4255
4256               COND_EXPR_COND (stmt)
4257                 = build2 (EQ_EXPR, boolean_type_node, op0, new);
4258               update_stmt (stmt);
4259
4260               if (dump_file)
4261                 {
4262                   print_generic_expr (dump_file, COND_EXPR_COND (stmt), 0);
4263                   fprintf (dump_file, "\n");
4264                 }
4265               return;
4266
4267             }
4268
4269           /* Try again after inverting the condition.  We only deal
4270              with integral types here, so no need to worry about
4271              issues with inverting FP comparisons.  */
4272           cond_code = invert_tree_comparison (cond_code, false);
4273           new = test_for_singularity (cond_code, op0, op1, vr);
4274
4275           if (new)
4276             {
4277               if (dump_file)
4278                 {
4279                   fprintf (dump_file, "Simplified relational ");
4280                   print_generic_expr (dump_file, cond, 0);
4281                   fprintf (dump_file, " into ");
4282                 }
4283
4284               COND_EXPR_COND (stmt)
4285                 = build2 (NE_EXPR, boolean_type_node, op0, new);
4286               update_stmt (stmt);
4287
4288               if (dump_file)
4289                 {
4290                   print_generic_expr (dump_file, COND_EXPR_COND (stmt), 0);
4291                   fprintf (dump_file, "\n");
4292                 }
4293               return;
4294
4295             }
4296         }
4297     }
4298 }
4299
4300 /* Simplify STMT using ranges if possible.  */
4301
4302 void
4303 simplify_stmt_using_ranges (tree stmt)
4304 {
4305   if (TREE_CODE (stmt) == MODIFY_EXPR)
4306     {
4307       tree rhs = TREE_OPERAND (stmt, 1);
4308       enum tree_code rhs_code = TREE_CODE (rhs);
4309
4310       /* Transform TRUNC_DIV_EXPR and TRUNC_MOD_EXPR into RSHIFT_EXPR
4311          and BIT_AND_EXPR respectively if the first operand is greater
4312          than zero and the second operand is an exact power of two.  */
4313       if ((rhs_code == TRUNC_DIV_EXPR || rhs_code == TRUNC_MOD_EXPR)
4314           && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (rhs, 0)))
4315           && integer_pow2p (TREE_OPERAND (rhs, 1)))
4316         simplify_div_or_mod_using_ranges (stmt, rhs, rhs_code);
4317
4318       /* Transform ABS (X) into X or -X as appropriate.  */
4319       if (rhs_code == ABS_EXPR
4320           && TREE_CODE (TREE_OPERAND (rhs, 0)) == SSA_NAME
4321           && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (rhs, 0))))
4322         simplify_abs_using_ranges (stmt, rhs);
4323     }
4324   else if (TREE_CODE (stmt) == COND_EXPR
4325            && COMPARISON_CLASS_P (COND_EXPR_COND (stmt)))
4326     {
4327       simplify_cond_using_ranges (stmt);
4328     }
4329 }
4330
4331 /* Stack of dest,src equivalency pairs that need to be restored after
4332    each attempt to thread a block's incoming edge to an outgoing edge. 
4333
4334    A NULL entry is used to mark the end of pairs which need to be
4335    restored.  */
4336 static VEC(tree,heap) *stack;
4337
4338 /* A trivial wrapper so that we can present the generic jump
4339    threading code with a simple API for simplifying statements.  */
4340 static tree
4341 simplify_stmt_for_jump_threading (tree stmt)
4342 {
4343   /* We only use VRP information to simplify conditionals.  This is
4344      overly conservative, but it's unclear if doing more would be
4345      worth the compile time cost.  */
4346   if (TREE_CODE (stmt) != COND_EXPR)
4347     return NULL;
4348
4349   return vrp_evaluate_conditional (COND_EXPR_COND (stmt), true);
4350 }
4351
4352 /* Blocks which have more than one predecessor and more than
4353    one successor present jump threading opportunities.  ie,
4354    when the block is reached from a specific predecessor, we
4355    may be able to determine which of the outgoing edges will
4356    be traversed.  When this optimization applies, we are able
4357    to avoid conditionals at runtime and we may expose secondary
4358    optimization opportunities.
4359
4360    This routine is effectively a driver for the generic jump
4361    threading code.  It basically just presents the generic code
4362    with edges that may be suitable for jump threading.
4363
4364    Unlike DOM, we do not iterate VRP if jump threading was successful.
4365    While iterating may expose new opportunities for VRP, it is expected
4366    those opportunities would be very limited and the compile time cost
4367    to expose those opportunities would be significant. 
4368
4369    As jump threading opportunities are discovered, they are registered
4370    for later realization.  */
4371
4372 static void
4373 identify_jump_threads (void)
4374 {
4375   basic_block bb;
4376   tree dummy;
4377
4378   /* Ugh.  When substituting values earlier in this pass we can
4379      wipe the dominance information.  So rebuild the dominator
4380      information as we need it within the jump threading code.  */
4381   calculate_dominance_info (CDI_DOMINATORS);
4382
4383   /* We do not allow VRP information to be used for jump threading
4384      across a back edge in the CFG.  Otherwise it becomes too
4385      difficult to avoid eliminating loop exit tests.  Of course
4386      EDGE_DFS_BACK is not accurate at this time so we have to
4387      recompute it.  */
4388   mark_dfs_back_edges ();
4389
4390   /* Allocate our unwinder stack to unwind any temporary equivalences
4391      that might be recorded.  */
4392   stack = VEC_alloc (tree, heap, 20);
4393
4394   /* To avoid lots of silly node creation, we create a single
4395      conditional and just modify it in-place when attempting to
4396      thread jumps.  */
4397   dummy = build2 (EQ_EXPR, boolean_type_node, NULL, NULL);
4398   dummy = build3 (COND_EXPR, void_type_node, dummy, NULL, NULL);
4399
4400   /* Walk through all the blocks finding those which present a
4401      potential jump threading opportunity.  We could set this up
4402      as a dominator walker and record data during the walk, but
4403      I doubt it's worth the effort for the classes of jump
4404      threading opportunities we are trying to identify at this
4405      point in compilation.  */
4406   FOR_EACH_BB (bb)
4407     {
4408       tree last, cond;
4409
4410       /* If the generic jump threading code does not find this block
4411          interesting, then there is nothing to do.  */
4412       if (! potentially_threadable_block (bb))
4413         continue;
4414
4415       /* We only care about blocks ending in a COND_EXPR.  While there
4416          may be some value in handling SWITCH_EXPR here, I doubt it's
4417          terribly important.  */
4418       last = bsi_stmt (bsi_last (bb));
4419       if (TREE_CODE (last) != COND_EXPR)
4420         continue;
4421
4422       /* We're basically looking for any kind of conditional with
4423          integral type arguments.  */
4424       cond = COND_EXPR_COND (last);
4425       if ((TREE_CODE (cond) == SSA_NAME
4426            && INTEGRAL_TYPE_P (TREE_TYPE (cond)))
4427           || (COMPARISON_CLASS_P (cond)
4428               && TREE_CODE (TREE_OPERAND (cond, 0)) == SSA_NAME
4429               && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (cond, 0)))
4430               && (TREE_CODE (TREE_OPERAND (cond, 1)) == SSA_NAME
4431                   || is_gimple_min_invariant (TREE_OPERAND (cond, 1)))
4432               && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (cond, 1)))))
4433         {
4434           edge_iterator ei;
4435           edge e;
4436
4437           /* We've got a block with multiple predecessors and multiple
4438              successors which also ends in a suitable conditional.  For
4439              each predecessor, see if we can thread it to a specific
4440              successor.  */
4441           FOR_EACH_EDGE (e, ei, bb->preds)
4442             {
4443               /* Do not thread across back edges or abnormal edges
4444                  in the CFG.  */
4445               if (e->flags & (EDGE_DFS_BACK | EDGE_COMPLEX))
4446                 continue;
4447
4448               thread_across_edge (dummy, e, true,
4449                                   &stack,
4450                                   simplify_stmt_for_jump_threading);
4451             }
4452         }
4453     }
4454
4455   /* We do not actually update the CFG or SSA graphs at this point as
4456      ASSERT_EXPRs are still in the IL and cfg cleanup code does not yet
4457      handle ASSERT_EXPRs gracefully.  */
4458 }
4459
4460 /* We identified all the jump threading opportunities earlier, but could
4461    not transform the CFG at that time.  This routine transforms the
4462    CFG and arranges for the dominator tree to be rebuilt if necessary.
4463
4464    Note the SSA graph update will occur during the normal TODO
4465    processing by the pass manager.  */
4466 static void
4467 finalize_jump_threads (void)
4468 {
4469   bool cfg_altered = false;
4470   cfg_altered = thread_through_all_blocks ();
4471
4472   /* If we threaded jumps, then we need to recompute the dominance
4473      information, to safely do that we must clean up the CFG first.  */
4474   if (cfg_altered)
4475     {
4476       free_dominance_info (CDI_DOMINATORS);
4477       cleanup_tree_cfg ();
4478       calculate_dominance_info (CDI_DOMINATORS);
4479     }
4480   VEC_free (tree, heap, stack);
4481 }
4482
4483
4484 /* Traverse all the blocks folding conditionals with known ranges.  */
4485
4486 static void
4487 vrp_finalize (void)
4488 {
4489   size_t i;
4490   prop_value_t *single_val_range;
4491   bool do_value_subst_p;
4492
4493   if (dump_file)
4494     {
4495       fprintf (dump_file, "\nValue ranges after VRP:\n\n");
4496       dump_all_value_ranges (dump_file);
4497       fprintf (dump_file, "\n");
4498     }
4499
4500   /* We may have ended with ranges that have exactly one value.  Those
4501      values can be substituted as any other copy/const propagated
4502      value using substitute_and_fold.  */
4503   single_val_range = XNEWVEC (prop_value_t, num_ssa_names);
4504   memset (single_val_range, 0, num_ssa_names * sizeof (*single_val_range));
4505
4506   do_value_subst_p = false;
4507   for (i = 0; i < num_ssa_names; i++)
4508     if (vr_value[i]
4509         && vr_value[i]->type == VR_RANGE
4510         && vr_value[i]->min == vr_value[i]->max)
4511       {
4512         single_val_range[i].value = vr_value[i]->min;
4513         do_value_subst_p = true;
4514       }
4515
4516   if (!do_value_subst_p)
4517     {
4518       /* We found no single-valued ranges, don't waste time trying to
4519          do single value substitution in substitute_and_fold.  */
4520       free (single_val_range);
4521       single_val_range = NULL;
4522     }
4523
4524   substitute_and_fold (single_val_range, true);
4525
4526   /* We must identify jump threading opportunities before we release
4527      the datastructures built by VRP.  */
4528   identify_jump_threads ();
4529
4530   /* Free allocated memory.  */
4531   for (i = 0; i < num_ssa_names; i++)
4532     if (vr_value[i])
4533       {
4534         BITMAP_FREE (vr_value[i]->equiv);
4535         free (vr_value[i]);
4536       }
4537
4538   free (single_val_range);
4539   free (vr_value);
4540
4541   /* So that we can distinguish between VRP data being available
4542      and not available.  */
4543   vr_value = NULL;
4544 }
4545
4546
4547 /* Main entry point to VRP (Value Range Propagation).  This pass is
4548    loosely based on J. R. C. Patterson, ``Accurate Static Branch
4549    Prediction by Value Range Propagation,'' in SIGPLAN Conference on
4550    Programming Language Design and Implementation, pp. 67-78, 1995.
4551    Also available at http://citeseer.ist.psu.edu/patterson95accurate.html
4552
4553    This is essentially an SSA-CCP pass modified to deal with ranges
4554    instead of constants.
4555
4556    While propagating ranges, we may find that two or more SSA name
4557    have equivalent, though distinct ranges.  For instance,
4558
4559      1  x_9 = p_3->a;
4560      2  p_4 = ASSERT_EXPR <p_3, p_3 != 0>
4561      3  if (p_4 == q_2)
4562      4    p_5 = ASSERT_EXPR <p_4, p_4 == q_2>;
4563      5  endif
4564      6  if (q_2)
4565         
4566    In the code above, pointer p_5 has range [q_2, q_2], but from the
4567    code we can also determine that p_5 cannot be NULL and, if q_2 had
4568    a non-varying range, p_5's range should also be compatible with it.
4569
4570    These equivalences are created by two expressions: ASSERT_EXPR and
4571    copy operations.  Since p_5 is an assertion on p_4, and p_4 was the
4572    result of another assertion, then we can use the fact that p_5 and
4573    p_4 are equivalent when evaluating p_5's range.
4574
4575    Together with value ranges, we also propagate these equivalences
4576    between names so that we can take advantage of information from
4577    multiple ranges when doing final replacement.  Note that this
4578    equivalency relation is transitive but not symmetric.
4579    
4580    In the example above, p_5 is equivalent to p_4, q_2 and p_3, but we
4581    cannot assert that q_2 is equivalent to p_5 because q_2 may be used
4582    in contexts where that assertion does not hold (e.g., in line 6).
4583
4584    TODO, the main difference between this pass and Patterson's is that
4585    we do not propagate edge probabilities.  We only compute whether
4586    edges can be taken or not.  That is, instead of having a spectrum
4587    of jump probabilities between 0 and 1, we only deal with 0, 1 and
4588    DON'T KNOW.  In the future, it may be worthwhile to propagate
4589    probabilities to aid branch prediction.  */
4590
4591 static unsigned int
4592 execute_vrp (void)
4593 {
4594   insert_range_assertions ();
4595
4596   current_loops = loop_optimizer_init (LOOPS_NORMAL);
4597   if (current_loops)
4598     scev_initialize (current_loops);
4599
4600   vrp_initialize ();
4601   ssa_propagate (vrp_visit_stmt, vrp_visit_phi_node);
4602   vrp_finalize ();
4603
4604   if (current_loops)
4605     {
4606       scev_finalize ();
4607       loop_optimizer_finalize (current_loops);
4608       current_loops = NULL;
4609     }
4610
4611   /* ASSERT_EXPRs must be removed before finalizing jump threads
4612      as finalizing jump threads calls the CFG cleanup code which
4613      does not properly handle ASSERT_EXPRs.  */
4614   remove_range_assertions ();
4615
4616   /* If we exposed any new variables, go ahead and put them into
4617      SSA form now, before we handle jump threading.  This simplifies
4618      interactions between rewriting of _DECL nodes into SSA form
4619      and rewriting SSA_NAME nodes into SSA form after block
4620      duplication and CFG manipulation.  */
4621   update_ssa (TODO_update_ssa);
4622
4623   finalize_jump_threads ();
4624   return 0;
4625 }
4626
4627 static bool
4628 gate_vrp (void)
4629 {
4630   return flag_tree_vrp != 0;
4631 }
4632
4633 struct tree_opt_pass pass_vrp =
4634 {
4635   "vrp",                                /* name */
4636   gate_vrp,                             /* gate */
4637   execute_vrp,                          /* execute */
4638   NULL,                                 /* sub */
4639   NULL,                                 /* next */
4640   0,                                    /* static_pass_number */
4641   TV_TREE_VRP,                          /* tv_id */
4642   PROP_ssa | PROP_alias,                /* properties_required */
4643   0,                                    /* properties_provided */
4644   PROP_smt_usage,                       /* properties_destroyed */
4645   0,                                    /* todo_flags_start */
4646   TODO_cleanup_cfg
4647     | TODO_ggc_collect
4648     | TODO_verify_ssa
4649     | TODO_dump_func
4650     | TODO_update_ssa
4651     | TODO_update_smt_usage,                    /* todo_flags_finish */
4652   0                                     /* letter */
4653 };