OSDN Git Service

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