OSDN Git Service

2005-07-20 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       /* Negating an anti-range doesn't really do anything to it.  The
1357          new range will also not take on the same range of values
1358          excluded by the original anti-range.  */
1359       if (vr0.type == VR_ANTI_RANGE)
1360         {
1361           copy_value_range (vr, &vr0);
1362           return;
1363         }
1364
1365       /* NEGATE_EXPR flips the range around.  */
1366       min = (vr0.max == TYPE_MAX_VALUE (TREE_TYPE (expr)))
1367             ? TYPE_MIN_VALUE (TREE_TYPE (expr))
1368             : fold_unary_to_constant (code, TREE_TYPE (expr), vr0.max);
1369
1370       max = (vr0.min == TYPE_MIN_VALUE (TREE_TYPE (expr)))
1371             ? TYPE_MAX_VALUE (TREE_TYPE (expr))
1372             : fold_unary_to_constant (code, TREE_TYPE (expr), vr0.min);
1373     }
1374   else if (code == ABS_EXPR
1375            && !TYPE_UNSIGNED (TREE_TYPE (expr)))
1376     {
1377       /* ABS_EXPR may flip the range around, if the original range
1378          included negative values.  */
1379       min = (vr0.min == TYPE_MIN_VALUE (TREE_TYPE (expr)))
1380             ? TYPE_MAX_VALUE (TREE_TYPE (expr))
1381             : fold_unary_to_constant (code, TREE_TYPE (expr), vr0.min);
1382
1383       max = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.max);
1384
1385       /* If the range was reversed, swap MIN and MAX.  */
1386       if (compare_values (min, max) == 1)
1387         {
1388           tree t = min;
1389           min = max;
1390           max = t;
1391         }
1392     }
1393   else
1394     {
1395       /* Otherwise, operate on each end of the range.  */
1396       min = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.min);
1397       max = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.max);
1398     }
1399
1400   cmp = compare_values (min, max);
1401   if (cmp == -2 || cmp == 1)
1402     {
1403       /* If the new range has its limits swapped around (MIN > MAX),
1404          then the operation caused one of them to wrap around, mark
1405          the new range VARYING.  */
1406       set_value_range_to_varying (vr);
1407     }
1408   else
1409     set_value_range (vr, vr0.type, min, max, NULL);
1410 }
1411
1412
1413 /* Extract range information from a comparison expression EXPR based
1414    on the range of its operand and the expression code.  */
1415
1416 static void
1417 extract_range_from_comparison (value_range_t *vr, tree expr)
1418 {
1419   tree val = vrp_evaluate_conditional (expr, false);
1420   if (val)
1421     {
1422       /* Since this expression was found on the RHS of an assignment,
1423          its type may be different from _Bool.  Convert VAL to EXPR's
1424          type.  */
1425       val = fold_convert (TREE_TYPE (expr), val);
1426       set_value_range (vr, VR_RANGE, val, val, vr->equiv);
1427     }
1428   else
1429     set_value_range_to_varying (vr);
1430 }
1431
1432
1433 /* Try to compute a useful range out of expression EXPR and store it
1434    in *VR.  */
1435
1436 static void
1437 extract_range_from_expr (value_range_t *vr, tree expr)
1438 {
1439   enum tree_code code = TREE_CODE (expr);
1440
1441   if (code == ASSERT_EXPR)
1442     extract_range_from_assert (vr, expr);
1443   else if (code == SSA_NAME)
1444     extract_range_from_ssa_name (vr, expr);
1445   else if (TREE_CODE_CLASS (code) == tcc_binary
1446            || code == TRUTH_ANDIF_EXPR
1447            || code == TRUTH_ORIF_EXPR
1448            || code == TRUTH_AND_EXPR
1449            || code == TRUTH_OR_EXPR
1450            || code == TRUTH_XOR_EXPR)
1451     extract_range_from_binary_expr (vr, expr);
1452   else if (TREE_CODE_CLASS (code) == tcc_unary)
1453     extract_range_from_unary_expr (vr, expr);
1454   else if (TREE_CODE_CLASS (code) == tcc_comparison)
1455     extract_range_from_comparison (vr, expr);
1456   else if (vrp_expr_computes_nonzero (expr))
1457     set_value_range_to_nonnull (vr, TREE_TYPE (expr));
1458   else if (is_gimple_min_invariant (expr))
1459     set_value_range (vr, VR_RANGE, expr, expr, NULL);
1460   else
1461     set_value_range_to_varying (vr);
1462 }
1463
1464 /* Given a range VR, a LOOP and a variable VAR, determine whether it
1465    would be profitable to adjust VR using scalar evolution information
1466    for VAR.  If so, update VR with the new limits.  */
1467
1468 static void
1469 adjust_range_with_scev (value_range_t *vr, struct loop *loop, tree stmt,
1470                         tree var)
1471 {
1472   tree init, step, chrec;
1473   bool init_is_max;
1474
1475   /* TODO.  Don't adjust anti-ranges.  An anti-range may provide
1476      better opportunities than a regular range, but I'm not sure.  */
1477   if (vr->type == VR_ANTI_RANGE)
1478     return;
1479
1480   chrec = analyze_scalar_evolution (loop, var);
1481   if (TREE_CODE (chrec) != POLYNOMIAL_CHREC)
1482     return;
1483
1484   init = CHREC_LEFT (chrec);
1485   step = CHREC_RIGHT (chrec);
1486
1487   /* If STEP is symbolic, we can't know whether INIT will be the
1488      minimum or maximum value in the range.  */
1489   if (!is_gimple_min_invariant (step))
1490     return;
1491
1492   /* Do not adjust ranges when chrec may wrap.  */
1493   if (scev_probably_wraps_p (chrec_type (chrec), init, step, stmt,
1494                              cfg_loops->parray[CHREC_VARIABLE (chrec)],
1495                              &init_is_max))
1496     return;
1497
1498   if (!POINTER_TYPE_P (TREE_TYPE (init))
1499       && (vr->type == VR_VARYING || vr->type == VR_UNDEFINED))
1500     {
1501       /* For VARYING or UNDEFINED ranges, just about anything we get
1502          from scalar evolutions should be better.  */
1503       if (init_is_max)
1504         set_value_range (vr, VR_RANGE, TYPE_MIN_VALUE (TREE_TYPE (init)),
1505                          init, vr->equiv);
1506       else
1507         set_value_range (vr, VR_RANGE, init, TYPE_MAX_VALUE (TREE_TYPE (init)),
1508                          vr->equiv);
1509     }
1510   else if (vr->type == VR_RANGE)
1511     {
1512       tree min = vr->min;
1513       tree max = vr->max;
1514
1515       if (init_is_max)
1516         {
1517           /* INIT is the maximum value.  If INIT is lower than VR->MAX
1518              but no smaller than VR->MIN, set VR->MAX to INIT.  */
1519           if (compare_values (init, max) == -1)
1520             {
1521               max = init;
1522
1523               /* If we just created an invalid range with the minimum
1524                  greater than the maximum, take the minimum all the
1525                  way to -INF.  */
1526               if (compare_values (min, max) == 1)
1527                 min = TYPE_MIN_VALUE (TREE_TYPE (min));
1528             }
1529         }
1530       else
1531         {
1532           /* If INIT is bigger than VR->MIN, set VR->MIN to INIT.  */
1533           if (compare_values (init, min) == 1)
1534             {
1535               min = init;
1536
1537               /* If we just created an invalid range with the minimum
1538                  greater than the maximum, take the maximum all the
1539                  way to +INF.  */
1540               if (compare_values (min, max) == 1)
1541                 max = TYPE_MAX_VALUE (TREE_TYPE (max));
1542             }
1543         }
1544
1545       set_value_range (vr, VR_RANGE, min, max, vr->equiv);
1546     }
1547 }
1548
1549
1550 /* Given two numeric value ranges VR0, VR1 and a comparison code COMP:
1551    
1552    - Return BOOLEAN_TRUE_NODE if VR0 COMP VR1 always returns true for
1553      all the values in the ranges.
1554
1555    - Return BOOLEAN_FALSE_NODE if the comparison always returns false.
1556
1557    - Return NULL_TREE if it is not always possible to determine the
1558      value of the comparison.  */
1559
1560
1561 static tree
1562 compare_ranges (enum tree_code comp, value_range_t *vr0, value_range_t *vr1)
1563 {
1564   /* VARYING or UNDEFINED ranges cannot be compared.  */
1565   if (vr0->type == VR_VARYING
1566       || vr0->type == VR_UNDEFINED
1567       || vr1->type == VR_VARYING
1568       || vr1->type == VR_UNDEFINED)
1569     return NULL_TREE;
1570
1571   /* Anti-ranges need to be handled separately.  */
1572   if (vr0->type == VR_ANTI_RANGE || vr1->type == VR_ANTI_RANGE)
1573     {
1574       /* If both are anti-ranges, then we cannot compute any
1575          comparison.  */
1576       if (vr0->type == VR_ANTI_RANGE && vr1->type == VR_ANTI_RANGE)
1577         return NULL_TREE;
1578
1579       /* These comparisons are never statically computable.  */
1580       if (comp == GT_EXPR
1581           || comp == GE_EXPR
1582           || comp == LT_EXPR
1583           || comp == LE_EXPR)
1584         return NULL_TREE;
1585
1586       /* Equality can be computed only between a range and an
1587          anti-range.  ~[VAL1, VAL2] == [VAL1, VAL2] is always false.  */
1588       if (vr0->type == VR_RANGE)
1589         {
1590           /* To simplify processing, make VR0 the anti-range.  */
1591           value_range_t *tmp = vr0;
1592           vr0 = vr1;
1593           vr1 = tmp;
1594         }
1595
1596       gcc_assert (comp == NE_EXPR || comp == EQ_EXPR);
1597
1598       if (compare_values (vr0->min, vr1->min) == 0
1599           && compare_values (vr0->max, vr1->max) == 0)
1600         return (comp == NE_EXPR) ? boolean_true_node : boolean_false_node;
1601
1602       return NULL_TREE;
1603     }
1604
1605   /* Simplify processing.  If COMP is GT_EXPR or GE_EXPR, switch the
1606      operands around and change the comparison code.  */
1607   if (comp == GT_EXPR || comp == GE_EXPR)
1608     {
1609       value_range_t *tmp;
1610       comp = (comp == GT_EXPR) ? LT_EXPR : LE_EXPR;
1611       tmp = vr0;
1612       vr0 = vr1;
1613       vr1 = tmp;
1614     }
1615
1616   if (comp == EQ_EXPR)
1617     {
1618       /* Equality may only be computed if both ranges represent
1619          exactly one value.  */
1620       if (compare_values (vr0->min, vr0->max) == 0
1621           && compare_values (vr1->min, vr1->max) == 0)
1622         {
1623           int cmp_min = compare_values (vr0->min, vr1->min);
1624           int cmp_max = compare_values (vr0->max, vr1->max);
1625           if (cmp_min == 0 && cmp_max == 0)
1626             return boolean_true_node;
1627           else if (cmp_min != -2 && cmp_max != -2)
1628             return boolean_false_node;
1629         }
1630
1631       return NULL_TREE;
1632     }
1633   else if (comp == NE_EXPR)
1634     {
1635       int cmp1, cmp2;
1636
1637       /* If VR0 is completely to the left or completely to the right
1638          of VR1, they are always different.  Notice that we need to
1639          make sure that both comparisons yield similar results to
1640          avoid comparing values that cannot be compared at
1641          compile-time.  */
1642       cmp1 = compare_values (vr0->max, vr1->min);
1643       cmp2 = compare_values (vr0->min, vr1->max);
1644       if ((cmp1 == -1 && cmp2 == -1) || (cmp1 == 1 && cmp2 == 1))
1645         return boolean_true_node;
1646
1647       /* If VR0 and VR1 represent a single value and are identical,
1648          return false.  */
1649       else if (compare_values (vr0->min, vr0->max) == 0
1650                && compare_values (vr1->min, vr1->max) == 0
1651                && compare_values (vr0->min, vr1->min) == 0
1652                && compare_values (vr0->max, vr1->max) == 0)
1653         return boolean_false_node;
1654
1655       /* Otherwise, they may or may not be different.  */
1656       else
1657         return NULL_TREE;
1658     }
1659   else if (comp == LT_EXPR || comp == LE_EXPR)
1660     {
1661       int tst;
1662
1663       /* If VR0 is to the left of VR1, return true.  */
1664       tst = compare_values (vr0->max, vr1->min);
1665       if ((comp == LT_EXPR && tst == -1)
1666           || (comp == LE_EXPR && (tst == -1 || tst == 0)))
1667         return boolean_true_node;
1668
1669       /* If VR0 is to the right of VR1, return false.  */
1670       tst = compare_values (vr0->min, vr1->max);
1671       if ((comp == LT_EXPR && (tst == 0 || tst == 1))
1672           || (comp == LE_EXPR && tst == 1))
1673         return boolean_false_node;
1674
1675       /* Otherwise, we don't know.  */
1676       return NULL_TREE;
1677     }
1678     
1679   gcc_unreachable ();
1680 }
1681
1682
1683 /* Given a value range VR, a value VAL and a comparison code COMP, return
1684    BOOLEAN_TRUE_NODE if VR COMP VAL always returns true for all the
1685    values in VR.  Return BOOLEAN_FALSE_NODE if the comparison
1686    always returns false.  Return NULL_TREE if it is not always
1687    possible to determine the value of the comparison.  */
1688
1689 static tree
1690 compare_range_with_value (enum tree_code comp, value_range_t *vr, tree val)
1691 {
1692   if (vr->type == VR_VARYING || vr->type == VR_UNDEFINED)
1693     return NULL_TREE;
1694
1695   /* Anti-ranges need to be handled separately.  */
1696   if (vr->type == VR_ANTI_RANGE)
1697     {
1698       /* For anti-ranges, the only predicates that we can compute at
1699          compile time are equality and inequality.  */
1700       if (comp == GT_EXPR
1701           || comp == GE_EXPR
1702           || comp == LT_EXPR
1703           || comp == LE_EXPR)
1704         return NULL_TREE;
1705
1706       /* ~[VAL, VAL] == VAL is always false.  */
1707       if (compare_values (vr->min, val) == 0
1708           && compare_values (vr->max, val) == 0)
1709         return (comp == NE_EXPR) ? boolean_true_node : boolean_false_node;
1710
1711       return NULL_TREE;
1712     }
1713
1714   if (comp == EQ_EXPR)
1715     {
1716       /* EQ_EXPR may only be computed if VR represents exactly
1717          one value.  */
1718       if (compare_values (vr->min, vr->max) == 0)
1719         {
1720           int cmp = compare_values (vr->min, val);
1721           if (cmp == 0)
1722             return boolean_true_node;
1723           else if (cmp == -1 || cmp == 1 || cmp == 2)
1724             return boolean_false_node;
1725         }
1726       else if (compare_values (val, vr->min) == -1
1727                || compare_values (vr->max, val) == -1)
1728         return boolean_false_node;
1729
1730       return NULL_TREE;
1731     }
1732   else if (comp == NE_EXPR)
1733     {
1734       /* If VAL is not inside VR, then they are always different.  */
1735       if (compare_values (vr->max, val) == -1
1736           || compare_values (vr->min, val) == 1)
1737         return boolean_true_node;
1738
1739       /* If VR represents exactly one value equal to VAL, then return
1740          false.  */
1741       if (compare_values (vr->min, vr->max) == 0
1742           && compare_values (vr->min, val) == 0)
1743         return boolean_false_node;
1744
1745       /* Otherwise, they may or may not be different.  */
1746       return NULL_TREE;
1747     }
1748   else if (comp == LT_EXPR || comp == LE_EXPR)
1749     {
1750       int tst;
1751
1752       /* If VR is to the left of VAL, return true.  */
1753       tst = compare_values (vr->max, val);
1754       if ((comp == LT_EXPR && tst == -1)
1755           || (comp == LE_EXPR && (tst == -1 || tst == 0)))
1756         return boolean_true_node;
1757
1758       /* If VR is to the right of VAL, return false.  */
1759       tst = compare_values (vr->min, val);
1760       if ((comp == LT_EXPR && (tst == 0 || tst == 1))
1761           || (comp == LE_EXPR && tst == 1))
1762         return boolean_false_node;
1763
1764       /* Otherwise, we don't know.  */
1765       return NULL_TREE;
1766     }
1767   else if (comp == GT_EXPR || comp == GE_EXPR)
1768     {
1769       int tst;
1770
1771       /* If VR is to the right of VAL, return true.  */
1772       tst = compare_values (vr->min, val);
1773       if ((comp == GT_EXPR && tst == 1)
1774           || (comp == GE_EXPR && (tst == 0 || tst == 1)))
1775         return boolean_true_node;
1776
1777       /* If VR is to the left of VAL, return false.  */
1778       tst = compare_values (vr->max, val);
1779       if ((comp == GT_EXPR && (tst == -1 || tst == 0))
1780           || (comp == GE_EXPR && tst == -1))
1781         return boolean_false_node;
1782
1783       /* Otherwise, we don't know.  */
1784       return NULL_TREE;
1785     }
1786
1787   gcc_unreachable ();
1788 }
1789
1790
1791 /* Debugging dumps.  */
1792
1793 void dump_value_range (FILE *, value_range_t *);
1794 void debug_value_range (value_range_t *);
1795 void dump_all_value_ranges (FILE *);
1796 void debug_all_value_ranges (void);
1797 void dump_vr_equiv (FILE *, bitmap);
1798 void debug_vr_equiv (bitmap);
1799
1800
1801 /* Dump value range VR to FILE.  */
1802
1803 void
1804 dump_value_range (FILE *file, value_range_t *vr)
1805 {
1806   if (vr == NULL)
1807     fprintf (file, "[]");
1808   else if (vr->type == VR_UNDEFINED)
1809     fprintf (file, "UNDEFINED");
1810   else if (vr->type == VR_RANGE || vr->type == VR_ANTI_RANGE)
1811     {
1812       tree type = TREE_TYPE (vr->min);
1813
1814       fprintf (file, "%s[", (vr->type == VR_ANTI_RANGE) ? "~" : "");
1815
1816       if (INTEGRAL_TYPE_P (type)
1817           && !TYPE_UNSIGNED (type)
1818           && vr->min == TYPE_MIN_VALUE (type))
1819         fprintf (file, "-INF");
1820       else
1821         print_generic_expr (file, vr->min, 0);
1822
1823       fprintf (file, ", ");
1824
1825       if (INTEGRAL_TYPE_P (type)
1826           && vr->max == TYPE_MAX_VALUE (type))
1827         fprintf (file, "+INF");
1828       else
1829         print_generic_expr (file, vr->max, 0);
1830
1831       fprintf (file, "]");
1832
1833       if (vr->equiv)
1834         {
1835           bitmap_iterator bi;
1836           unsigned i, c = 0;
1837
1838           fprintf (file, "  EQUIVALENCES: { ");
1839
1840           EXECUTE_IF_SET_IN_BITMAP (vr->equiv, 0, i, bi)
1841             {
1842               print_generic_expr (file, ssa_name (i), 0);
1843               fprintf (file, " ");
1844               c++;
1845             }
1846
1847           fprintf (file, "} (%u elements)", c);
1848         }
1849     }
1850   else if (vr->type == VR_VARYING)
1851     fprintf (file, "VARYING");
1852   else
1853     fprintf (file, "INVALID RANGE");
1854 }
1855
1856
1857 /* Dump value range VR to stderr.  */
1858
1859 void
1860 debug_value_range (value_range_t *vr)
1861 {
1862   dump_value_range (stderr, vr);
1863 }
1864
1865
1866 /* Dump value ranges of all SSA_NAMEs to FILE.  */
1867
1868 void
1869 dump_all_value_ranges (FILE *file)
1870 {
1871   size_t i;
1872
1873   for (i = 0; i < num_ssa_names; i++)
1874     {
1875       if (vr_value[i])
1876         {
1877           print_generic_expr (file, ssa_name (i), 0);
1878           fprintf (file, ": ");
1879           dump_value_range (file, vr_value[i]);
1880           fprintf (file, "\n");
1881         }
1882     }
1883
1884   fprintf (file, "\n");
1885 }
1886
1887
1888 /* Dump all value ranges to stderr.  */
1889
1890 void
1891 debug_all_value_ranges (void)
1892 {
1893   dump_all_value_ranges (stderr);
1894 }
1895
1896
1897 /* Given a COND_EXPR COND of the form 'V OP W', and an SSA name V,
1898    create a new SSA name N and return the assertion assignment
1899    'V = ASSERT_EXPR <V, V OP W>'.  */
1900
1901 static tree
1902 build_assert_expr_for (tree cond, tree v)
1903 {
1904   tree n, assertion;
1905
1906   gcc_assert (TREE_CODE (v) == SSA_NAME);
1907   n = duplicate_ssa_name (v, NULL_TREE);
1908
1909   if (COMPARISON_CLASS_P (cond))
1910     {
1911       tree a = build (ASSERT_EXPR, TREE_TYPE (v), v, cond); 
1912       assertion = build (MODIFY_EXPR, TREE_TYPE (v), n, a);
1913     }
1914   else if (TREE_CODE (cond) == TRUTH_NOT_EXPR)
1915     {
1916       /* Given !V, build the assignment N = false.  */
1917       tree op0 = TREE_OPERAND (cond, 0);
1918       gcc_assert (op0 == v);
1919       assertion = build (MODIFY_EXPR, TREE_TYPE (v), n, boolean_false_node);
1920     }
1921   else if (TREE_CODE (cond) == SSA_NAME)
1922     {
1923       /* Given V, build the assignment N = true.  */
1924       gcc_assert (v == cond);
1925       assertion = build (MODIFY_EXPR, TREE_TYPE (v), n, boolean_true_node);
1926     }
1927   else
1928     gcc_unreachable ();
1929
1930   SSA_NAME_DEF_STMT (n) = assertion;
1931
1932   /* The new ASSERT_EXPR, creates a new SSA name that replaces the
1933      operand of the ASSERT_EXPR. Register the new name and the old one
1934      in the replacement table so that we can fix the SSA web after
1935      adding all the ASSERT_EXPRs.  */
1936   register_new_name_mapping (n, v);
1937
1938   return assertion;
1939 }
1940
1941
1942 /* Return false if EXPR is a predicate expression involving floating
1943    point values.  */
1944
1945 static inline bool
1946 fp_predicate (tree expr)
1947 {
1948   return (COMPARISON_CLASS_P (expr)
1949           && FLOAT_TYPE_P (TREE_TYPE (TREE_OPERAND (expr, 0))));
1950 }
1951
1952
1953 /* If the range of values taken by OP can be inferred after STMT executes,
1954    return the comparison code (COMP_CODE_P) and value (VAL_P) that
1955    describes the inferred range.  Return true if a range could be
1956    inferred.  */
1957
1958 static bool
1959 infer_value_range (tree stmt, tree op, enum tree_code *comp_code_p, tree *val_p)
1960 {
1961   *val_p = NULL_TREE;
1962   *comp_code_p = ERROR_MARK;
1963
1964   /* Do not attempt to infer anything in names that flow through
1965      abnormal edges.  */
1966   if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op))
1967     return false;
1968
1969   /* Similarly, don't infer anything from statements that may throw
1970      exceptions.  */
1971   if (tree_could_throw_p (stmt))
1972     return false;
1973
1974   if (POINTER_TYPE_P (TREE_TYPE (op)))
1975     {
1976       bool is_store;
1977       unsigned num_uses, num_derefs;
1978
1979       count_uses_and_derefs (op, stmt, &num_uses, &num_derefs, &is_store);
1980       if (num_derefs > 0 && flag_delete_null_pointer_checks)
1981         {
1982           /* We can only assume that a pointer dereference will yield
1983              non-NULL if -fdelete-null-pointer-checks is enabled.  */
1984           *val_p = build_int_cst (TREE_TYPE (op), 0);
1985           *comp_code_p = NE_EXPR;
1986           return true;
1987         }
1988     }
1989
1990   return false;
1991 }
1992
1993
1994 void dump_asserts_for (FILE *, tree);
1995 void debug_asserts_for (tree);
1996 void dump_all_asserts (FILE *);
1997 void debug_all_asserts (void);
1998
1999 /* Dump all the registered assertions for NAME to FILE.  */
2000
2001 void
2002 dump_asserts_for (FILE *file, tree name)
2003 {
2004   assert_locus_t loc;
2005
2006   fprintf (file, "Assertions to be inserted for ");
2007   print_generic_expr (file, name, 0);
2008   fprintf (file, "\n");
2009
2010   loc = asserts_for[SSA_NAME_VERSION (name)];
2011   while (loc)
2012     {
2013       fprintf (file, "\t");
2014       print_generic_expr (file, bsi_stmt (loc->si), 0);
2015       fprintf (file, "\n\tBB #%d", loc->bb->index);
2016       if (loc->e)
2017         {
2018           fprintf (file, "\n\tEDGE %d->%d", loc->e->src->index,
2019                    loc->e->dest->index);
2020           dump_edge_info (file, loc->e, 0);
2021         }
2022       fprintf (file, "\n\tPREDICATE: ");
2023       print_generic_expr (file, name, 0);
2024       fprintf (file, " %s ", tree_code_name[(int)loc->comp_code]);
2025       print_generic_expr (file, loc->val, 0);
2026       fprintf (file, "\n\n");
2027       loc = loc->next;
2028     }
2029
2030   fprintf (file, "\n");
2031 }
2032
2033
2034 /* Dump all the registered assertions for NAME to stderr.  */
2035
2036 void
2037 debug_asserts_for (tree name)
2038 {
2039   dump_asserts_for (stderr, name);
2040 }
2041
2042
2043 /* Dump all the registered assertions for all the names to FILE.  */
2044
2045 void
2046 dump_all_asserts (FILE *file)
2047 {
2048   unsigned i;
2049   bitmap_iterator bi;
2050
2051   fprintf (file, "\nASSERT_EXPRs to be inserted\n\n");
2052   EXECUTE_IF_SET_IN_BITMAP (need_assert_for, 0, i, bi)
2053     dump_asserts_for (file, ssa_name (i));
2054   fprintf (file, "\n");
2055 }
2056
2057
2058 /* Dump all the registered assertions for all the names to stderr.  */
2059
2060 void
2061 debug_all_asserts (void)
2062 {
2063   dump_all_asserts (stderr);
2064 }
2065
2066
2067 /* If NAME doesn't have an ASSERT_EXPR registered for asserting
2068    'NAME COMP_CODE VAL' at a location that dominates block BB or
2069    E->DEST, then register this location as a possible insertion point
2070    for ASSERT_EXPR <NAME, NAME COMP_CODE VAL>.
2071
2072    BB, E and SI provide the exact insertion point for the new
2073    ASSERT_EXPR.  If BB is NULL, then the ASSERT_EXPR is to be inserted
2074    on edge E.  Otherwise, if E is NULL, the ASSERT_EXPR is inserted on
2075    BB.  If SI points to a COND_EXPR or a SWITCH_EXPR statement, then E
2076    must not be NULL.  */
2077
2078 static void
2079 register_new_assert_for (tree name,
2080                          enum tree_code comp_code,
2081                          tree val,
2082                          basic_block bb,
2083                          edge e,
2084                          block_stmt_iterator si)
2085 {
2086   assert_locus_t n, loc, last_loc;
2087   bool found;
2088   basic_block dest_bb;
2089
2090 #if defined ENABLE_CHECKING
2091   gcc_assert (bb == NULL || e == NULL);
2092
2093   if (e == NULL)
2094     gcc_assert (TREE_CODE (bsi_stmt (si)) != COND_EXPR
2095                 && TREE_CODE (bsi_stmt (si)) != SWITCH_EXPR);
2096 #endif
2097
2098   /* The new assertion A will be inserted at BB or E.  We need to
2099      determine if the new location is dominated by a previously
2100      registered location for A.  If we are doing an edge insertion,
2101      assume that A will be inserted at E->DEST.  Note that this is not
2102      necessarily true.
2103      
2104      If E is a critical edge, it will be split.  But even if E is
2105      split, the new block will dominate the same set of blocks that
2106      E->DEST dominates.
2107      
2108      The reverse, however, is not true, blocks dominated by E->DEST
2109      will not be dominated by the new block created to split E.  So,
2110      if the insertion location is on a critical edge, we will not use
2111      the new location to move another assertion previously registered
2112      at a block dominated by E->DEST.  */
2113   dest_bb = (bb) ? bb : e->dest;
2114
2115   /* If NAME already has an ASSERT_EXPR registered for COMP_CODE and
2116      VAL at a block dominating DEST_BB, then we don't need to insert a new
2117      one.  Similarly, if the same assertion already exists at a block
2118      dominated by DEST_BB and the new location is not on a critical
2119      edge, then update the existing location for the assertion (i.e.,
2120      move the assertion up in the dominance tree).
2121
2122      Note, this is implemented as a simple linked list because there
2123      should not be more than a handful of assertions registered per
2124      name.  If this becomes a performance problem, a table hashed by
2125      COMP_CODE and VAL could be implemented.  */
2126   loc = asserts_for[SSA_NAME_VERSION (name)];
2127   last_loc = loc;
2128   found = false;
2129   while (loc)
2130     {
2131       if (loc->comp_code == comp_code
2132           && (loc->val == val
2133               || operand_equal_p (loc->val, val, 0)))
2134         {
2135           /* If the assertion NAME COMP_CODE VAL has already been
2136              registered at a basic block that dominates DEST_BB, then
2137              we don't need to insert the same assertion again.  Note
2138              that we don't check strict dominance here to avoid
2139              replicating the same assertion inside the same basic
2140              block more than once (e.g., when a pointer is
2141              dereferenced several times inside a block).
2142
2143              An exception to this rule are edge insertions.  If the
2144              new assertion is to be inserted on edge E, then it will
2145              dominate all the other insertions that we may want to
2146              insert in DEST_BB.  So, if we are doing an edge
2147              insertion, don't do this dominance check.  */
2148           if (e == NULL
2149               && dominated_by_p (CDI_DOMINATORS, dest_bb, loc->bb))
2150             return;
2151
2152           /* Otherwise, if E is not a critical edge and DEST_BB
2153              dominates the existing location for the assertion, move
2154              the assertion up in the dominance tree by updating its
2155              location information.  */
2156           if ((e == NULL || !EDGE_CRITICAL_P (e))
2157               && dominated_by_p (CDI_DOMINATORS, loc->bb, dest_bb))
2158             {
2159               loc->bb = dest_bb;
2160               loc->e = e;
2161               loc->si = si;
2162               return;
2163             }
2164         }
2165
2166       /* Update the last node of the list and move to the next one.  */
2167       last_loc = loc;
2168       loc = loc->next;
2169     }
2170
2171   /* If we didn't find an assertion already registered for
2172      NAME COMP_CODE VAL, add a new one at the end of the list of
2173      assertions associated with NAME.  */
2174   n = xmalloc (sizeof (*n));
2175   n->bb = dest_bb;
2176   n->e = e;
2177   n->si = si;
2178   n->comp_code = comp_code;
2179   n->val = val;
2180   n->next = NULL;
2181
2182   if (last_loc)
2183     last_loc->next = n;
2184   else
2185     asserts_for[SSA_NAME_VERSION (name)] = n;
2186
2187   bitmap_set_bit (need_assert_for, SSA_NAME_VERSION (name));
2188 }
2189
2190
2191 /* Try to register an edge assertion for SSA name NAME on edge E for
2192    the conditional jump pointed by SI.  Return true if an assertion
2193    for NAME could be registered.  */
2194
2195 static bool
2196 register_edge_assert_for (tree name, edge e, block_stmt_iterator si)
2197 {
2198   tree val, stmt;
2199   enum tree_code comp_code;
2200
2201   stmt = bsi_stmt (si);
2202
2203   /* Do not attempt to infer anything in names that flow through
2204      abnormal edges.  */
2205   if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name))
2206     return false;
2207
2208   /* If NAME was not found in the sub-graph reachable from E, then
2209      there's nothing to do.  */
2210   if (!TEST_BIT (found_in_subgraph, SSA_NAME_VERSION (name)))
2211     return false;
2212
2213   /* We found a use of NAME in the sub-graph rooted at E->DEST.
2214      Register an assertion for NAME according to the value that NAME
2215      takes on edge E.  */
2216   if (TREE_CODE (stmt) == COND_EXPR)
2217     {
2218       /* If BB ends in a COND_EXPR then NAME then we should insert
2219          the original predicate on EDGE_TRUE_VALUE and the
2220          opposite predicate on EDGE_FALSE_VALUE.  */
2221       tree cond = COND_EXPR_COND (stmt);
2222       bool is_else_edge = (e->flags & EDGE_FALSE_VALUE) != 0;
2223
2224       /* Predicates may be a single SSA name or NAME OP VAL.  */
2225       if (cond == name)
2226         {
2227           /* If the predicate is a name, it must be NAME, in which
2228              case we create the predicate NAME == true or
2229              NAME == false accordingly.  */
2230           comp_code = EQ_EXPR;
2231           val = (is_else_edge) ? boolean_false_node : boolean_true_node;
2232         }
2233       else
2234         {
2235           /* Otherwise, we have a comparison of the form NAME COMP VAL
2236              or VAL COMP NAME.  */
2237           if (name == TREE_OPERAND (cond, 1))
2238             {
2239               /* If the predicate is of the form VAL COMP NAME, flip
2240                  COMP around because we need to register NAME as the
2241                  first operand in the predicate.  */
2242               comp_code = swap_tree_comparison (TREE_CODE (cond));
2243               val = TREE_OPERAND (cond, 0);
2244             }
2245           else
2246             {
2247               /* The comparison is of the form NAME COMP VAL, so the
2248                  comparison code remains unchanged.  */
2249               comp_code = TREE_CODE (cond);
2250               val = TREE_OPERAND (cond, 1);
2251             }
2252
2253           /* If we are inserting the assertion on the ELSE edge, we
2254              need to invert the sign comparison.  */
2255           if (is_else_edge)
2256             comp_code = invert_tree_comparison (comp_code, 0);
2257         }
2258     }
2259   else
2260     {
2261       /* FIXME.  Handle SWITCH_EXPR.  */
2262       gcc_unreachable ();
2263     }
2264
2265   register_new_assert_for (name, comp_code, val, NULL, e, si);
2266   return true;
2267 }
2268
2269
2270 static bool find_assert_locations (basic_block bb);
2271
2272 /* Determine whether the outgoing edges of BB should receive an
2273    ASSERT_EXPR for each of the operands of BB's last statement.  The
2274    last statement of BB must be a COND_EXPR or a SWITCH_EXPR.
2275
2276    If any of the sub-graphs rooted at BB have an interesting use of
2277    the predicate operands, an assert location node is added to the
2278    list of assertions for the corresponding operands.  */
2279
2280 static bool
2281 find_conditional_asserts (basic_block bb)
2282 {
2283   bool need_assert;
2284   block_stmt_iterator last_si;
2285   tree op, last;
2286   edge_iterator ei;
2287   edge e;
2288   ssa_op_iter iter;
2289
2290   need_assert = false;
2291   last_si = bsi_last (bb);
2292   last = bsi_stmt (last_si);
2293
2294   /* Look for uses of the operands in each of the sub-graphs
2295      rooted at BB.  We need to check each of the outgoing edges
2296      separately, so that we know what kind of ASSERT_EXPR to
2297      insert.  */
2298   FOR_EACH_EDGE (e, ei, bb->succs)
2299     {
2300       if (e->dest == bb)
2301         continue;
2302
2303       /* Remove the COND_EXPR operands from the FOUND_IN_SUBGRAPH bitmap.
2304          Otherwise, when we finish traversing each of the sub-graphs, we
2305          won't know whether the variables were found in the sub-graphs or
2306          if they had been found in a block upstream from BB.  */
2307       FOR_EACH_SSA_TREE_OPERAND (op, last, iter, SSA_OP_USE)
2308         RESET_BIT (found_in_subgraph, SSA_NAME_VERSION (op));
2309
2310       /* Traverse the strictly dominated sub-graph rooted at E->DEST
2311          to determine if any of the operands in the conditional
2312          predicate are used.  */
2313       if (e->dest != bb)
2314         need_assert |= find_assert_locations (e->dest);
2315
2316       /* Register the necessary assertions for each operand in the
2317          conditional predicate.  */
2318       FOR_EACH_SSA_TREE_OPERAND (op, last, iter, SSA_OP_USE)
2319         need_assert |= register_edge_assert_for (op, e, last_si);
2320     }
2321
2322   /* Finally, indicate that we have found the operands in the
2323      conditional.  */
2324   FOR_EACH_SSA_TREE_OPERAND (op, last, iter, SSA_OP_USE)
2325     SET_BIT (found_in_subgraph, SSA_NAME_VERSION (op));
2326
2327   return need_assert;
2328 }
2329
2330
2331 /* Traverse all the statements in block BB looking for statements that
2332    may generate useful assertions for the SSA names in their operand.
2333    If a statement produces a useful assertion A for name N_i, then the
2334    list of assertions already generated for N_i is scanned to
2335    determine if A is actually needed.
2336    
2337    If N_i already had the assertion A at a location dominating the
2338    current location, then nothing needs to be done.  Otherwise, the
2339    new location for A is recorded instead.
2340
2341    1- For every statement S in BB, all the variables used by S are
2342       added to bitmap FOUND_IN_SUBGRAPH.
2343
2344    2- If statement S uses an operand N in a way that exposes a known
2345       value range for N, then if N was not already generated by an
2346       ASSERT_EXPR, create a new assert location for N.  For instance,
2347       if N is a pointer and the statement dereferences it, we can
2348       assume that N is not NULL.
2349
2350    3- COND_EXPRs are a special case of #2.  We can derive range
2351       information from the predicate but need to insert different
2352       ASSERT_EXPRs for each of the sub-graphs rooted at the
2353       conditional block.  If the last statement of BB is a conditional
2354       expression of the form 'X op Y', then
2355
2356       a) Remove X and Y from the set FOUND_IN_SUBGRAPH.
2357
2358       b) If the conditional is the only entry point to the sub-graph
2359          corresponding to the THEN_CLAUSE, recurse into it.  On
2360          return, if X and/or Y are marked in FOUND_IN_SUBGRAPH, then
2361          an ASSERT_EXPR is added for the corresponding variable.
2362
2363       c) Repeat step (b) on the ELSE_CLAUSE.
2364
2365       d) Mark X and Y in FOUND_IN_SUBGRAPH.
2366
2367       For instance,
2368
2369             if (a == 9)
2370               b = a;
2371             else
2372               b = c + 1;
2373
2374       In this case, an assertion on the THEN clause is useful to
2375       determine that 'a' is always 9 on that edge.  However, an assertion
2376       on the ELSE clause would be unnecessary.
2377
2378    4- If BB does not end in a conditional expression, then we recurse
2379       into BB's dominator children.
2380    
2381    At the end of the recursive traversal, every SSA name will have a
2382    list of locations where ASSERT_EXPRs should be added.  When a new
2383    location for name N is found, it is registered by calling
2384    register_new_assert_for.  That function keeps track of all the
2385    registered assertions to prevent adding unnecessary assertions.
2386    For instance, if a pointer P_4 is dereferenced more than once in a
2387    dominator tree, only the location dominating all the dereference of
2388    P_4 will receive an ASSERT_EXPR.
2389
2390    If this function returns true, then it means that there are names
2391    for which we need to generate ASSERT_EXPRs.  Those assertions are
2392    inserted by process_assert_insertions.
2393
2394    TODO.  Handle SWITCH_EXPR.  */
2395
2396 static bool
2397 find_assert_locations (basic_block bb)
2398 {
2399   block_stmt_iterator si;
2400   tree last, phi;
2401   bool need_assert;
2402   basic_block son;
2403
2404   if (TEST_BIT (blocks_visited, bb->index))
2405     return false;
2406
2407   SET_BIT (blocks_visited, bb->index);
2408
2409   need_assert = false;
2410
2411   /* Traverse all PHI nodes in BB marking used operands.  */
2412   for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
2413     {
2414       use_operand_p arg_p;
2415       ssa_op_iter i;
2416
2417       FOR_EACH_PHI_ARG (arg_p, phi, i, SSA_OP_USE)
2418         {
2419           tree arg = USE_FROM_PTR (arg_p);
2420           if (TREE_CODE (arg) == SSA_NAME)
2421             {
2422               gcc_assert (is_gimple_reg (PHI_RESULT (phi)));
2423               SET_BIT (found_in_subgraph, SSA_NAME_VERSION (arg));
2424             }
2425         }
2426     }
2427
2428   /* Traverse all the statements in BB marking used names and looking
2429      for statements that may infer assertions for their used operands.  */
2430   last = NULL_TREE;
2431   for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
2432     {
2433       tree stmt, op;
2434       ssa_op_iter i;
2435
2436       stmt = bsi_stmt (si);
2437
2438       /* See if we can derive an assertion for any of STMT's operands.  */
2439       FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_USE)
2440         {
2441           tree value;
2442           enum tree_code comp_code;
2443
2444           /* Mark OP in bitmap FOUND_IN_SUBGRAPH.  If STMT is inside
2445              the sub-graph of a conditional block, when we return from
2446              this recursive walk, our parent will use the
2447              FOUND_IN_SUBGRAPH bitset to determine if one of the
2448              operands it was looking for was present in the sub-graph.  */
2449           SET_BIT (found_in_subgraph, SSA_NAME_VERSION (op));
2450
2451           /* If OP is used only once, namely in this STMT, don't
2452              bother creating an ASSERT_EXPR for it.  Such an
2453              ASSERT_EXPR would do nothing but increase compile time.
2454              Experiments show that with this simple check, we can save
2455              more than 20% of ASSERT_EXPRs.  */
2456           if (has_single_use (op))
2457             continue;
2458
2459           /* If OP is used in such a way that we can infer a value
2460              range for it, and we don't find a previous assertion for
2461              it, create a new assertion location node for OP.  */
2462           if (infer_value_range (stmt, op, &comp_code, &value))
2463             {
2464               register_new_assert_for (op, comp_code, value, bb, NULL, si);
2465               need_assert = true;
2466             }
2467         }
2468
2469       /* Remember the last statement of the block.  */
2470       last = stmt;
2471     }
2472
2473   /* If BB's last statement is a conditional expression
2474      involving integer operands, recurse into each of the sub-graphs
2475      rooted at BB to determine if we need to add ASSERT_EXPRs.  */
2476   if (last
2477       && TREE_CODE (last) == COND_EXPR
2478       && !fp_predicate (COND_EXPR_COND (last))
2479       && !ZERO_SSA_OPERANDS (last, SSA_OP_USE))
2480     need_assert |= find_conditional_asserts (bb);
2481
2482   /* Recurse into the dominator children of BB.  */
2483   for (son = first_dom_son (CDI_DOMINATORS, bb);
2484        son;
2485        son = next_dom_son (CDI_DOMINATORS, son))
2486     need_assert |= find_assert_locations (son);
2487
2488   return need_assert;
2489 }
2490
2491
2492 /* Create an ASSERT_EXPR for NAME and insert it in the location
2493    indicated by LOC.  Return true if we made any edge insertions.  */
2494
2495 static bool
2496 process_assert_insertions_for (tree name, assert_locus_t loc)
2497 {
2498   /* Build the comparison expression NAME_i COMP_CODE VAL.  */
2499   tree stmt, cond, assert_expr;
2500   edge_iterator ei;
2501   edge e;
2502
2503   cond = build (loc->comp_code, boolean_type_node, name, loc->val);
2504   assert_expr = build_assert_expr_for (cond, name);
2505
2506   if (loc->e)
2507     {
2508       /* We have been asked to insert the assertion on an edge.  This
2509          is used only by COND_EXPR and SWITCH_EXPR assertions.  */
2510 #if defined ENABLE_CHECKING
2511       gcc_assert (TREE_CODE (bsi_stmt (loc->si)) == COND_EXPR
2512           || TREE_CODE (bsi_stmt (loc->si)) == SWITCH_EXPR);
2513 #endif
2514
2515       bsi_insert_on_edge (loc->e, assert_expr);
2516       return true;
2517     }
2518
2519   /* Otherwise, we can insert right after LOC->SI iff the
2520      statement must not be the last statement in the block.  */
2521   stmt = bsi_stmt (loc->si);
2522   if (!stmt_ends_bb_p (stmt))
2523     {
2524       bsi_insert_after (&loc->si, assert_expr, BSI_SAME_STMT);
2525       return false;
2526     }
2527
2528   /* If STMT must be the last statement in BB, we can only insert new
2529      assertions on the non-abnormal edge out of BB.  Note that since
2530      STMT is not control flow, there may only be one non-abnormal edge
2531      out of BB.  */
2532   FOR_EACH_EDGE (e, ei, loc->bb->succs)
2533     if (!(e->flags & EDGE_ABNORMAL))
2534       {
2535         bsi_insert_on_edge (e, assert_expr);
2536         return true;
2537       }
2538
2539   gcc_unreachable ();
2540 }
2541
2542
2543 /* Process all the insertions registered for every name N_i registered
2544    in NEED_ASSERT_FOR.  The list of assertions to be inserted are
2545    found in ASSERTS_FOR[i].  */
2546
2547 static void
2548 process_assert_insertions (void)
2549 {
2550   unsigned i;
2551   bitmap_iterator bi;
2552   bool update_edges_p = false;
2553   int num_asserts = 0;
2554
2555   if (dump_file && (dump_flags & TDF_DETAILS))
2556     dump_all_asserts (dump_file);
2557
2558   EXECUTE_IF_SET_IN_BITMAP (need_assert_for, 0, i, bi)
2559     {
2560       assert_locus_t loc = asserts_for[i];
2561       gcc_assert (loc);
2562
2563       while (loc)
2564         {
2565           assert_locus_t next = loc->next;
2566           update_edges_p |= process_assert_insertions_for (ssa_name (i), loc);
2567           free (loc);
2568           loc = next;
2569           num_asserts++;
2570         }
2571     }
2572
2573   if (update_edges_p)
2574     bsi_commit_edge_inserts ();
2575
2576   if (dump_file && (dump_flags & TDF_STATS))
2577     fprintf (dump_file, "\nNumber of ASSERT_EXPR expressions inserted: %d\n\n",
2578              num_asserts);
2579 }
2580
2581
2582 /* Traverse the flowgraph looking for conditional jumps to insert range
2583    expressions.  These range expressions are meant to provide information
2584    to optimizations that need to reason in terms of value ranges.  They
2585    will not be expanded into RTL.  For instance, given:
2586
2587    x = ...
2588    y = ...
2589    if (x < y)
2590      y = x - 2;
2591    else
2592      x = y + 3;
2593
2594    this pass will transform the code into:
2595
2596    x = ...
2597    y = ...
2598    if (x < y)
2599     {
2600       x = ASSERT_EXPR <x, x < y>
2601       y = x - 2
2602     }
2603    else
2604     {
2605       y = ASSERT_EXPR <y, x <= y>
2606       x = y + 3
2607     }
2608
2609    The idea is that once copy and constant propagation have run, other
2610    optimizations will be able to determine what ranges of values can 'x'
2611    take in different paths of the code, simply by checking the reaching
2612    definition of 'x'.  */
2613
2614 static void
2615 insert_range_assertions (void)
2616 {
2617   edge e;
2618   edge_iterator ei;
2619   bool update_ssa_p;
2620   
2621   found_in_subgraph = sbitmap_alloc (num_ssa_names);
2622   sbitmap_zero (found_in_subgraph);
2623
2624   blocks_visited = sbitmap_alloc (last_basic_block);
2625   sbitmap_zero (blocks_visited);
2626
2627   need_assert_for = BITMAP_ALLOC (NULL);
2628   asserts_for = xmalloc (num_ssa_names * sizeof (assert_locus_t));
2629   memset (asserts_for, 0, num_ssa_names * sizeof (assert_locus_t));
2630
2631   calculate_dominance_info (CDI_DOMINATORS);
2632
2633   update_ssa_p = false;
2634   FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
2635     if (find_assert_locations (e->dest))
2636       update_ssa_p = true;
2637
2638   if (update_ssa_p)
2639     {
2640       process_assert_insertions ();
2641       update_ssa (TODO_update_ssa_no_phi);
2642     }
2643
2644   if (dump_file && (dump_flags & TDF_DETAILS))
2645     {
2646       fprintf (dump_file, "\nSSA form after inserting ASSERT_EXPRs\n");
2647       dump_function_to_file (current_function_decl, dump_file, dump_flags);
2648     }
2649
2650   sbitmap_free (found_in_subgraph);
2651   free (asserts_for);
2652   BITMAP_FREE (need_assert_for);
2653 }
2654
2655
2656 /* Convert range assertion expressions into the implied copies and
2657    copy propagate away the copies.  Doing the trivial copy propagation
2658    here avoids the need to run the full copy propagation pass after
2659    VRP. 
2660    
2661    FIXME, this will eventually lead to copy propagation removing the
2662    names that had useful range information attached to them.  For
2663    instance, if we had the assertion N_i = ASSERT_EXPR <N_j, N_j > 3>,
2664    then N_i will have the range [3, +INF].
2665    
2666    However, by converting the assertion into the implied copy
2667    operation N_i = N_j, we will then copy-propagate N_j into the uses
2668    of N_i and lose the range information.  We may want to hold on to
2669    ASSERT_EXPRs a little while longer as the ranges could be used in
2670    things like jump threading.
2671    
2672    The problem with keeping ASSERT_EXPRs around is that passes after
2673    VRP need to handle them appropriately. 
2674
2675    Another approach would be to make the range information a first
2676    class property of the SSA_NAME so that it can be queried from
2677    any pass.  This is made somewhat more complex by the need for
2678    multiple ranges to be associated with one SSA_NAME.  */
2679
2680 static void
2681 remove_range_assertions (void)
2682 {
2683   basic_block bb;
2684   block_stmt_iterator si;
2685
2686   /* Note that the BSI iterator bump happens at the bottom of the
2687      loop and no bump is necessary if we're removing the statement
2688      referenced by the current BSI.  */
2689   FOR_EACH_BB (bb)
2690     for (si = bsi_start (bb); !bsi_end_p (si);)
2691       {
2692         tree stmt = bsi_stmt (si);
2693
2694         if (TREE_CODE (stmt) == MODIFY_EXPR
2695             && TREE_CODE (TREE_OPERAND (stmt, 1)) == ASSERT_EXPR)
2696           {
2697             tree rhs = TREE_OPERAND (stmt, 1);
2698             tree cond = fold (ASSERT_EXPR_COND (rhs));
2699             use_operand_p use_p;
2700             imm_use_iterator iter;
2701
2702             gcc_assert (cond != boolean_false_node);
2703             TREE_OPERAND (stmt, 1) = ASSERT_EXPR_VAR (rhs);
2704             update_stmt (stmt);
2705
2706             /* The statement is now a copy.  Propagate the RHS into
2707                every use of the LHS.  */
2708             FOR_EACH_IMM_USE_SAFE (use_p, iter, TREE_OPERAND (stmt, 0))
2709               {
2710                 SET_USE (use_p, ASSERT_EXPR_VAR (rhs));
2711                 update_stmt (USE_STMT (use_p));
2712               }
2713
2714             /* And finally, remove the copy, it is not needed.  */
2715             bsi_remove (&si);
2716           }
2717         else
2718           bsi_next (&si);
2719       }
2720 }
2721
2722
2723 /* Return true if STMT is interesting for VRP.  */
2724
2725 static bool
2726 stmt_interesting_for_vrp (tree stmt)
2727 {
2728   if (TREE_CODE (stmt) == PHI_NODE
2729       && is_gimple_reg (PHI_RESULT (stmt))
2730       && (INTEGRAL_TYPE_P (TREE_TYPE (PHI_RESULT (stmt)))
2731           || POINTER_TYPE_P (TREE_TYPE (PHI_RESULT (stmt)))))
2732     return true;
2733   else if (TREE_CODE (stmt) == MODIFY_EXPR)
2734     {
2735       tree lhs = TREE_OPERAND (stmt, 0);
2736
2737       if (TREE_CODE (lhs) == SSA_NAME
2738           && (INTEGRAL_TYPE_P (TREE_TYPE (lhs))
2739               || POINTER_TYPE_P (TREE_TYPE (lhs)))
2740           && ZERO_SSA_OPERANDS (stmt, SSA_OP_ALL_VIRTUALS))
2741         return true;
2742     }
2743   else if (TREE_CODE (stmt) == COND_EXPR || TREE_CODE (stmt) == SWITCH_EXPR)
2744     return true;
2745
2746   return false;
2747 }
2748
2749
2750 /* Initialize local data structures for VRP.  Return true if VRP
2751    is worth running (i.e. if we found any statements that could
2752    benefit from range information).  */
2753
2754 static void
2755 vrp_initialize (void)
2756 {
2757   basic_block bb;
2758
2759   vr_value = xmalloc (num_ssa_names * sizeof (value_range_t *));
2760   memset (vr_value, 0, num_ssa_names * sizeof (value_range_t *));
2761
2762   FOR_EACH_BB (bb)
2763     {
2764       block_stmt_iterator si;
2765       tree phi;
2766
2767       for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
2768         {
2769           if (!stmt_interesting_for_vrp (phi))
2770             {
2771               tree lhs = PHI_RESULT (phi);
2772               set_value_range_to_varying (get_value_range (lhs));
2773               DONT_SIMULATE_AGAIN (phi) = true;
2774             }
2775           else
2776             DONT_SIMULATE_AGAIN (phi) = false;
2777         }
2778
2779       for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
2780         {
2781           tree stmt = bsi_stmt (si);
2782
2783           if (!stmt_interesting_for_vrp (stmt))
2784             {
2785               ssa_op_iter i;
2786               tree def;
2787               FOR_EACH_SSA_TREE_OPERAND (def, stmt, i, SSA_OP_DEF)
2788                 set_value_range_to_varying (get_value_range (def));
2789               DONT_SIMULATE_AGAIN (stmt) = true;
2790             }
2791           else
2792             {
2793               DONT_SIMULATE_AGAIN (stmt) = false;
2794             }
2795         }
2796     }
2797 }
2798
2799
2800 /* Visit assignment STMT.  If it produces an interesting range, record
2801    the SSA name in *OUTPUT_P.  */
2802
2803 static enum ssa_prop_result
2804 vrp_visit_assignment (tree stmt, tree *output_p)
2805 {
2806   tree lhs, rhs, def;
2807   ssa_op_iter iter;
2808
2809   lhs = TREE_OPERAND (stmt, 0);
2810   rhs = TREE_OPERAND (stmt, 1);
2811
2812   /* We only keep track of ranges in integral and pointer types.  */
2813   if (TREE_CODE (lhs) == SSA_NAME
2814       && (INTEGRAL_TYPE_P (TREE_TYPE (lhs))
2815           || POINTER_TYPE_P (TREE_TYPE (lhs))))
2816     {
2817       struct loop *l;
2818       value_range_t new_vr = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
2819
2820       extract_range_from_expr (&new_vr, rhs);
2821
2822       /* If STMT is inside a loop, we may be able to know something
2823          else about the range of LHS by examining scalar evolution
2824          information.  */
2825       if (cfg_loops && (l = loop_containing_stmt (stmt)))
2826         adjust_range_with_scev (&new_vr, l, stmt, lhs);
2827
2828       if (update_value_range (lhs, &new_vr))
2829         {
2830           *output_p = lhs;
2831
2832           if (dump_file && (dump_flags & TDF_DETAILS))
2833             {
2834               fprintf (dump_file, "Found new range for ");
2835               print_generic_expr (dump_file, lhs, 0);
2836               fprintf (dump_file, ": ");
2837               dump_value_range (dump_file, &new_vr);
2838               fprintf (dump_file, "\n\n");
2839             }
2840
2841           if (new_vr.type == VR_VARYING)
2842             return SSA_PROP_VARYING;
2843
2844           return SSA_PROP_INTERESTING;
2845         }
2846
2847       return SSA_PROP_NOT_INTERESTING;
2848     }
2849   
2850   /* Every other statement produces no useful ranges.  */
2851   FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF)
2852     set_value_range_to_varying (get_value_range (def));
2853
2854   return SSA_PROP_VARYING;
2855 }
2856
2857
2858 /* Compare all the value ranges for names equivalent to VAR with VAL
2859    using comparison code COMP.  Return the same value returned by
2860    compare_range_with_value.  */
2861
2862 static tree
2863 compare_name_with_value (enum tree_code comp, tree var, tree val)
2864 {
2865   bitmap_iterator bi;
2866   unsigned i;
2867   bitmap e;
2868   tree retval, t;
2869   
2870   t = retval = NULL_TREE;
2871
2872   /* Get the set of equivalences for VAR.  */
2873   e = get_value_range (var)->equiv;
2874
2875   /* Add VAR to its own set of equivalences so that VAR's value range
2876      is processed by this loop (otherwise, we would have to replicate
2877      the body of the loop just to check VAR's value range).  */
2878   bitmap_set_bit (e, SSA_NAME_VERSION (var));
2879
2880   EXECUTE_IF_SET_IN_BITMAP (e, 0, i, bi)
2881     {
2882       value_range_t equiv_vr = *(vr_value[i]);
2883
2884       /* If name N_i does not have a valid range, use N_i as its own
2885          range.  This allows us to compare against names that may
2886          have N_i in their ranges.  */
2887       if (equiv_vr.type == VR_VARYING || equiv_vr.type == VR_UNDEFINED)
2888         {
2889           equiv_vr.type = VR_RANGE;
2890           equiv_vr.min = ssa_name (i);
2891           equiv_vr.max = ssa_name (i);
2892         }
2893
2894       t = compare_range_with_value (comp, &equiv_vr, val);
2895       if (t)
2896         {
2897           /* All the ranges should compare the same against VAL.  */
2898           gcc_assert (retval == NULL || t == retval);
2899           retval = t;
2900         }
2901     }
2902
2903   /* Remove VAR from its own equivalence set.  */
2904   bitmap_clear_bit (e, SSA_NAME_VERSION (var));
2905
2906   if (retval)
2907     return retval;
2908
2909   /* We couldn't find a non-NULL value for the predicate.  */
2910   return NULL_TREE;
2911 }
2912
2913
2914 /* Given a comparison code COMP and names N1 and N2, compare all the
2915    ranges equivalent to N1 against all the ranges equivalent to N2
2916    to determine the value of N1 COMP N2.  Return the same value
2917    returned by compare_ranges.  */
2918
2919 static tree
2920 compare_names (enum tree_code comp, tree n1, tree n2)
2921 {
2922   tree t, retval;
2923   bitmap e1, e2;
2924   bitmap_iterator bi1, bi2;
2925   unsigned i1, i2;
2926
2927   /* Compare the ranges of every name equivalent to N1 against the
2928      ranges of every name equivalent to N2.  */
2929   e1 = get_value_range (n1)->equiv;
2930   e2 = get_value_range (n2)->equiv;
2931
2932   /* Add N1 and N2 to their own set of equivalences to avoid
2933      duplicating the body of the loop just to check N1 and N2
2934      ranges.  */
2935   bitmap_set_bit (e1, SSA_NAME_VERSION (n1));
2936   bitmap_set_bit (e2, SSA_NAME_VERSION (n2));
2937
2938   /* If the equivalence sets have a common intersection, then the two
2939      names can be compared without checking their ranges.  */
2940   if (bitmap_intersect_p (e1, e2))
2941     {
2942       bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
2943       bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
2944
2945       return (comp == EQ_EXPR || comp == GE_EXPR || comp == LE_EXPR)
2946              ? boolean_true_node
2947              : boolean_false_node;
2948     }
2949
2950   /* Otherwise, compare all the equivalent ranges.  First, add N1 and
2951      N2 to their own set of equivalences to avoid duplicating the body
2952      of the loop just to check N1 and N2 ranges.  */
2953   EXECUTE_IF_SET_IN_BITMAP (e1, 0, i1, bi1)
2954     {
2955       value_range_t vr1 = *(vr_value[i1]);
2956
2957       /* If the range is VARYING or UNDEFINED, use the name itself.  */
2958       if (vr1.type == VR_VARYING || vr1.type == VR_UNDEFINED)
2959         {
2960           vr1.type = VR_RANGE;
2961           vr1.min = ssa_name (i1);
2962           vr1.max = ssa_name (i1);
2963         }
2964
2965       t = retval = NULL_TREE;
2966       EXECUTE_IF_SET_IN_BITMAP (e2, 0, i2, bi2)
2967         {
2968           value_range_t vr2 = *(vr_value[i2]);
2969
2970           if (vr2.type == VR_VARYING || vr2.type == VR_UNDEFINED)
2971             {
2972               vr2.type = VR_RANGE;
2973               vr2.min = ssa_name (i2);
2974               vr2.max = ssa_name (i2);
2975             }
2976
2977           t = compare_ranges (comp, &vr1, &vr2);
2978           if (t)
2979             {
2980               /* All the ranges in the equivalent sets should compare
2981                  the same.  */
2982               gcc_assert (retval == NULL || t == retval);
2983               retval = t;
2984             }
2985         }
2986
2987       if (retval)
2988         {
2989           bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
2990           bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
2991           return retval;
2992         }
2993     }
2994
2995   /* None of the equivalent ranges are useful in computing this
2996      comparison.  */
2997   bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
2998   bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
2999   return NULL_TREE;
3000 }
3001
3002
3003 /* Given a conditional predicate COND, try to determine if COND yields
3004    true or false based on the value ranges of its operands.  Return
3005    BOOLEAN_TRUE_NODE if the conditional always evaluates to true,
3006    BOOLEAN_FALSE_NODE if the conditional always evaluates to false, and,
3007    NULL if the conditional cannot be evaluated at compile time.
3008
3009    If USE_EQUIV_P is true, the ranges of all the names equivalent with
3010    the operands in COND are used when trying to compute its value.
3011    This is only used during final substitution.  During propagation,
3012    we only check the range of each variable and not its equivalents.  */
3013
3014 tree
3015 vrp_evaluate_conditional (tree cond, bool use_equiv_p)
3016 {
3017   gcc_assert (TREE_CODE (cond) == SSA_NAME
3018               || TREE_CODE_CLASS (TREE_CODE (cond)) == tcc_comparison);
3019
3020   if (TREE_CODE (cond) == SSA_NAME)
3021     {
3022       value_range_t *vr;
3023       tree retval;
3024
3025       if (use_equiv_p)
3026         retval = compare_name_with_value (NE_EXPR, cond, boolean_false_node);
3027       else
3028         {
3029           value_range_t *vr = get_value_range (cond);
3030           retval = compare_range_with_value (NE_EXPR, vr, boolean_false_node);
3031         }
3032
3033       /* If COND has a known boolean range, return it.  */
3034       if (retval)
3035         return retval;
3036
3037       /* Otherwise, if COND has a symbolic range of exactly one value,
3038          return it.  */
3039       vr = get_value_range (cond);
3040       if (vr->type == VR_RANGE && vr->min == vr->max)
3041         return vr->min;
3042     }
3043   else
3044     {
3045       tree op0 = TREE_OPERAND (cond, 0);
3046       tree op1 = TREE_OPERAND (cond, 1);
3047
3048       /* We only deal with integral and pointer types.  */
3049       if (!INTEGRAL_TYPE_P (TREE_TYPE (op0))
3050           && !POINTER_TYPE_P (TREE_TYPE (op0)))
3051         return NULL_TREE;
3052
3053       if (use_equiv_p)
3054         {
3055           if (TREE_CODE (op0) == SSA_NAME && TREE_CODE (op1) == SSA_NAME)
3056             return compare_names (TREE_CODE (cond), op0, op1);
3057           else if (TREE_CODE (op0) == SSA_NAME)
3058             return compare_name_with_value (TREE_CODE (cond), op0, op1);
3059           else if (TREE_CODE (op1) == SSA_NAME)
3060             return compare_name_with_value (
3061                     swap_tree_comparison (TREE_CODE (cond)), op1, op0);
3062         }
3063       else
3064         {
3065           value_range_t *vr0, *vr1;
3066
3067           vr0 = (TREE_CODE (op0) == SSA_NAME) ? get_value_range (op0) : NULL;
3068           vr1 = (TREE_CODE (op1) == SSA_NAME) ? get_value_range (op1) : NULL;
3069
3070           if (vr0 && vr1)
3071             return compare_ranges (TREE_CODE (cond), vr0, vr1);
3072           else if (vr0 && vr1 == NULL)
3073             return compare_range_with_value (TREE_CODE (cond), vr0, op1);
3074           else if (vr0 == NULL && vr1)
3075             return compare_range_with_value (
3076                     swap_tree_comparison (TREE_CODE (cond)), vr1, op0);
3077         }
3078     }
3079
3080   /* Anything else cannot be computed statically.  */
3081   return NULL_TREE;
3082 }
3083
3084
3085 /* Visit conditional statement STMT.  If we can determine which edge
3086    will be taken out of STMT's basic block, record it in
3087    *TAKEN_EDGE_P and return SSA_PROP_INTERESTING.  Otherwise, return
3088    SSA_PROP_VARYING.  */
3089
3090 static enum ssa_prop_result
3091 vrp_visit_cond_stmt (tree stmt, edge *taken_edge_p)
3092 {
3093   tree cond, val;
3094
3095   *taken_edge_p = NULL;
3096
3097   /* FIXME.  Handle SWITCH_EXPRs.  But first, the assert pass needs to
3098      add ASSERT_EXPRs for them.  */
3099   if (TREE_CODE (stmt) == SWITCH_EXPR)
3100     return SSA_PROP_VARYING;
3101
3102   cond = COND_EXPR_COND (stmt);
3103
3104   if (dump_file && (dump_flags & TDF_DETAILS))
3105     {
3106       tree use;
3107       ssa_op_iter i;
3108
3109       fprintf (dump_file, "\nVisiting conditional with predicate: ");
3110       print_generic_expr (dump_file, cond, 0);
3111       fprintf (dump_file, "\nWith known ranges\n");
3112       
3113       FOR_EACH_SSA_TREE_OPERAND (use, stmt, i, SSA_OP_USE)
3114         {
3115           fprintf (dump_file, "\t");
3116           print_generic_expr (dump_file, use, 0);
3117           fprintf (dump_file, ": ");
3118           dump_value_range (dump_file, vr_value[SSA_NAME_VERSION (use)]);
3119         }
3120
3121       fprintf (dump_file, "\n");
3122     }
3123
3124   /* Compute the value of the predicate COND by checking the known
3125      ranges of each of its operands.
3126      
3127      Note that we cannot evaluate all the equivalent ranges here
3128      because those ranges may not yet be final and with the current
3129      propagation strategy, we cannot determine when the value ranges
3130      of the names in the equivalence set have changed.
3131
3132      For instance, given the following code fragment
3133
3134         i_5 = PHI <8, i_13>
3135         ...
3136         i_14 = ASSERT_EXPR <i_5, i_5 != 0>
3137         if (i_14 == 1)
3138           ...
3139
3140      Assume that on the first visit to i_14, i_5 has the temporary
3141      range [8, 8] because the second argument to the PHI function is
3142      not yet executable.  We derive the range ~[0, 0] for i_14 and the
3143      equivalence set { i_5 }.  So, when we visit 'if (i_14 == 1)' for
3144      the first time, since i_14 is equivalent to the range [8, 8], we
3145      determine that the predicate is always false.
3146
3147      On the next round of propagation, i_13 is determined to be
3148      VARYING, which causes i_5 to drop down to VARYING.  So, another
3149      visit to i_14 is scheduled.  In this second visit, we compute the
3150      exact same range and equivalence set for i_14, namely ~[0, 0] and
3151      { i_5 }.  But we did not have the previous range for i_5
3152      registered, so vrp_visit_assignment thinks that the range for
3153      i_14 has not changed.  Therefore, the predicate 'if (i_14 == 1)'
3154      is not visited again, which stops propagation from visiting
3155      statements in the THEN clause of that if().
3156
3157      To properly fix this we would need to keep the previous range
3158      value for the names in the equivalence set.  This way we would've
3159      discovered that from one visit to the other i_5 changed from
3160      range [8, 8] to VR_VARYING.
3161
3162      However, fixing this apparent limitation may not be worth the
3163      additional checking.  Testing on several code bases (GCC, DLV,
3164      MICO, TRAMP3D and SPEC2000) showed that doing this results in
3165      4 more predicates folded in SPEC.  */
3166   val = vrp_evaluate_conditional (cond, false);
3167   if (val)
3168     *taken_edge_p = find_taken_edge (bb_for_stmt (stmt), val);
3169
3170   if (dump_file && (dump_flags & TDF_DETAILS))
3171     {
3172       fprintf (dump_file, "\nPredicate evaluates to: ");
3173       if (val == NULL_TREE)
3174         fprintf (dump_file, "DON'T KNOW\n");
3175       else
3176         print_generic_stmt (dump_file, val, 0);
3177     }
3178
3179   return (*taken_edge_p) ? SSA_PROP_INTERESTING : SSA_PROP_VARYING;
3180 }
3181
3182
3183 /* Evaluate statement STMT.  If the statement produces a useful range,
3184    return SSA_PROP_INTERESTING and record the SSA name with the
3185    interesting range into *OUTPUT_P.
3186
3187    If STMT is a conditional branch and we can determine its truth
3188    value, the taken edge is recorded in *TAKEN_EDGE_P.
3189
3190    If STMT produces a varying value, return SSA_PROP_VARYING.  */
3191
3192 static enum ssa_prop_result
3193 vrp_visit_stmt (tree stmt, edge *taken_edge_p, tree *output_p)
3194 {
3195   tree def;
3196   ssa_op_iter iter;
3197   stmt_ann_t ann;
3198
3199   if (dump_file && (dump_flags & TDF_DETAILS))
3200     {
3201       fprintf (dump_file, "\nVisiting statement:\n");
3202       print_generic_stmt (dump_file, stmt, dump_flags);
3203       fprintf (dump_file, "\n");
3204     }
3205
3206   ann = stmt_ann (stmt);
3207   if (TREE_CODE (stmt) == MODIFY_EXPR
3208       && ZERO_SSA_OPERANDS (stmt, SSA_OP_ALL_VIRTUALS))
3209     return vrp_visit_assignment (stmt, output_p);
3210   else if (TREE_CODE (stmt) == COND_EXPR || TREE_CODE (stmt) == SWITCH_EXPR)
3211     return vrp_visit_cond_stmt (stmt, taken_edge_p);
3212
3213   /* All other statements produce nothing of interest for VRP, so mark
3214      their outputs varying and prevent further simulation.  */
3215   FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF)
3216     set_value_range_to_varying (get_value_range (def));
3217
3218   return SSA_PROP_VARYING;
3219 }
3220
3221
3222 /* Meet operation for value ranges.  Given two value ranges VR0 and
3223    VR1, store in VR0 the result of meeting VR0 and VR1.
3224    
3225    The meeting rules are as follows:
3226
3227    1- If VR0 and VR1 have an empty intersection, set VR0 to VR_VARYING.
3228
3229    2- If VR0 and VR1 have a non-empty intersection, set VR0 to the
3230       union of VR0 and VR1.  */
3231
3232 static void
3233 vrp_meet (value_range_t *vr0, value_range_t *vr1)
3234 {
3235   if (vr0->type == VR_UNDEFINED)
3236     {
3237       copy_value_range (vr0, vr1);
3238       return;
3239     }
3240
3241   if (vr1->type == VR_UNDEFINED)
3242     {
3243       /* Nothing to do.  VR0 already has the resulting range.  */
3244       return;
3245     }
3246
3247   if (vr0->type == VR_VARYING)
3248     {
3249       /* Nothing to do.  VR0 already has the resulting range.  */
3250       return;
3251     }
3252
3253   if (vr1->type == VR_VARYING)
3254     {
3255       set_value_range_to_varying (vr0);
3256       return;
3257     }
3258
3259   if (vr0->type == VR_RANGE && vr1->type == VR_RANGE)
3260     {
3261       /* If VR0 and VR1 have a non-empty intersection, compute the
3262          union of both ranges.  */
3263       if (value_ranges_intersect_p (vr0, vr1))
3264         {
3265           int cmp;
3266           tree min, max;
3267
3268           /* The lower limit of the new range is the minimum of the
3269              two ranges.  If they cannot be compared, the result is
3270              VARYING.  */
3271           cmp = compare_values (vr0->min, vr1->min);
3272           if (cmp == 0 || cmp == 1)
3273             min = vr1->min;
3274           else if (cmp == -1)
3275             min = vr0->min;
3276           else
3277             {
3278               set_value_range_to_varying (vr0);
3279               return;
3280             }
3281
3282           /* Similarly, the upper limit of the new range is the
3283              maximum of the two ranges.  If they cannot be compared,
3284              the result is VARYING.  */
3285           cmp = compare_values (vr0->max, vr1->max);
3286           if (cmp == 0 || cmp == -1)
3287             max = vr1->max;
3288           else if (cmp == 1)
3289             max = vr0->max;
3290           else
3291             {
3292               set_value_range_to_varying (vr0);
3293               return;
3294             }
3295
3296           /* The resulting set of equivalences is the intersection of
3297              the two sets.  */
3298           if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
3299             bitmap_and_into (vr0->equiv, vr1->equiv);
3300
3301           set_value_range (vr0, vr0->type, min, max, vr0->equiv);
3302         }
3303       else
3304         goto no_meet;
3305     }
3306   else if (vr0->type == VR_ANTI_RANGE && vr1->type == VR_ANTI_RANGE)
3307     {
3308       /* Two anti-ranges meet only if they are both identical.  */
3309       if (compare_values (vr0->min, vr1->min) == 0
3310           && compare_values (vr0->max, vr1->max) == 0
3311           && compare_values (vr0->min, vr0->max) == 0)
3312         {
3313           /* The resulting set of equivalences is the intersection of
3314              the two sets.  */
3315           if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
3316             bitmap_and_into (vr0->equiv, vr1->equiv);
3317         }
3318       else
3319         goto no_meet;
3320     }
3321   else if (vr0->type == VR_ANTI_RANGE || vr1->type == VR_ANTI_RANGE)
3322     {
3323       /* A numeric range [VAL1, VAL2] and an anti-range ~[VAL3, VAL4]
3324          meet only if the ranges have an empty intersection.  The
3325          result of the meet operation is the anti-range.  */
3326       if (!symbolic_range_p (vr0)
3327           && !symbolic_range_p (vr1)
3328           && !value_ranges_intersect_p (vr0, vr1))
3329         {
3330           if (vr1->type == VR_ANTI_RANGE)
3331             copy_value_range (vr0, vr1);
3332         }
3333       else
3334         goto no_meet;
3335     }
3336   else
3337     gcc_unreachable ();
3338
3339   return;
3340
3341 no_meet:
3342   /* The two range VR0 and VR1 do not meet.  Before giving up and
3343      setting the result to VARYING, see if we can at least derive a
3344      useful anti-range.  */
3345   if (!symbolic_range_p (vr0)
3346       && !range_includes_zero_p (vr0)
3347       && !symbolic_range_p (vr1)
3348       && !range_includes_zero_p (vr1))
3349     set_value_range_to_nonnull (vr0, TREE_TYPE (vr0->min));
3350   else
3351     set_value_range_to_varying (vr0);
3352 }
3353
3354
3355 /* Visit all arguments for PHI node PHI that flow through executable
3356    edges.  If a valid value range can be derived from all the incoming
3357    value ranges, set a new range for the LHS of PHI.  */
3358
3359 static enum ssa_prop_result
3360 vrp_visit_phi_node (tree phi)
3361 {
3362   int i;
3363   tree lhs = PHI_RESULT (phi);
3364   value_range_t *lhs_vr = get_value_range (lhs);
3365   value_range_t vr_result = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
3366
3367   copy_value_range (&vr_result, lhs_vr);
3368
3369   if (dump_file && (dump_flags & TDF_DETAILS))
3370     {
3371       fprintf (dump_file, "\nVisiting PHI node: ");
3372       print_generic_expr (dump_file, phi, dump_flags);
3373     }
3374
3375   for (i = 0; i < PHI_NUM_ARGS (phi); i++)
3376     {
3377       edge e = PHI_ARG_EDGE (phi, i);
3378
3379       if (dump_file && (dump_flags & TDF_DETAILS))
3380         {
3381           fprintf (dump_file,
3382               "\n    Argument #%d (%d -> %d %sexecutable)\n",
3383               i, e->src->index, e->dest->index,
3384               (e->flags & EDGE_EXECUTABLE) ? "" : "not ");
3385         }
3386
3387       if (e->flags & EDGE_EXECUTABLE)
3388         {
3389           tree arg = PHI_ARG_DEF (phi, i);
3390           value_range_t vr_arg;
3391
3392           if (TREE_CODE (arg) == SSA_NAME)
3393             vr_arg = *(get_value_range (arg));
3394           else
3395             {
3396               vr_arg.type = VR_RANGE;
3397               vr_arg.min = arg;
3398               vr_arg.max = arg;
3399               vr_arg.equiv = NULL;
3400             }
3401
3402           if (dump_file && (dump_flags & TDF_DETAILS))
3403             {
3404               fprintf (dump_file, "\t");
3405               print_generic_expr (dump_file, arg, dump_flags);
3406               fprintf (dump_file, "\n\tValue: ");
3407               dump_value_range (dump_file, &vr_arg);
3408               fprintf (dump_file, "\n");
3409             }
3410
3411           vrp_meet (&vr_result, &vr_arg);
3412
3413           if (vr_result.type == VR_VARYING)
3414             break;
3415         }
3416     }
3417
3418   if (vr_result.type == VR_VARYING)
3419     goto varying;
3420
3421   /* To prevent infinite iterations in the algorithm, derive ranges
3422      when the new value is slightly bigger or smaller than the
3423      previous one.  */
3424   if (lhs_vr->type == VR_RANGE)
3425     {
3426       if (!POINTER_TYPE_P (TREE_TYPE (lhs)))
3427         {
3428           int cmp_min = compare_values (lhs_vr->min, vr_result.min);
3429           int cmp_max = compare_values (lhs_vr->max, vr_result.max);
3430
3431           /* If the new minimum is smaller or larger than the previous
3432              one, go all the way to -INF.  In the first case, to avoid
3433              iterating millions of times to reach -INF, and in the
3434              other case to avoid infinite bouncing between different
3435              minimums.  */
3436           if (cmp_min > 0 || cmp_min < 0)
3437             vr_result.min = TYPE_MIN_VALUE (TREE_TYPE (vr_result.min));
3438
3439           /* Similarly, if the new maximum is smaller or larger than
3440              the previous one, go all the way to +INF.  */
3441           if (cmp_max < 0 || cmp_max > 0)
3442             vr_result.max = TYPE_MAX_VALUE (TREE_TYPE (vr_result.max));
3443
3444           /* If we ended up with a (-INF, +INF) range, set it to
3445              VARYING.  */
3446           if (vr_result.min == TYPE_MIN_VALUE (TREE_TYPE (vr_result.min))
3447               && vr_result.max == TYPE_MAX_VALUE (TREE_TYPE (vr_result.max)))
3448             goto varying;
3449         }
3450     }
3451
3452   /* If the new range is different than the previous value, keep
3453      iterating.  */
3454   if (update_value_range (lhs, &vr_result))
3455     return SSA_PROP_INTERESTING;
3456
3457   /* Nothing changed, don't add outgoing edges.  */
3458   return SSA_PROP_NOT_INTERESTING;
3459
3460   /* No match found.  Set the LHS to VARYING.  */
3461 varying:
3462   set_value_range_to_varying (lhs_vr);
3463   return SSA_PROP_VARYING;
3464 }
3465
3466 /* Simplify a division or modulo operator to a right shift or
3467    bitwise and if the first operand is unsigned or is greater
3468    than zero and the second operand is an exact power of two.  */
3469
3470 static void
3471 simplify_div_or_mod_using_ranges (tree stmt, tree rhs, enum tree_code rhs_code)
3472 {
3473   tree val = NULL;
3474   tree op = TREE_OPERAND (rhs, 0);
3475   value_range_t *vr = get_value_range (TREE_OPERAND (rhs, 0));
3476
3477   if (TYPE_UNSIGNED (TREE_TYPE (op)))
3478     {
3479       val = integer_one_node;
3480     }
3481   else
3482     {
3483       val = compare_range_with_value (GT_EXPR, vr, integer_zero_node);
3484     }
3485
3486   if (val && integer_onep (val))
3487     {
3488       tree t;
3489       tree op0 = TREE_OPERAND (rhs, 0);
3490       tree op1 = TREE_OPERAND (rhs, 1);
3491
3492       if (rhs_code == TRUNC_DIV_EXPR)
3493         {
3494           t = build_int_cst (NULL_TREE, tree_log2 (op1));
3495           t = build (RSHIFT_EXPR, TREE_TYPE (op0), op0, t);
3496         }
3497       else
3498         {
3499           t = build_int_cst (TREE_TYPE (op1), 1);
3500           t = int_const_binop (MINUS_EXPR, op1, t, 0);
3501           t = fold_convert (TREE_TYPE (op0), t);
3502           t = build2 (BIT_AND_EXPR, TREE_TYPE (op0), op0, t);
3503         }
3504
3505       TREE_OPERAND (stmt, 1) = t;
3506       update_stmt (stmt);
3507     }
3508 }
3509
3510 /* If the operand to an ABS_EXPR is >= 0, then eliminate the
3511    ABS_EXPR.  If the operand is <= 0, then simplify the
3512    ABS_EXPR into a NEGATE_EXPR.  */
3513
3514 static void
3515 simplify_abs_using_ranges (tree stmt, tree rhs)
3516 {
3517   tree val = NULL;
3518   tree op = TREE_OPERAND (rhs, 0);
3519   tree type = TREE_TYPE (op);
3520   value_range_t *vr = get_value_range (TREE_OPERAND (rhs, 0));
3521
3522   if (TYPE_UNSIGNED (type))
3523     {
3524       val = integer_zero_node;
3525     }
3526   else if (vr)
3527     {
3528       val = compare_range_with_value (LE_EXPR, vr, integer_zero_node);
3529       if (!val)
3530         {
3531           val = compare_range_with_value (GE_EXPR, vr, integer_zero_node);
3532
3533           if (val)
3534             {
3535               if (integer_zerop (val))
3536                 val = integer_one_node;
3537               else if (integer_onep (val))
3538                 val = integer_zero_node;
3539             }
3540         }
3541
3542       if (val
3543           && (integer_onep (val) || integer_zerop (val)))
3544         {
3545           tree t;
3546
3547           if (integer_onep (val))
3548             t = build1 (NEGATE_EXPR, TREE_TYPE (op), op);
3549           else
3550             t = op;
3551
3552           TREE_OPERAND (stmt, 1) = t;
3553           update_stmt (stmt);
3554         }
3555     }
3556 }
3557
3558 /* Simplify a conditional using a relational operator to an equality
3559    test if the range information indicates only one value can satisfy
3560    the original conditional.  */
3561
3562 static void
3563 simplify_cond_using_ranges (tree stmt)
3564 {
3565   tree cond = COND_EXPR_COND (stmt);
3566   tree op0 = TREE_OPERAND (cond, 0);
3567   tree op1 = TREE_OPERAND (cond, 1);
3568   enum tree_code cond_code = TREE_CODE (cond);
3569
3570   if (cond_code != NE_EXPR
3571       && cond_code != EQ_EXPR
3572       && TREE_CODE (op0) == SSA_NAME
3573       && INTEGRAL_TYPE_P (TREE_TYPE (op0))
3574       && is_gimple_min_invariant (op1))
3575     {
3576       value_range_t *vr = get_value_range (op0);
3577           
3578       /* If we have range information for OP0, then we might be
3579          able to simplify this conditional. */
3580       if (vr->type == VR_RANGE)
3581         {
3582           tree min = NULL;
3583           tree max = NULL;
3584
3585           /* Extract minimum/maximum values which satisfy the
3586              the conditional as it was written.  */
3587           if (cond_code == LE_EXPR || cond_code == LT_EXPR)
3588             {
3589               min = TYPE_MIN_VALUE (TREE_TYPE (op0));
3590
3591               max = op1;
3592               if (cond_code == LT_EXPR)
3593                 {
3594                   tree one = build_int_cst (TREE_TYPE (op0), 1);
3595                   max = fold (build (MINUS_EXPR, TREE_TYPE (op0), max, one));
3596                 }
3597             }
3598           else if (cond_code == GE_EXPR || cond_code == GT_EXPR)
3599             {
3600               max = TYPE_MAX_VALUE (TREE_TYPE (op0));
3601
3602               min = op1;
3603               if (cond_code == GT_EXPR)
3604                 {
3605                   tree one = build_int_cst (TREE_TYPE (op0), 1);
3606                   max = fold (build (PLUS_EXPR, TREE_TYPE (op0), max, one));
3607                 }
3608             }
3609
3610           /* Now refine the minimum and maximum values using any
3611              value range information we have for op0.  */
3612           if (min && max)
3613             {
3614               if (compare_values (vr->min, min) == -1)
3615                 min = min;
3616               else
3617                 min = vr->min;
3618               if (compare_values (vr->max, max) == 1)
3619                 max = max;
3620               else
3621                 max = vr->max;
3622
3623               /* If the new min/max values have converged to a
3624                  single value, then there is only one value which
3625                  can satisfy the condition.  Rewrite the condition
3626                  to test for equality.  */
3627               if (min == max
3628                   && is_gimple_min_invariant (min))
3629                 {
3630                   COND_EXPR_COND (stmt)
3631                     = build (EQ_EXPR, boolean_type_node, op0, min);
3632                   update_stmt (stmt);
3633                 }
3634             }
3635         }
3636     }
3637 }
3638
3639 /* Simplify STMT using ranges if possible.  */
3640
3641 void
3642 simplify_stmt_using_ranges (tree stmt)
3643 {
3644   if (TREE_CODE (stmt) == MODIFY_EXPR)
3645     {
3646       tree rhs = TREE_OPERAND (stmt, 1);
3647       enum tree_code rhs_code = TREE_CODE (rhs);
3648
3649       /* Transform TRUNC_DIV_EXPR and TRUNC_MOD_EXPR into RSHIFT_EXPR
3650          and BIT_AND_EXPR respectively if the first operand is greater
3651          than zero and the second operand is an exact power of two.  */
3652       if ((rhs_code == TRUNC_DIV_EXPR || rhs_code == TRUNC_MOD_EXPR)
3653           && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (rhs, 0)))
3654           && integer_pow2p (TREE_OPERAND (rhs, 1)))
3655         simplify_div_or_mod_using_ranges (stmt, rhs, rhs_code);
3656
3657       /* Transform ABS (X) into X or -X as appropriate.  */
3658       if (rhs_code == ABS_EXPR
3659           && TREE_CODE (TREE_OPERAND (rhs, 0)) == SSA_NAME
3660           && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (rhs, 0))))
3661         simplify_abs_using_ranges (stmt, rhs);
3662     }
3663   else if (TREE_CODE (stmt) == COND_EXPR
3664            && COMPARISON_CLASS_P (COND_EXPR_COND (stmt)))
3665     {
3666       simplify_cond_using_ranges (stmt);
3667     }
3668 }
3669
3670
3671
3672 /* Traverse all the blocks folding conditionals with known ranges.  */
3673
3674 static void
3675 vrp_finalize (void)
3676 {
3677   size_t i;
3678   prop_value_t *single_val_range;
3679   bool do_value_subst_p;
3680
3681   if (dump_file)
3682     {
3683       fprintf (dump_file, "\nValue ranges after VRP:\n\n");
3684       dump_all_value_ranges (dump_file);
3685       fprintf (dump_file, "\n");
3686     }
3687
3688   /* We may have ended with ranges that have exactly one value.  Those
3689      values can be substituted as any other copy/const propagated
3690      value using substitute_and_fold.  */
3691   single_val_range = xmalloc (num_ssa_names * sizeof (*single_val_range));
3692   memset (single_val_range, 0, num_ssa_names * sizeof (*single_val_range));
3693
3694   do_value_subst_p = false;
3695   for (i = 0; i < num_ssa_names; i++)
3696     if (vr_value[i]
3697         && vr_value[i]->type == VR_RANGE
3698         && vr_value[i]->min == vr_value[i]->max)
3699       {
3700         single_val_range[i].value = vr_value[i]->min;
3701         do_value_subst_p = true;
3702       }
3703
3704   if (!do_value_subst_p)
3705     {
3706       /* We found no single-valued ranges, don't waste time trying to
3707          do single value substitution in substitute_and_fold.  */
3708       free (single_val_range);
3709       single_val_range = NULL;
3710     }
3711
3712   substitute_and_fold (single_val_range, true);
3713
3714   /* Free allocated memory.  */
3715   for (i = 0; i < num_ssa_names; i++)
3716     if (vr_value[i])
3717       {
3718         BITMAP_FREE (vr_value[i]->equiv);
3719         free (vr_value[i]);
3720       }
3721
3722   free (single_val_range);
3723   free (vr_value);
3724 }
3725
3726
3727 /* Main entry point to VRP (Value Range Propagation).  This pass is
3728    loosely based on J. R. C. Patterson, ``Accurate Static Branch
3729    Prediction by Value Range Propagation,'' in SIGPLAN Conference on
3730    Programming Language Design and Implementation, pp. 67-78, 1995.
3731    Also available at http://citeseer.ist.psu.edu/patterson95accurate.html
3732
3733    This is essentially an SSA-CCP pass modified to deal with ranges
3734    instead of constants.
3735
3736    While propagating ranges, we may find that two or more SSA name
3737    have equivalent, though distinct ranges.  For instance,
3738
3739      1  x_9 = p_3->a;
3740      2  p_4 = ASSERT_EXPR <p_3, p_3 != 0>
3741      3  if (p_4 == q_2)
3742      4    p_5 = ASSERT_EXPR <p_4, p_4 == q_2>;
3743      5  endif
3744      6  if (q_2)
3745         
3746    In the code above, pointer p_5 has range [q_2, q_2], but from the
3747    code we can also determine that p_5 cannot be NULL and, if q_2 had
3748    a non-varying range, p_5's range should also be compatible with it.
3749
3750    These equivalences are created by two expressions: ASSERT_EXPR and
3751    copy operations.  Since p_5 is an assertion on p_4, and p_4 was the
3752    result of another assertion, then we can use the fact that p_5 and
3753    p_4 are equivalent when evaluating p_5's range.
3754
3755    Together with value ranges, we also propagate these equivalences
3756    between names so that we can take advantage of information from
3757    multiple ranges when doing final replacement.  Note that this
3758    equivalency relation is transitive but not symmetric.
3759    
3760    In the example above, p_5 is equivalent to p_4, q_2 and p_3, but we
3761    cannot assert that q_2 is equivalent to p_5 because q_2 may be used
3762    in contexts where that assertion does not hold (e.g., in line 6).
3763
3764    TODO, the main difference between this pass and Patterson's is that
3765    we do not propagate edge probabilities.  We only compute whether
3766    edges can be taken or not.  That is, instead of having a spectrum
3767    of jump probabilities between 0 and 1, we only deal with 0, 1 and
3768    DON'T KNOW.  In the future, it may be worthwhile to propagate
3769    probabilities to aid branch prediction.  */
3770
3771 static void
3772 execute_vrp (void)
3773 {
3774   insert_range_assertions ();
3775
3776   cfg_loops = loop_optimizer_init (NULL);
3777   if (cfg_loops)
3778     scev_initialize (cfg_loops);
3779
3780   vrp_initialize ();
3781   ssa_propagate (vrp_visit_stmt, vrp_visit_phi_node);
3782   vrp_finalize ();
3783
3784   if (cfg_loops)
3785     {
3786       scev_finalize ();
3787       loop_optimizer_finalize (cfg_loops, NULL);
3788       current_loops = NULL;
3789     }
3790
3791   remove_range_assertions ();
3792 }
3793
3794 static bool
3795 gate_vrp (void)
3796 {
3797   return flag_tree_vrp != 0;
3798 }
3799
3800 struct tree_opt_pass pass_vrp =
3801 {
3802   "vrp",                                /* name */
3803   gate_vrp,                             /* gate */
3804   execute_vrp,                          /* execute */
3805   NULL,                                 /* sub */
3806   NULL,                                 /* next */
3807   0,                                    /* static_pass_number */
3808   TV_TREE_VRP,                          /* tv_id */
3809   PROP_ssa | PROP_alias,                /* properties_required */
3810   0,                                    /* properties_provided */
3811   0,                                    /* properties_destroyed */
3812   0,                                    /* todo_flags_start */
3813   TODO_cleanup_cfg
3814     | TODO_ggc_collect
3815     | TODO_verify_ssa
3816     | TODO_dump_func
3817     | TODO_update_ssa,                  /* todo_flags_finish */
3818   0                                     /* letter */
3819 };