OSDN Git Service

3a3260a7f4bfccec00c5392cfad3f3fa7a885cb4
[pf3gnuchains/gcc-fork.git] / gcc / tree-vrp.c
1 /* Support routines for Value Range Propagation (VRP).
2    Copyright (C) 2005 Free Software Foundation, Inc.
3    Contributed by Diego Novillo <dnovillo@redhat.com>.
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING.  If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "ggc.h"
27 #include "flags.h"
28 #include "tree.h"
29 #include "basic-block.h"
30 #include "tree-flow.h"
31 #include "tree-pass.h"
32 #include "tree-dump.h"
33 #include "timevar.h"
34 #include "diagnostic.h"
35 #include "cfgloop.h"
36 #include "tree-scalar-evolution.h"
37 #include "tree-ssa-propagate.h"
38 #include "tree-chrec.h"
39
40 /* Set of SSA names found during the dominator traversal of a
41    sub-graph in maybe_add_assert_expr_on_edges.  */
42 static sbitmap found;
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 /* Given a conditional predicate COND that has WHICH as one of its
52    operands, return the other operand.  No error checking is done.
53    This helper assumes that COND is a comparison and WHICH is one of
54    its operands.  */
55
56 static inline tree
57 get_opposite_operand (tree cond, tree which)
58 {
59   if (TREE_OPERAND (cond, 0) == which)
60     return TREE_OPERAND (cond, 1);
61   else
62     return TREE_OPERAND (cond, 0);
63 }
64
65
66 /* Given a comparison code, return its opposite.  Note that this is *not*
67    the same as inverting its truth value (invert_tree_comparison).  Here we
68    just want to literally flip the comparison around.
69    
70    So, '<' gets '>', '<=' gets '>='.  Both '==' and '!=' are returned
71    unchanged.  */
72
73 static enum tree_code
74 opposite_comparison (enum tree_code code)
75 {
76   switch (code)
77     {
78     case EQ_EXPR:
79     case NE_EXPR:
80     case ORDERED_EXPR:
81     case UNORDERED_EXPR:
82     case LTGT_EXPR:
83     case UNEQ_EXPR:
84       return code;
85     case GT_EXPR:
86       return LT_EXPR;
87     case GE_EXPR:
88       return LE_EXPR;
89     case LT_EXPR:
90       return GT_EXPR;
91     case LE_EXPR:
92       return GE_EXPR;
93     case UNGT_EXPR:
94       return UNLT_EXPR;
95     case UNGE_EXPR:
96       return UNLE_EXPR;
97     case UNLT_EXPR:
98       return UNGT_EXPR;
99     case UNLE_EXPR:
100       return UNGE_EXPR;
101     default:
102       gcc_unreachable ();
103     }
104 }
105
106
107 /* Set value range VR to {T, MIN, MAX}.  */
108
109 static inline void
110 set_value_range (value_range *vr, enum value_range_type t, tree min, tree max)
111 {
112 #if defined ENABLE_CHECKING
113   if (t == VR_RANGE || t == VR_ANTI_RANGE)
114     {
115       int cmp;
116
117       gcc_assert (min && max);
118
119       if (INTEGRAL_TYPE_P (TREE_TYPE (min)) && t == VR_ANTI_RANGE)
120         gcc_assert (min != TYPE_MIN_VALUE (TREE_TYPE (min))
121                     || max != TYPE_MAX_VALUE (TREE_TYPE (max)));
122
123       cmp = compare_values (min, max);
124       gcc_assert (cmp == 0 || cmp == -1 || cmp == -2);
125     }
126 #endif
127
128   if (t == VR_RANGE
129       && INTEGRAL_TYPE_P (TREE_TYPE (min))
130       && min == TYPE_MIN_VALUE (TREE_TYPE (min))
131       && max == TYPE_MAX_VALUE (TREE_TYPE (max)))
132     {
133       /* Ranges that cover all the possible values for the type decay
134          to VARYING.  */
135       vr->type = VR_VARYING;
136       vr->min = NULL_TREE;
137       vr->max = NULL_TREE;
138       return;
139     }
140
141   vr->type = t;
142   vr->min = min;
143   vr->max = max;
144 }
145
146
147 /* Similar to set_value_range but return true if any field of VR
148    changed from its previous value.  */
149
150 static inline bool
151 update_value_range (value_range *vr, enum value_range_type t, tree min,
152                     tree max)
153 {
154   bool is_new = vr->type != t || vr->min != min || vr->max != max;
155   if (is_new)
156     set_value_range (vr, t, min, max);
157
158   return is_new;
159 }
160
161
162 /* Return value range information for VAR.  Create an empty range if
163    none existed.  */
164
165 value_range *
166 get_value_range (tree var)
167 {
168   value_range *vr;
169   tree sym;
170
171   vr = SSA_NAME_VALUE_RANGE (var);
172   if (vr)
173     return vr;
174
175   /* Create a default value range.  */
176   vr = ggc_alloc (sizeof (*vr));
177   memset ((void *) vr, 0, sizeof (*vr));
178   SSA_NAME_VALUE_RANGE (var) = vr;
179
180   /* If VAR is a default definition for a PARM_DECL, then we have to
181      assume a VARYING range for it.  */
182   sym = SSA_NAME_VAR (var);
183   if (TREE_CODE (sym) == PARM_DECL && var == var_ann (sym)->default_def)
184     set_value_range (vr, VR_VARYING, NULL_TREE, NULL_TREE);
185
186   return vr;
187 }
188
189
190 /* Return true if value range VR involves at least one symbol.  */
191
192 static inline bool
193 symbolic_range_p (value_range *vr)
194 {
195   return (!is_gimple_min_invariant (vr->min)
196           || !is_gimple_min_invariant (vr->max));
197 }
198
199
200 /* Return true if EXPR computes a non-zero value.  */
201
202 bool
203 expr_computes_nonzero (tree expr)
204 {
205   /* Type casts won't change anything, so just strip it.  */
206   STRIP_NOPS (expr);
207
208   /* Calling alloca, guarantees that the value is non-NULL.  */
209   if (alloca_call_p (expr))
210     return true;
211
212   /* The address of a non-weak symbol is never NULL, unless the user
213      has requested not to remove NULL pointer checks.  */
214   if (flag_delete_null_pointer_checks
215       && TREE_CODE (expr) == ADDR_EXPR
216       && DECL_P (TREE_OPERAND (expr, 0))
217       && !DECL_WEAK (TREE_OPERAND (expr, 0)))
218     return true;
219
220   /* IOR of any value with a nonzero value will result in a nonzero
221      value.  */
222   if (TREE_CODE (expr) == BIT_IOR_EXPR
223       && integer_nonzerop (TREE_OPERAND (expr, 1)))
224     return true;
225
226   return false;
227 }
228
229
230 /* Return true if VR is ~[0, 0].  */
231
232 static inline bool
233 range_is_nonnull (value_range *vr)
234 {
235   return vr->type == VR_ANTI_RANGE
236          && integer_zerop (vr->min)
237          && integer_zerop (vr->max);
238 }
239
240
241 /* Return true if VR is [0, 0].  */
242
243 static inline bool
244 range_is_null (value_range *vr)
245 {
246   return vr->type == VR_RANGE
247          && integer_zerop (vr->min)
248          && integer_zerop (vr->max);
249 }
250
251
252 /* Set value range VR to a non-NULL range of type TYPE.  */
253
254 static void
255 set_value_range_to_nonnull (value_range *vr, tree type)
256 {
257   tree zero = build_int_cst (type, 0);
258   set_value_range (vr, VR_ANTI_RANGE, zero, zero);
259 }
260
261
262 /* Set value range VR to a NULL range of type TYPE.  */
263
264 static void
265 set_value_range_to_null (value_range *vr, tree type)
266 {
267   tree zero = build_int_cst (type, 0);
268   set_value_range (vr, VR_RANGE, zero, zero);
269 }
270
271
272 /* Compare two values VAL1 and VAL2.  Return
273    
274         -2 if VAL1 and VAL2 cannot be compared at compile-time,
275         -1 if VAL1 < VAL2,
276          0 if VAL1 == VAL2,
277         +1 if VAL1 > VAL2, and
278         +2 if VAL1 != VAL2
279
280    This is similar to tree_int_cst_compare but supports pointer values
281    and values that cannot be compared at compile time.  */
282
283 static int
284 compare_values (tree val1, tree val2)
285 {
286   if (val1 == val2)
287     return 0;
288
289   /* Do some limited symbolic comparisons.  */
290   if (!POINTER_TYPE_P (TREE_TYPE (val1)))
291     {
292       /* We can determine some comparisons against +INF and -INF even
293          if the other value is an expression.  */
294       if (val1 == TYPE_MAX_VALUE (TREE_TYPE (val1))
295           && TREE_CODE (val2) == MINUS_EXPR)
296         {
297           /* +INF > NAME - CST.  */
298           return 1;
299         }
300       else if (val1 == TYPE_MIN_VALUE (TREE_TYPE (val1))
301                && TREE_CODE (val2) == PLUS_EXPR)
302         {
303           /* -INF < NAME + CST.  */
304           return -1;
305         }
306       else if (TREE_CODE (val1) == MINUS_EXPR
307                && val2 == TYPE_MAX_VALUE (TREE_TYPE (val2)))
308         {
309           /* NAME - CST < +INF.  */
310           return -1;
311         }
312       else if (TREE_CODE (val1) == PLUS_EXPR
313                && val2 == TYPE_MIN_VALUE (TREE_TYPE (val2)))
314         {
315           /* NAME + CST > -INF.  */
316           return 1;
317         }
318     }
319
320   if ((TREE_CODE (val1) == SSA_NAME
321        || TREE_CODE (val1) == PLUS_EXPR
322        || TREE_CODE (val1) == MINUS_EXPR)
323       && (TREE_CODE (val2) == SSA_NAME
324           || TREE_CODE (val2) == PLUS_EXPR
325           || TREE_CODE (val2) == MINUS_EXPR))
326     {
327       tree n1, c1, n2, c2;
328   
329       /* If VAL1 and VAL2 are of the form 'NAME [+-] CST' or 'NAME',
330          return -1 or +1 accordingly.  If VAL1 and VAL2 don't use the
331          same name, return -2.  */
332       if (TREE_CODE (val1) == SSA_NAME)
333         {
334           n1 = val1;
335           c1 = NULL_TREE;
336         }
337       else
338         {
339           n1 = TREE_OPERAND (val1, 0);
340           c1 = TREE_OPERAND (val1, 1);
341         }
342
343       if (TREE_CODE (val2) == SSA_NAME)
344         {
345           n2 = val2;
346           c2 = NULL_TREE;
347         }
348       else
349         {
350           n2 = TREE_OPERAND (val2, 0);
351           c2 = TREE_OPERAND (val2, 1);
352         }
353
354       /* Both values must use the same name.  */
355       if (n1 != n2)
356         return -2;
357
358       if (TREE_CODE (val1) == SSA_NAME)
359         {
360           if (TREE_CODE (val2) == SSA_NAME)
361             /* NAME == NAME  */
362             return 0;
363           else if (TREE_CODE (val2) == PLUS_EXPR)
364             /* NAME < NAME + CST  */
365             return -1;
366           else if (TREE_CODE (val2) == MINUS_EXPR)
367             /* NAME > NAME - CST  */
368             return 1;
369         }
370       else if (TREE_CODE (val1) == PLUS_EXPR)
371         {
372           if (TREE_CODE (val2) == SSA_NAME)
373             /* NAME + CST > NAME  */
374             return 1;
375           else if (TREE_CODE (val2) == PLUS_EXPR)
376             /* NAME + CST1 > NAME + CST2, if CST1 > CST2  */
377             return compare_values (c1, c2);
378           else if (TREE_CODE (val2) == MINUS_EXPR)
379             /* NAME + CST1 > NAME - CST2  */
380             return 1;
381         }
382       else if (TREE_CODE (val1) == MINUS_EXPR)
383         {
384           if (TREE_CODE (val2) == SSA_NAME)
385             /* NAME - CST < NAME  */
386             return -1;
387           else if (TREE_CODE (val2) == PLUS_EXPR)
388             /* NAME - CST1 < NAME + CST2  */
389             return -1;
390           else if (TREE_CODE (val2) == MINUS_EXPR)
391             /* NAME - CST1 > NAME - CST2, if CST1 < CST2.  Notice that
392                C1 and C2 are swapped in the call to compare_values.  */
393             return compare_values (c2, c1);
394         }
395
396       gcc_unreachable ();
397     }
398
399   /* We cannot compare non-constants.  */
400   if (!is_gimple_min_invariant (val1) || !is_gimple_min_invariant (val2))
401     return -2;
402
403   if (!POINTER_TYPE_P (TREE_TYPE (val1)))
404     return tree_int_cst_compare (val1, val2);
405   else
406     {
407       tree t;
408
409       /* First see if VAL1 and VAL2 are not the same.  */
410       if (val1 == val2 || operand_equal_p (val1, val2, 0))
411         return 0;
412       
413       /* If VAL1 is a lower address than VAL2, return -1.  */
414       t = fold (build2 (LT_EXPR, TREE_TYPE (val1), val1, val2));
415       if (t == boolean_true_node)
416         return -1;
417
418       /* If VAL1 is a higher address than VAL2, return +1.  */
419       t = fold (build2 (GT_EXPR, TREE_TYPE (val1), val1, val2));
420       if (t == boolean_true_node)
421         return 1;
422
423       /* If VAL1 is different than VAL2, return +2.  */
424       t = fold (build2 (NE_EXPR, TREE_TYPE (val1), val1, val2));
425       if (t == boolean_true_node)
426         return 2;
427
428       return -2;
429     }
430 }
431
432
433 /* Return 1 if VAL is inside value range VR (VR->MIN <= VAL <= VR->MAX),
434           0 if VAL is not inside VR,
435          -2 if we cannot tell either way.  */
436
437 static inline int
438 value_inside_range (tree val, value_range *vr)
439 {
440   int cmp1, cmp2;
441
442   cmp1 = compare_values (val, vr->min);
443   if (cmp1 == -2 || cmp1 == 2)
444     return -2;
445
446   cmp2 = compare_values (val, vr->max);
447   if (cmp2 == -2 || cmp2 == 2)
448     return -2;
449
450   return (cmp1 == 0 || cmp1 == 1) && (cmp2 == -1 || cmp2 == 0);
451 }
452
453
454 /* Return true if value ranges VR0 and VR1 have a non-empty
455    intersection.  */
456
457 static inline bool
458 value_ranges_intersect_p (value_range *vr0, value_range *vr1)
459 {
460   return (value_inside_range (vr1->min, vr0) == 1
461           || value_inside_range (vr1->max, vr0) == 1
462           || value_inside_range (vr0->min, vr1) == 1
463           || value_inside_range (vr0->max, vr1) == 1);
464 }
465
466
467 /* Extract value range information from an ASSERT_EXPR EXPR and store
468    it in *VR_P.  */
469
470 static void
471 extract_range_from_assert (value_range *vr_p, tree expr)
472 {
473   tree var, cond, limit, type;
474   value_range *var_vr;
475
476   var = ASSERT_EXPR_VAR (expr);
477   cond = ASSERT_EXPR_COND (expr);
478
479   gcc_assert (TREE_CODE_CLASS (TREE_CODE (cond)) == tcc_comparison);
480
481   /* Find VAR in the ASSERT_EXPR conditional.  */
482   limit = get_opposite_operand (cond, var);
483   type = TREE_TYPE (limit);
484
485   gcc_assert (limit != var);
486
487   /* For pointer arithmetic, we only keep track of anti-ranges
488      (NE_EXPR).  Notice that we don't need to handle EQ_EXPR in these
489      cases because assertions with equalities are never generated.
490      The assert pass generates straight assignments in those cases.  */
491   if (POINTER_TYPE_P (type) && TREE_CODE (cond) != NE_EXPR)
492     {
493       set_value_range (vr_p, VR_VARYING, NULL_TREE, NULL_TREE);
494       return;
495     }
496
497   if (TREE_CODE (cond) == NE_EXPR)
498     set_value_range (vr_p, VR_ANTI_RANGE, limit, limit);
499   else if (TREE_CODE (cond) == LE_EXPR)
500     set_value_range (vr_p, VR_RANGE, TYPE_MIN_VALUE (type), limit);
501   else if (TREE_CODE (cond) == LT_EXPR)
502     {
503       tree one = build_int_cst (type, 1);
504       set_value_range (vr_p, VR_RANGE, TYPE_MIN_VALUE (type),
505                        fold (build (MINUS_EXPR, type, limit, one)));
506     }
507   else if (TREE_CODE (cond) == GE_EXPR)
508     set_value_range (vr_p, VR_RANGE, limit, TYPE_MAX_VALUE (type));
509   else if (TREE_CODE (cond) == GT_EXPR)
510     {
511       tree one = build_int_cst (type, 1);
512       set_value_range (vr_p, VR_RANGE,
513                        fold (build (PLUS_EXPR, type, limit, one)),
514                        TYPE_MAX_VALUE (type));
515     }
516   else
517     gcc_unreachable ();
518
519   /* If VAR already has a known range and the two ranges have a
520      non-empty intersection, we can refine the resulting range.
521      Since the assert expression creates an equivalency and at the
522      same time it asserts a predicate, we can take the intersection of
523      the two ranges to get better precision.  */
524   var_vr = get_value_range (var);
525   if (var_vr->type == VR_RANGE
526       && vr_p->type == VR_RANGE
527       && value_ranges_intersect_p (var_vr, vr_p))
528     {
529       tree min, max;
530
531       /* Use the larger of the two minimums.  */
532       if (compare_values (vr_p->min, var_vr->min) == -1)
533         min = var_vr->min;
534       else
535         min = vr_p->min;
536
537       /* Use the smaller of the two maximums.  */
538       if (compare_values (vr_p->max, var_vr->max) == 1)
539         max = var_vr->max;
540       else
541         max = vr_p->max;
542
543       set_value_range (vr_p, vr_p->type, min, max);
544     }
545 }
546
547
548 /* Extract range information from SSA name VAR and store it in VR.  If
549    VAR has an interesting range, use it.  Otherwise, create the
550    range [VAR, VAR] and return it.  This is useful in situations where
551    we may have conditionals testing values of VARYING names.  For
552    instance,
553
554         x_3 = y_5;
555         if (x_3 > y_5)
556           ...
557
558     Even if y_5 is deemed VARYING, we can determine that x_3 > y_5 is
559     always false.  */
560
561 static void
562 extract_range_from_ssa_name (value_range *vr, tree var)
563 {
564   value_range *var_vr = get_value_range (var);
565
566   if (var_vr->type != VR_UNDEFINED && var_vr->type != VR_VARYING)
567     *vr = *var_vr;
568   else
569     set_value_range (vr, VR_RANGE, var, var);
570 }
571
572
573 /* Extract range information from a binary expression EXPR based on
574    the ranges of each of its operands and the expression code.  */
575
576 static void
577 extract_range_from_binary_expr (value_range *vr, tree expr)
578 {
579   enum tree_code code = TREE_CODE (expr);
580   tree op0, op1, min, max;
581   value_range vr0, vr1;
582   int cmp;
583
584   /* Not all binary expressions can be applied to ranges in a
585      meaningful way.  Handle only arithmetic operations.  */
586   if (code != PLUS_EXPR
587       && code != MINUS_EXPR
588       && code != MULT_EXPR
589       && code != TRUNC_DIV_EXPR
590       && code != FLOOR_DIV_EXPR
591       && code != CEIL_DIV_EXPR
592       && code != EXACT_DIV_EXPR
593       && code != ROUND_DIV_EXPR
594       && code != MIN_EXPR
595       && code != MAX_EXPR)
596     {
597       set_value_range (vr, VR_VARYING, NULL_TREE, NULL_TREE);
598       return;
599     }
600
601   /* Get value ranges for each operand.  For constant operands, create
602      a new value range with the operand to simplify processing.  */
603   op0 = TREE_OPERAND (expr, 0);
604   if (TREE_CODE (op0) == SSA_NAME)
605     vr0 = *(get_value_range (op0));
606   else
607     {
608       if (is_gimple_min_invariant (op0))
609         set_value_range (&vr0, VR_RANGE, op0, op0);
610       else
611         set_value_range (&vr0, VR_VARYING, NULL_TREE, NULL_TREE);
612     }
613
614   op1 = TREE_OPERAND (expr, 1);
615   if (TREE_CODE (op1) == SSA_NAME)
616     vr1 = *(get_value_range (op1));
617   else
618     {
619       if (is_gimple_min_invariant (op1))
620         set_value_range (&vr1, VR_RANGE, op1, op1);
621       else
622         set_value_range (&vr1, VR_VARYING, 0, 0);
623     }
624
625   /* If either range is UNDEFINED, so is the result.  */
626   if (vr0.type == VR_UNDEFINED || vr1.type == VR_UNDEFINED)
627     {
628       set_value_range (vr, VR_UNDEFINED, NULL_TREE, NULL_TREE);
629       return;
630     }
631
632   /* If either range is VARYING, so is the result.  */
633   if (vr0.type == VR_VARYING || vr1.type == VR_VARYING)
634     {
635       set_value_range (vr, VR_VARYING, NULL_TREE, NULL_TREE);
636       return;
637     }
638
639   /* If the ranges are of different types, the result is VARYING.  */
640   if (vr0.type != vr1.type)
641     {
642       set_value_range (vr, VR_VARYING, NULL_TREE, NULL_TREE);
643       return;
644     }
645
646   /* TODO.  Refuse to do any symbolic range operations for now.  */
647   if (symbolic_range_p (&vr0) || symbolic_range_p (&vr1))
648     {
649       set_value_range (vr, VR_VARYING, NULL_TREE, NULL_TREE);
650       return;
651     }
652
653   /* Now evaluate the expression to determine the new range.  */
654   if (POINTER_TYPE_P (TREE_TYPE (expr))
655       || POINTER_TYPE_P (TREE_TYPE (op0))
656       || POINTER_TYPE_P (TREE_TYPE (op1)))
657     {
658       /* For pointer types, we are really only interested in asserting
659          whether the expression evaluates to non-NULL.  FIXME.  We
660          used to gcc_assert (code == PLUS_EXPR || code == MINUS_EXPR),
661          but ivopts is generating expressions with pointer
662          multiplication in them.  */
663       if (code == PLUS_EXPR)
664         {
665           /* Assume that pointers can never wrap around.  FIXME, Is
666              this always safe?  */
667           tree zero = build_int_cst (TREE_TYPE (expr), 0);
668           set_value_range (vr, VR_ANTI_RANGE, zero, zero);
669         }
670       else
671         {
672           /* Subtracting from a pointer, may yield 0, so just drop the
673              resulting range to varying.  */
674           set_value_range (vr, VR_VARYING, NULL_TREE, NULL_TREE);
675         }
676
677       return;
678     }
679
680   /* For integer ranges, apply the operation to each end of the
681      range and see what we end up with.  */
682   if (code == PLUS_EXPR
683       || code == MULT_EXPR
684       || code == MIN_EXPR
685       || code == MAX_EXPR)
686     {
687       /* For operations that make the resulting range directly
688          proportional to the original ranges, apply the operation to
689          the same end of each range.  */
690       min = int_const_binop (code, vr0.min, vr1.min, 0);
691       max = int_const_binop (code, vr0.max, vr1.max, 0);
692     }
693   else
694     {
695       /* For operations that make the resulting range inversely
696          proportional to the original ranges (-, /), apply the
697          operation to the opposite ends of each range.  */
698       min = int_const_binop (code, vr0.min, vr1.max, 0);
699       max = int_const_binop (code, vr0.max, vr1.min, 0);
700     }
701
702   cmp = compare_values (min, max);
703   if (cmp == -2 || cmp == 1)
704     {
705       /* If the new range has its limits swapped around (MIN > MAX),
706          then the operation caused one of them to wrap around, mark
707          the new range VARYING.  */
708       set_value_range (vr, VR_VARYING, NULL_TREE, NULL_TREE);
709     }
710   else
711     set_value_range (vr, vr0.type, min, max);
712 }
713
714
715 /* Extract range information from a unary expression EXPR based on
716    the range of its operand and the expression code.  */
717
718 static void
719 extract_range_from_unary_expr (value_range *vr, tree expr)
720 {
721   enum tree_code code = TREE_CODE (expr);
722   tree min, max, op0;
723   value_range vr0;
724   int cmp;
725
726   /* Get value ranges for the operand.  For constant operands, create
727      a new value range with the operand to simplify processing.  */
728   op0 = TREE_OPERAND (expr, 0);
729   if (TREE_CODE (op0) == SSA_NAME)
730     vr0 = *(get_value_range (op0));
731   else
732     {
733       if (is_gimple_min_invariant (op0))
734         set_value_range (&vr0, VR_RANGE, op0, op0);
735       else
736         set_value_range (&vr0, VR_VARYING, NULL_TREE, NULL_TREE);
737     }
738
739   /* If VR0 is UNDEFINED, so is the result.  */
740   if (vr0.type == VR_UNDEFINED)
741     {
742       set_value_range (vr, VR_UNDEFINED, NULL_TREE, NULL_TREE);
743       return;
744     }
745
746   /* If VR0 is VARYING, so is the result.  */
747   if (vr0.type == VR_VARYING)
748     {
749       set_value_range (vr, VR_VARYING, NULL_TREE, NULL_TREE);
750       return;
751     }
752
753   /* TODO.  Refuse to do any symbolic range operations for now.  */
754   if (symbolic_range_p (&vr0))
755     {
756       set_value_range (vr, VR_VARYING, NULL_TREE, NULL_TREE);
757       return;
758     }
759
760   /* If the operand is neither a pointer nor an integral type, set the
761      range to VARYING.  TODO, we may set the range to non-zero.  */
762   if (!INTEGRAL_TYPE_P (TREE_TYPE (op0))
763       && !POINTER_TYPE_P (TREE_TYPE (op0)))
764     {
765       set_value_range (vr, VR_VARYING, NULL_TREE, NULL_TREE);
766       return;
767     }
768
769   /* If the expression involves pointers, we are only interested in
770      determining if it evaluates to NULL [0, 0] or non-NULL (~[0, 0]).  */
771   if (POINTER_TYPE_P (TREE_TYPE (expr)) || POINTER_TYPE_P (TREE_TYPE (op0)))
772     {
773       if (range_is_nonnull (&vr0) || expr_computes_nonzero (expr))
774         set_value_range_to_nonnull (vr, TREE_TYPE (expr));
775       else if (range_is_null (&vr0))
776         set_value_range_to_null (vr, TREE_TYPE (expr));
777       else
778         set_value_range (vr, VR_VARYING, NULL_TREE, NULL_TREE);
779
780       return;
781     }
782
783   /* Handle unary expressions on integer ranges.  */
784   if ((code == NOP_EXPR || code == CONVERT_EXPR)
785       && (TYPE_SIZE (TREE_TYPE (vr0.min)) != TYPE_SIZE (TREE_TYPE (expr))))
786     {
787       /* When converting types of different sizes, set the result to
788          VARYING.  Things like sign extensions and precision loss may
789          change the range.  For instance, if x_3 is of type 'long long
790          int' and 'y_5 = (unsigned short) x_3', if x_3 is ~[0, 0], it
791          is impossible to know at compile time whether y_5 will be
792          ~[0, 0].  */
793       set_value_range (vr, VR_VARYING, NULL_TREE, NULL_TREE);
794       return;
795     }
796
797   /* Apply the operation to each end of the range and see what we end
798      up with.  */
799   min = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.min);
800   max = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.max);
801
802   cmp = compare_values (min, max);
803   if (cmp == -2 || cmp == 1)
804     {
805       /* If the new range has its limits swapped around (MIN > MAX),
806          then the operation caused one of them to wrap around, mark
807          the new range VARYING.  */
808       set_value_range (vr, VR_VARYING, NULL_TREE, NULL_TREE);
809     }
810   else
811     set_value_range (vr, vr0.type, min, max);
812 }
813
814
815 /* Try to compute a useful range out of expression EXPR and store it
816    in *VR_P.  */
817
818 static void
819 extract_range_from_expr (value_range *vr, tree expr)
820 {
821   enum tree_code code = TREE_CODE (expr);
822
823   if (code == ASSERT_EXPR)
824     extract_range_from_assert (vr, expr);
825   else if (code == SSA_NAME)
826     extract_range_from_ssa_name (vr, expr);
827   else if (TREE_CODE_CLASS (code) == tcc_binary)
828     extract_range_from_binary_expr (vr, expr);
829   else if (TREE_CODE_CLASS (code) == tcc_unary)
830     extract_range_from_unary_expr (vr, expr);
831   else if (expr_computes_nonzero (expr))
832     set_value_range_to_nonnull (vr, TREE_TYPE (expr));
833   else
834     set_value_range (vr, VR_VARYING, NULL_TREE, NULL_TREE);
835 }
836
837
838 /* Given a range VR, a loop L and a variable VAR, determine whether it
839    would be profitable to adjust VR using scalar evolution information
840    for VAR.  If so, update VR with the new limits.  */
841
842 static void
843 adjust_range_with_scev (value_range *vr, struct loop *l, tree var)
844 {
845   tree init, step, chrec;
846   bool init_is_max;
847
848   /* TODO.  Don't adjust anti-ranges.  An anti-range may provide
849      better opportunities than a regular range, but I'm not sure.  */
850   if (vr->type == VR_ANTI_RANGE)
851     return;
852
853   chrec = analyze_scalar_evolution (l, var);
854   if (TREE_CODE (chrec) != POLYNOMIAL_CHREC)
855     return;
856
857   init = CHREC_LEFT (chrec);
858   step = CHREC_RIGHT (chrec);
859
860   /* If STEP is symbolic, we can't know whether INIT will be the
861      minimum or maximum value in the range.  */
862   if (!is_gimple_min_invariant (step))
863     return;
864
865   /* FIXME.  When dealing with unsigned types,
866      analyze_scalar_evolution sets STEP to very large unsigned values
867      when the evolution goes backwards.  This confuses this analysis
868      because we think that INIT is the smallest value that the range
869      can take, instead of the largest.  Ignore these chrecs for now.  */
870   if (INTEGRAL_TYPE_P (TREE_TYPE (step)) && TYPE_UNSIGNED (TREE_TYPE (step)))
871     return;
872
873   /* If STEP is negative, then INIT is the maximum value the range
874      will take.  Otherwise, INIT is the minimum value.  */
875   init_is_max = (tree_int_cst_sgn (step) < 0);
876
877   if (!POINTER_TYPE_P (TREE_TYPE (init))
878       && (vr->type == VR_VARYING || vr->type == VR_UNDEFINED))
879     {
880       /* For VARYING or UNDEFINED ranges, just about anything we get
881          from scalar evolutions should be better.  */
882       if (init_is_max)
883         set_value_range (vr, VR_RANGE, TYPE_MIN_VALUE (TREE_TYPE (init)), init);
884       else
885         set_value_range (vr, VR_RANGE, init, TYPE_MAX_VALUE (TREE_TYPE (init)));
886     }
887   else if (vr->type == VR_RANGE)
888     {
889       if (init_is_max)
890         {
891           /* INIT is the maximum value.  If INIT is lower than
892              VR->MAX, set VR->MAX to INIT.  */
893           if (compare_values (init, vr->max) == -1)
894             set_value_range (vr, VR_RANGE, vr->min, init);
895         }
896       else
897         {
898           /* If INIT is bigger than VR->MIN, set VR->MIN to INIT.  */
899           if (compare_values (init, vr->min) == 1)
900             set_value_range (vr, VR_RANGE, init, vr->max);
901         }
902     }
903 }
904
905
906 /* Given two numeric value ranges VR0, VR1 and a comparison code COMP:
907    
908    - Return BOOLEAN_TRUE_NODE if VR0 COMP VR1 always returns true for all the
909      values in the ranges.
910
911    - Return BOOLEAN_FALSE_NODE if the comparison always returns false.
912
913    - Return NULL_TREE if it is not always possible to determine the value of
914      the comparison.  */
915
916 static tree
917 compare_ranges (enum tree_code comp, value_range *vr0, value_range *vr1)
918 {
919   /* VARYING or UNDEFINED ranges cannot be compared.  */
920   if (vr0->type == VR_VARYING
921       || vr0->type == VR_UNDEFINED
922       || vr1->type == VR_VARYING
923       || vr1->type == VR_UNDEFINED)
924     return NULL_TREE;
925
926   /* Anti-ranges need to be handled separately.  */
927   if (vr0->type == VR_ANTI_RANGE || vr1->type == VR_ANTI_RANGE)
928     {
929       /* If both are anti-ranges, then we cannot compute any
930          comparison.  */
931       if (vr0->type == VR_ANTI_RANGE && vr1->type == VR_ANTI_RANGE)
932         return NULL_TREE;
933
934       /* These comparisons are never statically computable.  */
935       if (comp == GT_EXPR
936           || comp == GE_EXPR
937           || comp == LT_EXPR
938           || comp == LE_EXPR)
939         return NULL_TREE;
940
941       /* Equality can be computed only between a range and an
942          anti-range.  ~[VAL1, VAL2] == [VAL1, VAL2] is always false.  */
943       if (vr0->type == VR_RANGE)
944         {
945           /* To simplify processing, make VR0 the anti-range.  */
946           value_range *tmp = vr0;
947           vr0 = vr1;
948           vr1 = tmp;
949         }
950
951       gcc_assert (comp == NE_EXPR || comp == EQ_EXPR);
952
953       if (compare_values (vr0->min, vr1->min) == 0
954           && compare_values (vr0->max, vr1->max) == 0)
955         return (comp == NE_EXPR) ? boolean_true_node : boolean_false_node;
956
957       return NULL_TREE;
958     }
959
960   /* Simplify processing.  If COMP is GT_EXPR or GE_EXPR, switch the
961      operands around and change the comparison code.  */
962   if (comp == GT_EXPR || comp == GE_EXPR)
963     {
964       value_range *tmp;
965       comp = (comp == GT_EXPR) ? LT_EXPR : LE_EXPR;
966       tmp = vr0;
967       vr0 = vr1;
968       vr1 = tmp;
969     }
970
971   if (comp == EQ_EXPR)
972     {
973       /* Equality may only be computed if both ranges represent
974          exactly one value.  */
975       if (compare_values (vr0->min, vr0->max) == 0
976           && compare_values (vr1->min, vr1->max) == 0)
977         {
978           int cmp_min = compare_values (vr0->min, vr1->min);
979           int cmp_max = compare_values (vr0->max, vr1->max);
980           if (cmp_min == 0 && cmp_max == 0)
981             return boolean_true_node;
982           else if (cmp_min != -2 && cmp_max != -2)
983             return boolean_false_node;
984         }
985
986       return NULL_TREE;
987     }
988   else if (comp == NE_EXPR)
989     {
990       int cmp1, cmp2;
991
992       /* If VR0 is completely to the left or completely to the right
993          of VR1, they are always different.  Notice that we need to
994          make sure that both comparisons yield similar results to
995          avoid comparing values that cannot be compared at
996          compile-time.  */
997       cmp1 = compare_values (vr0->max, vr1->min);
998       cmp2 = compare_values (vr0->min, vr1->max);
999       if ((cmp1 == -1 && cmp2 == -1) || (cmp1 == 1 && cmp2 == 1))
1000         return boolean_true_node;
1001
1002       /* If VR0 and VR1 represent a single value and are identical,
1003          return false.  */
1004       else if (compare_values (vr0->min, vr0->max) == 0
1005                && compare_values (vr1->min, vr1->max) == 0
1006                && compare_values (vr0->min, vr1->min) == 0
1007                && compare_values (vr0->max, vr1->max) == 0)
1008         return boolean_false_node;
1009
1010       /* Otherwise, they may or may not be different.  */
1011       else
1012         return NULL_TREE;
1013     }
1014   else if (comp == LT_EXPR || comp == LE_EXPR)
1015     {
1016       int tst;
1017
1018       /* If VR0 is to the left of VR1, return true.  */
1019       tst = compare_values (vr0->max, vr1->min);
1020       if ((comp == LT_EXPR && tst == -1)
1021           || (comp == LE_EXPR && (tst == -1 || tst == 0)))
1022         return boolean_true_node;
1023
1024       /* If VR0 is to the right of VR1, return false.  */
1025       tst = compare_values (vr0->min, vr1->max);
1026       if ((comp == LT_EXPR && (tst == 0 || tst == 1))
1027           || (comp == LE_EXPR && tst == 1))
1028         return boolean_false_node;
1029
1030       /* Otherwise, we don't know.  */
1031       return NULL_TREE;
1032     }
1033     
1034   gcc_unreachable ();
1035 }
1036
1037
1038 /* Given a value range VR, a value VAL and a comparison code COMP, return
1039    BOOLEAN_TRUE_NODE if VR COMP VR1 always returns true for all the
1040    values in VR.  Return BOOLEAN_FALSE_NODE if the comparison
1041    always returns false.  Return NULL_TREE if it is not always
1042    possible to determine the value of the comparison.  */
1043
1044 static tree
1045 compare_range_with_value (enum tree_code comp, value_range *vr, tree val)
1046 {
1047   if (vr->type == VR_VARYING || vr->type == VR_UNDEFINED)
1048     return NULL_TREE;
1049
1050   /* Anti-ranges need to be handled separately.  */
1051   if (vr->type == VR_ANTI_RANGE)
1052     {
1053       /* For anti-ranges, the only predicates that we can compute at
1054          compile time are equality and inequality.  */
1055       if (comp == GT_EXPR
1056           || comp == GE_EXPR
1057           || comp == LT_EXPR
1058           || comp == LE_EXPR)
1059         return NULL_TREE;
1060
1061       /* ~[VAL, VAL] == VAL is always false.  */
1062       if (compare_values (vr->min, val) == 0
1063           && compare_values (vr->max, val) == 0)
1064         return (comp == NE_EXPR) ? boolean_true_node : boolean_false_node;
1065
1066       return NULL_TREE;
1067     }
1068
1069   if (comp == EQ_EXPR)
1070     {
1071       /* EQ_EXPR may only be computed if VR represents exactly
1072          one value.  */
1073       if (compare_values (vr->min, vr->max) == 0)
1074         {
1075           int cmp = compare_values (vr->min, val);
1076           if (cmp == 0)
1077             return boolean_true_node;
1078           else if (cmp == -1 || cmp == 1 || cmp == 2)
1079             return boolean_false_node;
1080         }
1081
1082       return NULL_TREE;
1083     }
1084   else if (comp == NE_EXPR)
1085     {
1086       /* If VAL is not inside VR, then they are always different.  */
1087       if (compare_values (vr->max, val) == -1
1088           || compare_values (vr->min, val) == 1)
1089         return boolean_true_node;
1090
1091       /* If VR represents exactly one value equal to VAL, then return
1092          false.  */
1093       if (compare_values (vr->min, vr->max) == 0
1094           && compare_values (vr->min, val) == 0)
1095         return boolean_false_node;
1096
1097       /* Otherwise, they may or may not be different.  */
1098       return NULL_TREE;
1099     }
1100   else if (comp == LT_EXPR || comp == LE_EXPR)
1101     {
1102       int tst;
1103
1104       /* If VR is to the left of VAL, return true.  */
1105       tst = compare_values (vr->max, val);
1106       if ((comp == LT_EXPR && tst == -1)
1107           || (comp == LE_EXPR && (tst == -1 || tst == 0)))
1108         return boolean_true_node;
1109
1110       /* If VR is to the right of VAL, return false.  */
1111       tst = compare_values (vr->min, val);
1112       if ((comp == LT_EXPR && (tst == 0 || tst == 1))
1113           || (comp == LE_EXPR && tst == 1))
1114         return boolean_false_node;
1115
1116       /* Otherwise, we don't know.  */
1117       return NULL_TREE;
1118     }
1119   else if (comp == GT_EXPR || comp == GE_EXPR)
1120     {
1121       int tst;
1122
1123       /* If VR is to the right of VAL, return true.  */
1124       tst = compare_values (vr->min, val);
1125       if ((comp == GT_EXPR && tst == 1)
1126           || (comp == GE_EXPR && (tst == 0 || tst == 1)))
1127         return boolean_true_node;
1128
1129       /* If VR is to the left of VAL, return false.  */
1130       tst = compare_values (vr->max, val);
1131       if ((comp == GT_EXPR && (tst == -1 || tst == 0))
1132           || (comp == GE_EXPR && tst == -1))
1133         return boolean_false_node;
1134
1135       /* Otherwise, we don't know.  */
1136       return NULL_TREE;
1137     }
1138
1139   gcc_unreachable ();
1140 }
1141
1142
1143 /* Debugging dumps.  */
1144
1145 void
1146 dump_value_range (FILE *file, value_range *vr)
1147 {
1148   if (vr == NULL)
1149     fprintf (file, "[]");
1150   else if (vr->type == VR_UNDEFINED)
1151     fprintf (file, "UNDEFINED");
1152   else if (vr->type == VR_RANGE || vr->type == VR_ANTI_RANGE)
1153     {
1154       fprintf (file, "%s[", (vr->type == VR_ANTI_RANGE) ? "~" : "");
1155       print_generic_expr (file, vr->min, 0);
1156       fprintf (file, ", ");
1157       print_generic_expr (file, vr->max, 0);
1158       fprintf (file, "]");
1159     }
1160   else if (vr->type == VR_VARYING)
1161     fprintf (file, "VARYING");
1162   else
1163     fprintf (file, "INVALID RANGE");
1164 }
1165
1166
1167 /* Dump value range VR to stderr.  */
1168
1169 void
1170 debug_value_range (value_range *vr)
1171 {
1172   dump_value_range (stderr, vr);
1173 }
1174
1175
1176 /* Dump value ranges of all SSA_NAMEs to FILE.  */
1177
1178 void
1179 dump_all_value_ranges (FILE *file)
1180 {
1181   size_t i;
1182
1183   for (i = 0; i < num_ssa_names; i++)
1184     {
1185       tree var = ssa_name (i);
1186       if (var && SSA_NAME_VALUE_RANGE (var))
1187         {
1188           print_generic_expr (file, var, 0);
1189           fprintf (file, ": ");
1190           dump_value_range (file, SSA_NAME_VALUE_RANGE (var));
1191           fprintf (file, "\n");
1192         }
1193     }
1194
1195   fprintf (file, "\n");
1196 }
1197
1198
1199 /* Dump all value ranges to stderr.  */
1200
1201 void
1202 debug_all_value_ranges (void)
1203 {
1204   dump_all_value_ranges (stderr);
1205 }
1206
1207
1208 /*---------------------------------------------------------------------------
1209                             Value Range Propagation
1210 ---------------------------------------------------------------------------*/
1211
1212 /* Given a COND_EXPR COND of the form 'V OP W', and an SSA name V,
1213    create a new SSA name N and return the assertion assignment
1214    'V = ASSERT_EXPR <V, V OP W>'.  */
1215
1216 static tree
1217 build_assert_expr_for (tree cond, tree v)
1218 {
1219   tree n, assertion;
1220
1221   gcc_assert (TREE_CODE (v) == SSA_NAME);
1222   n = duplicate_ssa_name (v, NULL_TREE);
1223
1224   if (TREE_CODE_CLASS (TREE_CODE (cond)) == tcc_comparison)
1225     {
1226       /* Build N = ASSERT_EXPR <V, COND>.  As a special case, if the
1227          conditional is an EQ_EXPR (V == Z), just build the assignment
1228          N = Z.  */
1229       if (TREE_CODE (cond) == EQ_EXPR)
1230         {
1231           tree other = get_opposite_operand (cond, v);
1232           assertion = build (MODIFY_EXPR, TREE_TYPE (v), n, other);
1233         }
1234       else
1235         assertion = build (MODIFY_EXPR, TREE_TYPE (v), n,
1236                            build (ASSERT_EXPR, TREE_TYPE (v), v, cond));
1237     }
1238   else if (TREE_CODE (cond) == TRUTH_NOT_EXPR)
1239     {
1240       /* Given !V, build the assignment N = false.  */
1241       tree op0 = TREE_OPERAND (cond, 0);
1242       gcc_assert (op0 == v);
1243       assertion = build (MODIFY_EXPR, TREE_TYPE (v), n, boolean_false_node);
1244     }
1245   else if (TREE_CODE (cond) == SSA_NAME)
1246     {
1247       /* Given V, build the assignment N = true.  */
1248       gcc_assert (v == cond);
1249       assertion = build (MODIFY_EXPR, TREE_TYPE (v), n, boolean_true_node);
1250     }
1251   else
1252     gcc_unreachable ();
1253
1254   SSA_NAME_DEF_STMT (n) = assertion;
1255
1256   /* The new ASSERT_EXPR, creates a new SSA name that replaces the
1257      operand of the ASSERT_EXPR. Register the new name and the old one
1258      in the replacement table so that we can fix the SSA web after
1259      adding all the ASSERT_EXPRs.  */
1260   register_new_name_mapping (n, v);
1261
1262   return assertion;
1263 }
1264
1265
1266 /* Return false if EXPR is a predicate expression involving floating
1267    point values.  */
1268
1269 static inline bool
1270 fp_predicate (tree expr)
1271 {
1272   return TREE_CODE_CLASS (TREE_CODE (expr)) == tcc_comparison
1273          && FLOAT_TYPE_P (TREE_TYPE (TREE_OPERAND (expr, 0)));
1274 }
1275
1276
1277 /* Return an expression predicate that represents the range of values
1278    that can be taken by operand OP after STMT executes.  */
1279
1280 static tree
1281 infer_value_range (tree stmt, tree op)
1282 {
1283   if (POINTER_TYPE_P (TREE_TYPE (op)))
1284     {
1285       bool is_store;
1286       unsigned num_uses, num_derefs;
1287
1288       count_uses_and_derefs (op, stmt, &num_uses, &num_derefs, &is_store);
1289       if (num_derefs > 0 && flag_delete_null_pointer_checks)
1290         {
1291           /* We can only assume that a pointer dereference will yield
1292              non-NULL if -fdelete-null-pointer-checks is enabled.  */
1293           tree null = build_int_cst (TREE_TYPE (op), 0);
1294           tree t = build (NE_EXPR, boolean_type_node, op, null);
1295           return t;
1296         }
1297     }
1298
1299   return NULL_TREE;
1300 }
1301
1302
1303 /* Return true if OP is the result of an ASSERT_EXPR that tests the
1304    same condition as COND.  */
1305
1306 static bool
1307 has_assert_expr (tree op, tree cond)
1308 {
1309   tree def_stmt = SSA_NAME_DEF_STMT (op);
1310   tree assert_expr, other_cond, other_op;
1311
1312   /* If OP was not generated by an ASSERT_EXPR, return false.  */
1313   if (TREE_CODE (def_stmt) != MODIFY_EXPR
1314       || TREE_CODE (TREE_OPERAND (def_stmt, 1)) != ASSERT_EXPR)
1315     return false;
1316
1317   assert_expr = TREE_OPERAND (def_stmt, 1);
1318   other_cond = ASSERT_EXPR_COND (assert_expr);
1319   other_op = ASSERT_EXPR_VAR (assert_expr);
1320
1321   if (TREE_CODE (cond) == TREE_CODE (other_cond))
1322     {
1323       tree t1, t2;
1324
1325       /* If COND is not a comparison predicate, something is wrong.  */
1326       gcc_assert (TREE_CODE_CLASS (TREE_CODE (cond)) == tcc_comparison);
1327
1328       /* Note that we only need to compare against one of the operands
1329          of OTHER_COND.  
1330          
1331          Suppose that we are about to insert the assertion ASSERT_EXPR
1332          <x_4, x_4 != 0> and the defining statement for x_4 is x_4 =
1333          ASSERT_EXPR <x_3, x_3 != 0>.
1334
1335          In this case, we don't really want to insert a new
1336          ASSERT_EXPR for x_4 because that would be redundant.  We
1337          already know that x_4 is not 0.  So, when comparing the
1338          conditionals 'x_3 != 0' and 'x_4 != 0', we don't want to
1339          compare x_3 and x_4, we just want to compare the predicate's
1340          code (!=) and the other operand (0).  */
1341       if (TREE_OPERAND (cond, 0) == op)
1342         t1 = TREE_OPERAND (cond, 1);
1343       else
1344         t1 = TREE_OPERAND (cond, 0);
1345
1346       if (TREE_OPERAND (other_cond, 0) == other_op)
1347         t2 = TREE_OPERAND (other_cond, 1);
1348       else
1349         t2 = TREE_OPERAND (other_cond, 0);
1350
1351       return (t1 == t2 || operand_equal_p (t1, t2, 0));
1352     }
1353
1354   return false;
1355 }
1356
1357
1358 /* Traverse all the statements in block BB looking for used variables.
1359    Variables used in BB are added to bitmap FOUND.  The algorithm
1360    works in three main parts:
1361
1362    1- For every statement S in BB, all the variables used by S are
1363       added to bitmap FOUND.
1364
1365    2- If statement S uses an operand N in a way that exposes a known
1366       value range for N, then if N was not already generated by an
1367       ASSERT_EXPR, create a new ASSERT_EXPR for N.  For instance, if N
1368       is a pointer and the statement dereferences it, we can assume
1369       that N is not NULL.
1370
1371    3- COND_EXPRs are a special case of #2.  We can derive range
1372       information from the predicate but need to insert different
1373       ASSERT_EXPRs for each of the sub-graphs rooted at the
1374       conditional block.  If the last statement of BB is a conditional
1375       expression of the form 'X op Y', then
1376
1377       a) Remove X and Y from the set FOUND.
1378
1379       b) If the conditional dominates its THEN_CLAUSE sub-graph,
1380          recurse into it.  On return, if X and/or Y are marked in
1381          FOUND, then an ASSERT_EXPR is added for the corresponding
1382          variable.
1383
1384       c) Repeat step (b) on the ELSE_CLAUSE.
1385
1386       d) Mark X and Y in FOUND.
1387
1388    3- If BB does not end in a conditional expression, then we recurse
1389       into BB's dominator children.
1390    
1391    At the end of the recursive traversal, ASSERT_EXPRs will have been
1392    added to the edges of COND_EXPR blocks that have sub-graphs using
1393    one or both predicate operands.  For instance,
1394
1395         if (a == 9)
1396           b = a;
1397         else
1398           b = c + 1;
1399
1400    In this case, an assertion on the THEN clause is useful to
1401    determine that 'a' is always 9 on that edge.  However, an assertion
1402    on the ELSE clause would be unnecessary.
1403
1404    On exit from this function, all the names created by the newly
1405    inserted ASSERT_EXPRs need to be added to the SSA web by rewriting
1406    the SSA names that they replace.
1407    
1408    TODO.  Handle SWITCH_EXPR.  */
1409
1410 static bool
1411 maybe_add_assert_expr (basic_block bb)
1412 {
1413   block_stmt_iterator si;
1414   tree last;
1415   bool added;
1416   use_optype uses;
1417
1418   /* Step 1.  Mark all the SSA names used in BB in bitmap FOUND.  */
1419   added = false;
1420   last = NULL_TREE;
1421   for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
1422     {
1423       tree stmt, op;
1424       ssa_op_iter i;
1425       
1426       stmt = bsi_stmt (si);
1427       get_stmt_operands (stmt);
1428
1429       /* Mark all the SSA names used by STMT in bitmap FOUND.  If STMT
1430          is inside the sub-graph of a conditional block, when we
1431          return from this recursive walk, our parent will use the
1432          FOUND bitset to determine if one of the operands it was
1433          looking for was present in the sub-graph.  */
1434       FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_USE)
1435         {
1436           tree cond;
1437
1438           SET_BIT (found, SSA_NAME_VERSION (op));
1439
1440           cond = infer_value_range (stmt, op);
1441           if (!cond)
1442             continue;
1443
1444           /* Step 3.  If OP is used in such a way that we can infer a
1445              value range for it, create a new ASSERT_EXPR for OP
1446              (unless OP already has an ASSERT_EXPR).  */
1447           gcc_assert (!is_ctrl_stmt (stmt));
1448
1449           if (has_assert_expr (op, cond))
1450             continue;
1451
1452           if (!stmt_ends_bb_p (stmt))
1453             {
1454               /* If STMT does not end the block, we can insert the new
1455                  assertion right after it.  */
1456               tree t = build_assert_expr_for (cond, op);
1457               bsi_insert_after (&si, t, BSI_NEW_STMT);
1458               added = true;
1459             }
1460           else
1461             {
1462               /* STMT must be the last statement in BB.  We can only
1463                  insert new assertions on the non-abnormal edge out of
1464                  BB.  Note that since STMT is not control flow, there
1465                  may only be one non-abnormal edge out of BB.  */
1466               edge_iterator ei;
1467               edge e;
1468
1469               FOR_EACH_EDGE (e, ei, bb->succs)
1470                 if (!(e->flags & EDGE_ABNORMAL))
1471                   {
1472                     tree t = build_assert_expr_for (cond, op);
1473                     bsi_insert_on_edge (e, t);
1474                     added = true;
1475                     break;
1476                   }
1477             }
1478         }
1479
1480       /* Remember the last statement of the block.  */
1481       last = stmt;
1482     }
1483
1484   /* Step 3.  If BB's last statement is a conditional expression
1485      involving integer operands, recurse into each of the sub-graphs
1486      rooted at BB to determine if we need to add ASSERT_EXPRs.
1487      Notice that we only care about the first operand of the
1488      conditional.  Adding assertions for both operands may actually 
1489      hinder VRP.  FIXME, add example.  */
1490   if (last
1491       && TREE_CODE (last) == COND_EXPR
1492       && !fp_predicate (COND_EXPR_COND (last))
1493       && NUM_USES (uses = STMT_USE_OPS (last)) > 0)
1494     {
1495       edge e;
1496       edge_iterator ei;
1497       tree op, cond;
1498       
1499       cond = COND_EXPR_COND (last);
1500
1501       /* Remove the COND_EXPR operand from the FOUND bitmap.
1502          Otherwise, when we finish traversing each of the sub-graphs,
1503          we won't know whether the variables were found in the
1504          sub-graphs or if they had been found in a block upstream from
1505          BB.  */
1506       op = USE_OP (uses, 0);
1507       RESET_BIT (found, SSA_NAME_VERSION (op));
1508
1509       /* Look for uses of the operands in each of the sub-graphs
1510          rooted at BB.  We need to check each of the outgoing edges
1511          separately, so that we know what kind of ASSERT_EXPR to
1512          insert.  */
1513       FOR_EACH_EDGE (e, ei, bb->succs)
1514         {
1515           /* If BB strictly dominates the sub-graph at E->DEST,
1516              recurse into it.  */
1517           if (e->dest != bb
1518               && dominated_by_p (CDI_DOMINATORS, e->dest, bb))
1519             added |= maybe_add_assert_expr (e->dest);
1520
1521           /* Once we traversed the sub-graph, check if any block inside
1522              used either of the predicate's operands.  If so, add the
1523              appropriate ASSERT_EXPR.  */
1524           if (TEST_BIT (found, SSA_NAME_VERSION (op)))
1525             {
1526               /* We found a use of OP in the sub-graph rooted at
1527                  E->DEST.  Add an ASSERT_EXPR according to whether
1528                  E goes to THEN_CLAUSE or ELSE_CLAUSE.  */
1529               tree c, t;
1530
1531               if (e->flags & EDGE_TRUE_VALUE)
1532                 c = unshare_expr (cond);
1533               else if (e->flags & EDGE_FALSE_VALUE)
1534                 c = invert_truthvalue (cond);
1535               else
1536                 gcc_unreachable ();
1537
1538               t = build_assert_expr_for (c, op);
1539               bsi_insert_on_edge (e, t);
1540               added = true;
1541             }
1542         }
1543
1544       /* Finally, mark all the COND_EXPR operands as found.  */
1545       SET_BIT (found, SSA_NAME_VERSION (op));
1546     }
1547   else
1548     {
1549       /* Step 3.  Recurse into the dominator children of BB.  */
1550       basic_block son;
1551
1552       for (son = first_dom_son (CDI_DOMINATORS, bb);
1553            son;
1554            son = next_dom_son (CDI_DOMINATORS, son))
1555         added |= maybe_add_assert_expr (son);
1556     }
1557
1558   return added;
1559 }
1560
1561
1562 /* Traverse the flowgraph looking for conditional jumps to insert range
1563    expressions.  These range expressions are meant to provide information
1564    to optimizations that need to reason in terms of value ranges.  They
1565    will not be expanded into RTL.  For instance, given:
1566
1567    x = ...
1568    y = ...
1569    if (x < y)
1570      y = x - 2;
1571    else
1572      x = y + 3;
1573
1574    this pass will transform the code into:
1575
1576    x = ...
1577    y = ...
1578    if (x < y)
1579     {
1580       x = ASSERT_EXPR <x, x < y>
1581       y = x - 2
1582     }
1583    else
1584     {
1585       y = ASSERT_EXPR <y, x <= y>
1586       x = y + 3
1587     }
1588
1589    The idea is that once copy and constant propagation have run, other
1590    optimizations will be able to determine what ranges of values can 'x'
1591    take in different paths of the code, simply by checking the reaching
1592    definition of 'x'.  */
1593
1594 static void
1595 insert_range_assertions (void)
1596 {
1597   edge e;
1598   edge_iterator ei;
1599   bool update_ssa_p;
1600   
1601   found = sbitmap_alloc (num_ssa_names);
1602   sbitmap_zero (found);
1603
1604   calculate_dominance_info (CDI_DOMINATORS);
1605
1606   update_ssa_p = false;
1607   FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
1608     if (maybe_add_assert_expr (e->dest))
1609       update_ssa_p = true;
1610
1611   if (update_ssa_p)
1612     {
1613       bsi_commit_edge_inserts ();
1614       update_ssa (TODO_update_ssa_no_phi);
1615     }
1616
1617   if (dump_file && (dump_flags & TDF_DETAILS))
1618     {
1619       fprintf (dump_file, "\nSSA form after inserting ASSERT_EXPRs\n");
1620       dump_function_to_file (current_function_decl, dump_file, dump_flags);
1621     }
1622
1623   sbitmap_free (found);
1624 }
1625
1626
1627 /* Convert range assertion expressions into copies.  FIXME, explain why.  */
1628
1629 static void
1630 remove_range_assertions (void)
1631 {
1632   basic_block bb;
1633   block_stmt_iterator si;
1634
1635   FOR_EACH_BB (bb)
1636     for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
1637       {
1638         tree stmt = bsi_stmt (si);
1639
1640         if (TREE_CODE (stmt) == MODIFY_EXPR
1641             && TREE_CODE (TREE_OPERAND (stmt, 1)) == ASSERT_EXPR)
1642           {
1643             tree rhs = TREE_OPERAND (stmt, 1);
1644             tree cond = fold (ASSERT_EXPR_COND (rhs));
1645             gcc_assert (cond != boolean_false_node);
1646             TREE_OPERAND (stmt, 1) = ASSERT_EXPR_VAR (rhs);
1647             update_stmt (stmt);
1648           }
1649       }
1650 }
1651
1652
1653 /* Return true if STMT is interesting for VRP.  */
1654
1655 static bool
1656 stmt_interesting_for_vrp (tree stmt)
1657 {
1658   if (TREE_CODE (stmt) == PHI_NODE
1659       && is_gimple_reg (PHI_RESULT (stmt))
1660       && (INTEGRAL_TYPE_P (TREE_TYPE (PHI_RESULT (stmt)))
1661           || POINTER_TYPE_P (TREE_TYPE (PHI_RESULT (stmt)))))
1662     return true;
1663   else if (TREE_CODE (stmt) == MODIFY_EXPR)
1664     {
1665       tree lhs = TREE_OPERAND (stmt, 0);
1666       stmt_ann_t ann = stmt_ann (stmt);
1667
1668       if (TREE_CODE (lhs) == SSA_NAME
1669           && (INTEGRAL_TYPE_P (TREE_TYPE (lhs))
1670               || POINTER_TYPE_P (TREE_TYPE (lhs)))
1671           && NUM_V_MAY_DEFS (V_MAY_DEF_OPS (ann)) == 0
1672           && NUM_VUSES (VUSE_OPS (ann)) == 0
1673           && NUM_V_MUST_DEFS (V_MUST_DEF_OPS (ann)) == 0)
1674         return true;
1675     }
1676   else if (TREE_CODE (stmt) == COND_EXPR || TREE_CODE (stmt) == SWITCH_EXPR)
1677     return true;
1678
1679   return false;
1680 }
1681
1682
1683 /* Initialize local data structures for VRP.  Return true if VRP
1684    is worth running (i.e. if we found any statements that could
1685    benefit from range information).  */
1686
1687 static bool
1688 vrp_initialize (void)
1689 {
1690   basic_block bb;
1691   bool do_vrp;
1692
1693   /* If we don't find any ASSERT_EXPRs in the code, there's no point
1694      running VRP.  */
1695   do_vrp = false;
1696
1697   FOR_EACH_BB (bb)
1698     {
1699       block_stmt_iterator si;
1700       tree phi;
1701
1702       for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
1703         {
1704           if (!stmt_interesting_for_vrp (phi))
1705             {
1706               tree lhs = PHI_RESULT (phi);
1707               set_value_range (get_value_range (lhs), VR_VARYING, 0, 0);
1708               DONT_SIMULATE_AGAIN (phi) = true;
1709             }
1710           else
1711             DONT_SIMULATE_AGAIN (phi) = false;
1712         }
1713
1714       for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
1715         {
1716           tree stmt = bsi_stmt (si);
1717
1718           if (!stmt_interesting_for_vrp (stmt))
1719             {
1720               ssa_op_iter i;
1721               tree def;
1722               FOR_EACH_SSA_TREE_OPERAND (def, stmt, i, SSA_OP_DEF)
1723                 set_value_range (get_value_range (def), VR_VARYING, 0, 0);
1724               DONT_SIMULATE_AGAIN (stmt) = true;
1725             }
1726           else
1727             {
1728               if (TREE_CODE (stmt) == MODIFY_EXPR
1729                    && TREE_CODE (TREE_OPERAND (stmt, 1)) == ASSERT_EXPR)
1730                 do_vrp = true;
1731
1732               DONT_SIMULATE_AGAIN (stmt) = false;
1733             }
1734         }
1735     }
1736
1737   return do_vrp;
1738 }
1739
1740
1741 /* Visit assignment STMT.  If it produces an interesting range, record
1742    the SSA name in *OUTPUT_P.  */
1743
1744 static enum ssa_prop_result
1745 vrp_visit_assignment (tree stmt, tree *output_p)
1746 {
1747   tree lhs, rhs, def;
1748   ssa_op_iter iter;
1749
1750   lhs = TREE_OPERAND (stmt, 0);
1751   rhs = TREE_OPERAND (stmt, 1);
1752
1753   /* We only keep track of ranges in integral and pointer types.  */
1754   if (TREE_CODE (lhs) == SSA_NAME
1755       && (INTEGRAL_TYPE_P (TREE_TYPE (lhs))
1756           || POINTER_TYPE_P (TREE_TYPE (lhs))))
1757     {
1758       value_range *vr, new_vr;
1759       struct loop *l;
1760       
1761       vr = get_value_range (lhs);
1762       extract_range_from_expr (&new_vr, rhs);
1763
1764       /* If STMT is inside a loop, we may be able to know something
1765          else about the range of LHS by examining scalar evolution
1766          information.  */
1767       if (cfg_loops && (l = loop_containing_stmt (stmt)))
1768         adjust_range_with_scev (&new_vr, l, lhs);
1769
1770       if (update_value_range (vr, new_vr.type, new_vr.min, new_vr.max))
1771         {
1772           *output_p = lhs;
1773
1774           if (dump_file && (dump_flags & TDF_DETAILS))
1775             {
1776               fprintf (dump_file, "Found new range ");
1777               dump_value_range (dump_file, &new_vr);
1778               fprintf (dump_file, " for ");
1779               print_generic_expr (dump_file, lhs, 0);
1780               fprintf (dump_file, "\n\n");
1781             }
1782
1783           if (new_vr.type == VR_VARYING)
1784             return SSA_PROP_VARYING;
1785
1786           return SSA_PROP_INTERESTING;
1787         }
1788
1789       return SSA_PROP_NOT_INTERESTING;
1790     }
1791   
1792   /* Every other statements produces no useful ranges.  */
1793   FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF)
1794     set_value_range (get_value_range (def), VR_VARYING, 0, 0);
1795
1796   return SSA_PROP_VARYING;
1797 }
1798
1799
1800 /* Given a conditional predicate COND, try to determine if COND yields
1801    true or false based on the value ranges of its operands.  */
1802
1803 static tree
1804 vrp_evaluate_conditional (tree cond)
1805 {
1806   gcc_assert (TREE_CODE (cond) == SSA_NAME
1807               || TREE_CODE_CLASS (TREE_CODE (cond)) == tcc_comparison);
1808
1809   if (TREE_CODE (cond) == SSA_NAME)
1810     {
1811       /* For SSA names, only return a truth value if the range is
1812          known and contains exactly one value.  */
1813       value_range *vr = SSA_NAME_VALUE_RANGE (cond);
1814       if (vr && vr->type == VR_RANGE && vr->min == vr->max)
1815         return vr->min;
1816     }
1817   else
1818     {
1819       /* For comparisons, evaluate each operand and compare their
1820          ranges.  */
1821       tree op0, op1;
1822       value_range *vr0, *vr1;
1823
1824       op0 = TREE_OPERAND (cond, 0);
1825       vr0 = (TREE_CODE (op0) == SSA_NAME) ? get_value_range (op0) : NULL;
1826
1827       op1 = TREE_OPERAND (cond, 1);
1828       vr1 = (TREE_CODE (op1) == SSA_NAME) ? get_value_range (op1) : NULL;
1829
1830       if (vr0 && vr1)
1831         return compare_ranges (TREE_CODE (cond), vr0, vr1);
1832       else if (vr0 && vr1 == NULL)
1833         return compare_range_with_value (TREE_CODE (cond), vr0, op1);
1834       else if (vr0 == NULL && vr1)
1835         return compare_range_with_value (opposite_comparison (TREE_CODE (cond)),
1836                                          vr1, op0);
1837     }
1838
1839   /* Anything else cannot be computed statically.  */
1840   return NULL_TREE;
1841 }
1842
1843
1844 /* Visit conditional statement STMT.  If we can determine which edge
1845    will be taken out of STMT's basic block, record it in
1846    *TAKEN_EDGE_P and return SSA_PROP_INTERESTING.  Otherwise, return
1847    SSA_PROP_VARYING.  */
1848
1849 static enum ssa_prop_result
1850 vrp_visit_cond_stmt (tree stmt, edge *taken_edge_p)
1851 {
1852   tree cond, val;
1853
1854   *taken_edge_p = NULL;
1855
1856   /* FIXME.  Handle SWITCH_EXPRs.  But first, the assert pass needs to
1857      add ASSERT_EXPRs for them.  */
1858   if (TREE_CODE (stmt) == SWITCH_EXPR)
1859     return SSA_PROP_VARYING;
1860
1861   cond = COND_EXPR_COND (stmt);
1862
1863   if (dump_file && (dump_flags & TDF_DETAILS))
1864     {
1865       tree use;
1866       ssa_op_iter i;
1867
1868       fprintf (dump_file, "\nVisiting conditional with predicate: ");
1869       print_generic_expr (dump_file, cond, 0);
1870       fprintf (dump_file, "\nWith known ranges\n");
1871       
1872       FOR_EACH_SSA_TREE_OPERAND (use, stmt, i, SSA_OP_USE)
1873         {
1874           fprintf (dump_file, "\t");
1875           print_generic_expr (dump_file, use, 0);
1876           fprintf (dump_file, ": ");
1877           dump_value_range (dump_file, SSA_NAME_VALUE_RANGE (use));
1878         }
1879
1880       fprintf (dump_file, "\n");
1881     }
1882
1883   /* Compute the value of the predicate COND by checking the known
1884      ranges of each of its operands.  */
1885   val = vrp_evaluate_conditional (cond);
1886   if (val)
1887     *taken_edge_p = find_taken_edge (bb_for_stmt (stmt), val);
1888
1889   if (dump_file && (dump_flags & TDF_DETAILS))
1890     {
1891       fprintf (dump_file, "\nPredicate evaluates to: ");
1892       if (val == NULL_TREE)
1893         fprintf (dump_file, "DON'T KNOW\n");
1894       else
1895         print_generic_stmt (dump_file, val, 0);
1896     }
1897
1898   return (*taken_edge_p) ? SSA_PROP_INTERESTING : SSA_PROP_VARYING;
1899 }
1900
1901
1902 /* Evaluate statement STMT.  If the statement produces a useful range,
1903    return SSA_PROP_INTERESTING and record the SSA name with the
1904    interesting range into *OUTPUT_P.
1905
1906    If STMT is a conditional branch and we can determine its truth
1907    value, the taken edge is recorded in *TAKEN_EDGE_P.
1908
1909    If STMT produces a varying value, return SSA_PROP_VARYING.  */
1910
1911 static enum ssa_prop_result
1912 vrp_visit_stmt (tree stmt, edge *taken_edge_p, tree *output_p)
1913 {
1914   tree def;
1915   ssa_op_iter iter;
1916   stmt_ann_t ann;
1917
1918   if (dump_file && (dump_flags & TDF_DETAILS))
1919     {
1920       fprintf (dump_file, "\nVisiting statement:\n");
1921       print_generic_stmt (dump_file, stmt, dump_flags);
1922       fprintf (dump_file, "\n");
1923     }
1924
1925   ann = stmt_ann (stmt);
1926   if (TREE_CODE (stmt) == MODIFY_EXPR
1927       && NUM_V_MAY_DEFS (V_MAY_DEF_OPS (ann)) == 0
1928       && NUM_VUSES (VUSE_OPS (ann)) == 0
1929       && NUM_V_MUST_DEFS (V_MUST_DEF_OPS (ann)) == 0)
1930     return vrp_visit_assignment (stmt, output_p);
1931   else if (TREE_CODE (stmt) == COND_EXPR || TREE_CODE (stmt) == SWITCH_EXPR)
1932     return vrp_visit_cond_stmt (stmt, taken_edge_p);
1933
1934   /* All other statements produce nothing of interest for VRP, so mark
1935      their outputs varying and prevent further simulation.  */
1936   FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF)
1937     set_value_range (get_value_range (def), VR_VARYING, 0, 0);
1938
1939   return SSA_PROP_VARYING;
1940 }
1941
1942
1943 /* Meet operation for value ranges.  Given two value ranges VR0 and
1944    VR1, store in VR0 the result of meeting VR0 and VR1.
1945    
1946    The meeting rules are as follows:
1947
1948    1- If VR0 and VR1 have an empty intersection, set VR0 to VR_VARYING.
1949
1950    2- If VR0 and VR1 have a non-empty intersection, set VR0 to the
1951       union of VR0 and VR1.  */
1952
1953 static void
1954 vrp_meet (value_range *vr0, value_range *vr1)
1955 {
1956   if (vr0->type == VR_UNDEFINED)
1957     {
1958       *vr0 = *vr1;
1959       return;
1960     }
1961
1962   if (vr1->type == VR_UNDEFINED)
1963     {
1964       /* Nothing to do.  VR0 already has the resulting range.  */
1965       return;
1966     }
1967
1968   if (vr0->type == VR_VARYING)
1969     {
1970       /* Nothing to do.  VR0 already has the resulting range.  */
1971       return;
1972     }
1973
1974   if (vr1->type == VR_VARYING)
1975     {
1976       *vr0 = *vr1;
1977       return;
1978     }
1979
1980   /* If either is a symbolic range, drop to VARYING.  */
1981   if (symbolic_range_p (vr0) || symbolic_range_p (vr1))
1982     {
1983       set_value_range (vr0, VR_VARYING, NULL_TREE, NULL_TREE);
1984       return;
1985     }
1986
1987   if (vr0->type == VR_RANGE && vr1->type == VR_RANGE)
1988     {
1989       /* If VR0 and VR1 have a non-empty intersection, compute the
1990          union of both ranges.  */
1991       if (value_ranges_intersect_p (vr0, vr1))
1992         {
1993           tree min, max;
1994
1995           min = vr0->min;
1996           max = vr0->max;
1997
1998           /* The lower limit of the new range is the minimum of the
1999              two ranges.  */
2000           if (compare_values (vr0->min, vr1->min) == 1)
2001             min = vr1->min;
2002
2003           /* The upper limit of the new range is the maximum of the
2004              two ranges.  */
2005           if (compare_values (vr0->max, vr1->max) == -1)
2006             max = vr1->max;
2007
2008           set_value_range (vr0, vr0->type, min, max);
2009         }
2010       else
2011         {
2012           /* The two ranges don't intersect, set the result to VR_VARYING.  */
2013           set_value_range (vr0, VR_VARYING, NULL_TREE, NULL_TREE);
2014         }
2015     }
2016   else if (vr0->type == VR_ANTI_RANGE && vr1->type == VR_ANTI_RANGE)
2017     {
2018       /* Two anti-ranges meet only if they are both identical.  */
2019       if (compare_values (vr0->min, vr1->min) == 0
2020           && compare_values (vr0->max, vr1->max) == 0
2021           && compare_values (vr0->min, vr0->max) == 0)
2022         /* Nothing to do.  */ ;
2023       else
2024         set_value_range (vr0, VR_VARYING, NULL_TREE, NULL_TREE);
2025     }
2026   else if (vr0->type == VR_ANTI_RANGE || vr1->type == VR_ANTI_RANGE)
2027     {
2028       /* A range [VAL1, VAL2] and an anti-range ~[VAL3, VAL4] meet
2029          only if the ranges have an empty intersection.  The result of
2030          the meet operation is the anti-range.  */
2031       if (!value_ranges_intersect_p (vr0, vr1))
2032         {
2033           if (vr1->type == VR_ANTI_RANGE)
2034             *vr0 = *vr1;
2035         }
2036       else
2037         set_value_range (vr0, VR_VARYING, NULL_TREE, NULL_TREE);
2038     }
2039   else
2040     gcc_unreachable ();
2041 }
2042
2043       
2044 /* Visit all arguments for PHI node PHI that flow through executable
2045    edges.  If a valid value range can be derived from all the incoming
2046    value ranges, set a new range for the LHS of PHI.  */
2047
2048 static enum ssa_prop_result
2049 vrp_visit_phi_node (tree phi)
2050 {
2051   int i;
2052   tree lhs = PHI_RESULT (phi);
2053   value_range *lhs_vr = get_value_range (lhs);
2054   value_range vr_result = *lhs_vr;
2055
2056   if (dump_file && (dump_flags & TDF_DETAILS))
2057     {
2058       fprintf (dump_file, "\nVisiting PHI node: ");
2059       print_generic_expr (dump_file, phi, dump_flags);
2060     }
2061
2062   for (i = 0; i < PHI_NUM_ARGS (phi); i++)
2063     {
2064       edge e = PHI_ARG_EDGE (phi, i);
2065
2066       if (dump_file && (dump_flags & TDF_DETAILS))
2067         {
2068           fprintf (dump_file,
2069               "\n    Argument #%d (%d -> %d %sexecutable)\n",
2070               i, e->src->index, e->dest->index,
2071               (e->flags & EDGE_EXECUTABLE) ? "" : "not ");
2072         }
2073
2074       if (e->flags & EDGE_EXECUTABLE)
2075         {
2076           tree arg = PHI_ARG_DEF (phi, i);
2077           value_range vr_arg;
2078
2079           if (TREE_CODE (arg) == SSA_NAME)
2080             vr_arg = *(get_value_range (arg));
2081           else
2082             {
2083               vr_arg.type = VR_RANGE;
2084               vr_arg.min = arg;
2085               vr_arg.max = arg;
2086             }
2087
2088           if (dump_file && (dump_flags & TDF_DETAILS))
2089             {
2090               fprintf (dump_file, "\t");
2091               print_generic_expr (dump_file, arg, dump_flags);
2092               fprintf (dump_file, "\n\tValue: ");
2093               dump_value_range (dump_file, &vr_arg);
2094               fprintf (dump_file, "\n");
2095             }
2096
2097           vrp_meet (&vr_result, &vr_arg);
2098
2099           if (vr_result.type == VR_VARYING)
2100             break;
2101         }
2102     }
2103
2104   if (vr_result.type == VR_VARYING)
2105     {
2106       set_value_range (lhs_vr, VR_VARYING, 0, 0);
2107       return SSA_PROP_VARYING;
2108     }
2109
2110   /* To prevent infinite iterations in the algorithm, derive ranges
2111      when the new value is slightly bigger or smaller than the
2112      previous one.  */
2113   if (lhs_vr->type == VR_RANGE)
2114     {
2115       if (!POINTER_TYPE_P (TREE_TYPE (lhs)))
2116         {
2117           int cmp_min = compare_values (lhs_vr->min, vr_result.min);
2118           int cmp_max = compare_values (lhs_vr->max, vr_result.max);
2119
2120           /* If the new minimum is smaller or larger than the previous
2121              one, go all the way to -INF.  In the first case, to avoid
2122              iterating millions of times to reach -INF, and in the
2123              other case to avoid infinite bouncing between different
2124              minimums.  */
2125           if (cmp_min > 0 || cmp_min < 0)
2126             vr_result.min = TYPE_MIN_VALUE (TREE_TYPE (vr_result.min));
2127
2128           /* Similarly, if the new maximum is smaller or larger than
2129              the previous one, go all the way to +INF.  */
2130           if (cmp_max < 0 || cmp_max > 0)
2131             vr_result.max = TYPE_MAX_VALUE (TREE_TYPE (vr_result.max));
2132
2133           /* If we ended up with a (-INF, +INF) range, set it to
2134              VARYING.  */
2135           if (vr_result.min == TYPE_MIN_VALUE (TREE_TYPE (vr_result.min))
2136               && vr_result.max == TYPE_MAX_VALUE (TREE_TYPE (vr_result.max)))
2137             {
2138               set_value_range (lhs_vr, VR_VARYING, 0, 0);
2139               return SSA_PROP_VARYING;
2140             }
2141         }
2142     }
2143
2144   /* If the new range is different than the previous value, keep
2145      iterating.  */
2146   if (update_value_range (lhs_vr, vr_result.type, vr_result.min, vr_result.max))
2147     return SSA_PROP_INTERESTING;
2148
2149   /* Nothing changed, don't add outgoing edges.  */
2150   return SSA_PROP_NOT_INTERESTING;
2151 }
2152
2153
2154 /* Traverse all the blocks folding conditionals with known ranges.  */
2155
2156 static void
2157 vrp_finalize (void)
2158 {
2159   basic_block bb;
2160   int num_pred_folded = 0;
2161
2162   if (dump_file)
2163     {
2164       fprintf (dump_file, "\nValue ranges after VRP:\n\n");
2165       dump_all_value_ranges (dump_file);
2166       fprintf (dump_file, "\n");
2167     }
2168
2169   FOR_EACH_BB (bb)
2170     {
2171       tree last = last_stmt (bb);
2172       if (last && TREE_CODE (last) == COND_EXPR)
2173         {
2174           tree val = vrp_evaluate_conditional (COND_EXPR_COND (last));
2175           if (val)
2176             {
2177               if (dump_file)
2178                 {
2179                   fprintf (dump_file, "Folding predicate ");
2180                   print_generic_expr (dump_file, COND_EXPR_COND (last), 0);
2181                   fprintf (dump_file, " to ");
2182                   print_generic_expr (dump_file, val, 0);
2183                   fprintf (dump_file, "\n");
2184                 }
2185
2186               num_pred_folded++;
2187               COND_EXPR_COND (last) = val;
2188               update_stmt (last);
2189             }
2190         }
2191     }
2192
2193   if (dump_file && (dump_flags & TDF_STATS))
2194     fprintf (dump_file, "\nNumber of predicates folded: %d\n\n",
2195              num_pred_folded);
2196 }
2197
2198
2199 /* Main entry point to VRP (Value Range Propagation).  This pass is
2200    loosely based on J. R. C. Patterson, ``Accurate Static Branch
2201    Prediction by Value Range Propagation,'' in SIGPLAN Conference on
2202    Programming Language Design and Implementation, pp. 67-78, 1995.
2203    Also available at http://citeseer.ist.psu.edu/patterson95accurate.html
2204
2205    This is essentially an SSA-CCP pass modified to deal with ranges
2206    instead of constants.
2207
2208    TODO, the main difference between this pass and Patterson's is that
2209    we do not propagate edge probabilities.  We only compute whether
2210    edges can be taken or not.  That is, instead of having a spectrum
2211    of jump probabilities between 0 and 1, we only deal with 0, 1 and
2212    DON'T KNOW.  In the future, it may be worthwhile to propagate
2213    probabilities to aid branch prediction.  */
2214
2215 static void
2216 execute_vrp (void)
2217 {
2218   insert_range_assertions ();
2219
2220   cfg_loops = loop_optimizer_init (NULL);
2221   if (cfg_loops)
2222     scev_initialize (cfg_loops);
2223
2224   if (vrp_initialize ())
2225     {
2226       ssa_propagate (vrp_visit_stmt, vrp_visit_phi_node);
2227       vrp_finalize ();
2228     }
2229
2230   if (cfg_loops)
2231     {
2232       scev_finalize ();
2233       loop_optimizer_finalize (cfg_loops, NULL);
2234       current_loops = NULL;
2235     }
2236
2237   remove_range_assertions ();
2238 }
2239
2240 static bool
2241 gate_vrp (void)
2242 {
2243   return flag_tree_vrp != 0;
2244 }
2245
2246 struct tree_opt_pass pass_vrp =
2247 {
2248   "vrp",                                /* name */
2249   gate_vrp,                             /* gate */
2250   execute_vrp,                          /* execute */
2251   NULL,                                 /* sub */
2252   NULL,                                 /* next */
2253   0,                                    /* static_pass_number */
2254   TV_TREE_VRP,                          /* tv_id */
2255   PROP_ssa | PROP_alias,                /* properties_required */
2256   0,                                    /* properties_provided */
2257   0,                                    /* properties_destroyed */
2258   0,                                    /* todo_flags_start */
2259   TODO_cleanup_cfg
2260     | TODO_ggc_collect
2261     | TODO_verify_ssa
2262     | TODO_dump_func
2263     | TODO_update_ssa,                  /* todo_flags_finish */
2264   0                                     /* letter */
2265 };