OSDN Git Service

gcc/
[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.  */
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   /* Do not attempt to infer anything in names that flow through
1284      abnormal edges.  */
1285   if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op))
1286     return NULL_TREE;
1287
1288   if (POINTER_TYPE_P (TREE_TYPE (op)))
1289     {
1290       bool is_store;
1291       unsigned num_uses, num_derefs;
1292
1293       count_uses_and_derefs (op, stmt, &num_uses, &num_derefs, &is_store);
1294       if (num_derefs > 0 && flag_delete_null_pointer_checks)
1295         {
1296           /* We can only assume that a pointer dereference will yield
1297              non-NULL if -fdelete-null-pointer-checks is enabled.  */
1298           tree null = build_int_cst (TREE_TYPE (op), 0);
1299           tree t = build (NE_EXPR, boolean_type_node, op, null);
1300           return t;
1301         }
1302     }
1303
1304   return NULL_TREE;
1305 }
1306
1307
1308 /* Return true if OP is the result of an ASSERT_EXPR that tests the
1309    same condition as COND.  */
1310
1311 static bool
1312 has_assert_expr (tree op, tree cond)
1313 {
1314   tree def_stmt = SSA_NAME_DEF_STMT (op);
1315   tree assert_expr, other_cond, other_op;
1316
1317   /* If OP was not generated by an ASSERT_EXPR, return false.  */
1318   if (TREE_CODE (def_stmt) != MODIFY_EXPR
1319       || TREE_CODE (TREE_OPERAND (def_stmt, 1)) != ASSERT_EXPR)
1320     return false;
1321
1322   assert_expr = TREE_OPERAND (def_stmt, 1);
1323   other_cond = ASSERT_EXPR_COND (assert_expr);
1324   other_op = ASSERT_EXPR_VAR (assert_expr);
1325
1326   if (TREE_CODE (cond) == TREE_CODE (other_cond))
1327     {
1328       tree t1, t2;
1329
1330       /* If COND is not a comparison predicate, something is wrong.  */
1331       gcc_assert (TREE_CODE_CLASS (TREE_CODE (cond)) == tcc_comparison);
1332
1333       /* Note that we only need to compare against one of the operands
1334          of OTHER_COND.  
1335          
1336          Suppose that we are about to insert the assertion ASSERT_EXPR
1337          <x_4, x_4 != 0> and the defining statement for x_4 is x_4 =
1338          ASSERT_EXPR <x_3, x_3 != 0>.
1339
1340          In this case, we don't really want to insert a new
1341          ASSERT_EXPR for x_4 because that would be redundant.  We
1342          already know that x_4 is not 0.  So, when comparing the
1343          conditionals 'x_3 != 0' and 'x_4 != 0', we don't want to
1344          compare x_3 and x_4, we just want to compare the predicate's
1345          code (!=) and the other operand (0).  */
1346       if (TREE_OPERAND (cond, 0) == op)
1347         t1 = TREE_OPERAND (cond, 1);
1348       else
1349         t1 = TREE_OPERAND (cond, 0);
1350
1351       if (TREE_OPERAND (other_cond, 0) == other_op)
1352         t2 = TREE_OPERAND (other_cond, 1);
1353       else
1354         t2 = TREE_OPERAND (other_cond, 0);
1355
1356       return (t1 == t2 || operand_equal_p (t1, t2, 0));
1357     }
1358
1359   return false;
1360 }
1361
1362
1363 /* Traverse all the statements in block BB looking for used variables.
1364    Variables used in BB are added to bitmap FOUND.  The algorithm
1365    works in three main parts:
1366
1367    1- For every statement S in BB, all the variables used by S are
1368       added to bitmap FOUND.
1369
1370    2- If statement S uses an operand N in a way that exposes a known
1371       value range for N, then if N was not already generated by an
1372       ASSERT_EXPR, create a new ASSERT_EXPR for N.  For instance, if N
1373       is a pointer and the statement dereferences it, we can assume
1374       that N is not NULL.
1375
1376    3- COND_EXPRs are a special case of #2.  We can derive range
1377       information from the predicate but need to insert different
1378       ASSERT_EXPRs for each of the sub-graphs rooted at the
1379       conditional block.  If the last statement of BB is a conditional
1380       expression of the form 'X op Y', then
1381
1382       a) Remove X and Y from the set FOUND.
1383
1384       b) If the conditional dominates its THEN_CLAUSE sub-graph,
1385          recurse into it.  On return, if X and/or Y are marked in
1386          FOUND, then an ASSERT_EXPR is added for the corresponding
1387          variable.
1388
1389       c) Repeat step (b) on the ELSE_CLAUSE.
1390
1391       d) Mark X and Y in FOUND.
1392
1393    4- If BB does not end in a conditional expression, then we recurse
1394       into BB's dominator children.
1395    
1396    At the end of the recursive traversal, ASSERT_EXPRs will have been
1397    added to the edges of COND_EXPR blocks that have sub-graphs using
1398    one or both predicate operands.  For instance,
1399
1400         if (a == 9)
1401           b = a;
1402         else
1403           b = c + 1;
1404
1405    In this case, an assertion on the THEN clause is useful to
1406    determine that 'a' is always 9 on that edge.  However, an assertion
1407    on the ELSE clause would be unnecessary.
1408
1409    On exit from this function, all the names created by the newly
1410    inserted ASSERT_EXPRs need to be added to the SSA web by rewriting
1411    the SSA names that they replace.
1412    
1413    TODO.  Handle SWITCH_EXPR.  */
1414
1415 static bool
1416 maybe_add_assert_expr (basic_block bb)
1417 {
1418   block_stmt_iterator si;
1419   tree last;
1420   bool added;
1421   use_optype uses;
1422
1423   /* Step 1.  Mark all the SSA names used in BB in bitmap FOUND.  */
1424   added = false;
1425   last = NULL_TREE;
1426   for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
1427     {
1428       tree stmt, op;
1429       ssa_op_iter i;
1430       
1431       stmt = bsi_stmt (si);
1432       get_stmt_operands (stmt);
1433
1434       /* Mark all the SSA names used by STMT in bitmap FOUND.  If STMT
1435          is inside the sub-graph of a conditional block, when we
1436          return from this recursive walk, our parent will use the
1437          FOUND bitset to determine if one of the operands it was
1438          looking for was present in the sub-graph.  */
1439       FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_USE)
1440         {
1441           tree cond;
1442
1443           SET_BIT (found, SSA_NAME_VERSION (op));
1444
1445           cond = infer_value_range (stmt, op);
1446           if (!cond)
1447             continue;
1448
1449           /* Step 2.  If OP is used in such a way that we can infer a
1450              value range for it, create a new ASSERT_EXPR for OP
1451              (unless OP already has an ASSERT_EXPR).  */
1452           gcc_assert (!is_ctrl_stmt (stmt));
1453
1454           if (has_assert_expr (op, cond))
1455             continue;
1456
1457           if (!stmt_ends_bb_p (stmt))
1458             {
1459               /* If STMT does not end the block, we can insert the new
1460                  assertion right after it.  */
1461               tree t = build_assert_expr_for (cond, op);
1462               bsi_insert_after (&si, t, BSI_NEW_STMT);
1463               added = true;
1464             }
1465           else
1466             {
1467               /* STMT must be the last statement in BB.  We can only
1468                  insert new assertions on the non-abnormal edge out of
1469                  BB.  Note that since STMT is not control flow, there
1470                  may only be one non-abnormal edge out of BB.  */
1471               edge_iterator ei;
1472               edge e;
1473
1474               FOR_EACH_EDGE (e, ei, bb->succs)
1475                 if (!(e->flags & EDGE_ABNORMAL))
1476                   {
1477                     tree t = build_assert_expr_for (cond, op);
1478                     bsi_insert_on_edge (e, t);
1479                     added = true;
1480                     break;
1481                   }
1482             }
1483         }
1484
1485       /* Remember the last statement of the block.  */
1486       last = stmt;
1487     }
1488
1489   /* Step 3.  If BB's last statement is a conditional expression
1490      involving integer operands, recurse into each of the sub-graphs
1491      rooted at BB to determine if we need to add ASSERT_EXPRs.
1492      Notice that we only care about the first operand of the
1493      conditional.  Adding assertions for both operands may actually 
1494      hinder VRP.  FIXME, add example.  */
1495   if (last
1496       && TREE_CODE (last) == COND_EXPR
1497       && !fp_predicate (COND_EXPR_COND (last))
1498       && NUM_USES (uses = STMT_USE_OPS (last)) > 0)
1499     {
1500       edge e;
1501       edge_iterator ei;
1502       tree op, cond;
1503       basic_block son;
1504       
1505       cond = COND_EXPR_COND (last);
1506
1507       op = USE_OP (uses, 0);
1508
1509       /* Do not attempt to infer anything in names that flow through
1510          abnormal edges.  */
1511       if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op))
1512         return false;
1513
1514       /* Remove the COND_EXPR operand from the FOUND bitmap.
1515          Otherwise, when we finish traversing each of the sub-graphs,
1516          we won't know whether the variables were found in the
1517          sub-graphs or if they had been found in a block upstream from
1518          BB.  */
1519       RESET_BIT (found, SSA_NAME_VERSION (op));
1520
1521       /* Look for uses of the operands in each of the sub-graphs
1522          rooted at BB.  We need to check each of the outgoing edges
1523          separately, so that we know what kind of ASSERT_EXPR to
1524          insert.  */
1525       FOR_EACH_EDGE (e, ei, bb->succs)
1526         {
1527           /* If BB strictly dominates the sub-graph at E->DEST,
1528              recurse into it.  */
1529           if (e->dest != bb
1530               && dominated_by_p (CDI_DOMINATORS, e->dest, bb))
1531             added |= maybe_add_assert_expr (e->dest);
1532
1533           /* Once we traversed the sub-graph, check if any block inside
1534              used either of the predicate's operands.  If so, add the
1535              appropriate ASSERT_EXPR.  */
1536           if (TEST_BIT (found, SSA_NAME_VERSION (op)))
1537             {
1538               /* We found a use of OP in the sub-graph rooted at
1539                  E->DEST.  Add an ASSERT_EXPR according to whether
1540                  E goes to THEN_CLAUSE or ELSE_CLAUSE.  */
1541               tree c, t;
1542
1543               if (e->flags & EDGE_TRUE_VALUE)
1544                 c = unshare_expr (cond);
1545               else if (e->flags & EDGE_FALSE_VALUE)
1546                 c = invert_truthvalue (cond);
1547               else
1548                 gcc_unreachable ();
1549
1550               t = build_assert_expr_for (c, op);
1551               bsi_insert_on_edge (e, t);
1552               added = true;
1553             }
1554         }
1555
1556       /* Finally, mark all the COND_EXPR operands as found.  */
1557       SET_BIT (found, SSA_NAME_VERSION (op));
1558
1559       /* Recurse into the dominator children of BB that are not BB's
1560          immediate successors.  Note that we have already visited BB's
1561          other dominator children above.  */
1562       for (son = first_dom_son (CDI_DOMINATORS, bb);
1563            son;
1564            son = next_dom_son (CDI_DOMINATORS, son))
1565         {
1566           if (find_edge (bb, son) == NULL)
1567             added |= maybe_add_assert_expr (son);
1568         }
1569     }
1570   else
1571     {
1572       /* Step 4.  Recurse into the dominator children of BB.  */
1573       basic_block son;
1574
1575       for (son = first_dom_son (CDI_DOMINATORS, bb);
1576            son;
1577            son = next_dom_son (CDI_DOMINATORS, son))
1578         added |= maybe_add_assert_expr (son);
1579     }
1580
1581   return added;
1582 }
1583
1584
1585 /* Traverse the flowgraph looking for conditional jumps to insert range
1586    expressions.  These range expressions are meant to provide information
1587    to optimizations that need to reason in terms of value ranges.  They
1588    will not be expanded into RTL.  For instance, given:
1589
1590    x = ...
1591    y = ...
1592    if (x < y)
1593      y = x - 2;
1594    else
1595      x = y + 3;
1596
1597    this pass will transform the code into:
1598
1599    x = ...
1600    y = ...
1601    if (x < y)
1602     {
1603       x = ASSERT_EXPR <x, x < y>
1604       y = x - 2
1605     }
1606    else
1607     {
1608       y = ASSERT_EXPR <y, x <= y>
1609       x = y + 3
1610     }
1611
1612    The idea is that once copy and constant propagation have run, other
1613    optimizations will be able to determine what ranges of values can 'x'
1614    take in different paths of the code, simply by checking the reaching
1615    definition of 'x'.  */
1616
1617 static void
1618 insert_range_assertions (void)
1619 {
1620   edge e;
1621   edge_iterator ei;
1622   bool update_ssa_p;
1623   
1624   found = sbitmap_alloc (num_ssa_names);
1625   sbitmap_zero (found);
1626
1627   calculate_dominance_info (CDI_DOMINATORS);
1628
1629   update_ssa_p = false;
1630   FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
1631     if (maybe_add_assert_expr (e->dest))
1632       update_ssa_p = true;
1633
1634   if (update_ssa_p)
1635     {
1636       bsi_commit_edge_inserts ();
1637       update_ssa (TODO_update_ssa_no_phi);
1638     }
1639
1640   if (dump_file && (dump_flags & TDF_DETAILS))
1641     {
1642       fprintf (dump_file, "\nSSA form after inserting ASSERT_EXPRs\n");
1643       dump_function_to_file (current_function_decl, dump_file, dump_flags);
1644     }
1645
1646   sbitmap_free (found);
1647 }
1648
1649
1650 /* Convert range assertion expressions into copies.  FIXME, explain why.  */
1651
1652 static void
1653 remove_range_assertions (void)
1654 {
1655   basic_block bb;
1656   block_stmt_iterator si;
1657
1658   FOR_EACH_BB (bb)
1659     for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
1660       {
1661         tree stmt = bsi_stmt (si);
1662
1663         if (TREE_CODE (stmt) == MODIFY_EXPR
1664             && TREE_CODE (TREE_OPERAND (stmt, 1)) == ASSERT_EXPR)
1665           {
1666             tree rhs = TREE_OPERAND (stmt, 1);
1667             tree cond = fold (ASSERT_EXPR_COND (rhs));
1668             gcc_assert (cond != boolean_false_node);
1669             TREE_OPERAND (stmt, 1) = ASSERT_EXPR_VAR (rhs);
1670             update_stmt (stmt);
1671           }
1672       }
1673 }
1674
1675
1676 /* Return true if STMT is interesting for VRP.  */
1677
1678 static bool
1679 stmt_interesting_for_vrp (tree stmt)
1680 {
1681   if (TREE_CODE (stmt) == PHI_NODE
1682       && is_gimple_reg (PHI_RESULT (stmt))
1683       && (INTEGRAL_TYPE_P (TREE_TYPE (PHI_RESULT (stmt)))
1684           || POINTER_TYPE_P (TREE_TYPE (PHI_RESULT (stmt)))))
1685     return true;
1686   else if (TREE_CODE (stmt) == MODIFY_EXPR)
1687     {
1688       tree lhs = TREE_OPERAND (stmt, 0);
1689       stmt_ann_t ann = stmt_ann (stmt);
1690
1691       if (TREE_CODE (lhs) == SSA_NAME
1692           && (INTEGRAL_TYPE_P (TREE_TYPE (lhs))
1693               || POINTER_TYPE_P (TREE_TYPE (lhs)))
1694           && NUM_V_MAY_DEFS (V_MAY_DEF_OPS (ann)) == 0
1695           && NUM_VUSES (VUSE_OPS (ann)) == 0
1696           && NUM_V_MUST_DEFS (V_MUST_DEF_OPS (ann)) == 0)
1697         return true;
1698     }
1699   else if (TREE_CODE (stmt) == COND_EXPR || TREE_CODE (stmt) == SWITCH_EXPR)
1700     return true;
1701
1702   return false;
1703 }
1704
1705
1706 /* Initialize local data structures for VRP.  Return true if VRP
1707    is worth running (i.e. if we found any statements that could
1708    benefit from range information).  */
1709
1710 static bool
1711 vrp_initialize (void)
1712 {
1713   basic_block bb;
1714   bool do_vrp;
1715
1716   /* If we don't find any ASSERT_EXPRs in the code, there's no point
1717      running VRP.  */
1718   do_vrp = false;
1719
1720   FOR_EACH_BB (bb)
1721     {
1722       block_stmt_iterator si;
1723       tree phi;
1724
1725       for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
1726         {
1727           if (!stmt_interesting_for_vrp (phi))
1728             {
1729               tree lhs = PHI_RESULT (phi);
1730               set_value_range (get_value_range (lhs), VR_VARYING, 0, 0);
1731               DONT_SIMULATE_AGAIN (phi) = true;
1732             }
1733           else
1734             DONT_SIMULATE_AGAIN (phi) = false;
1735         }
1736
1737       for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
1738         {
1739           tree stmt = bsi_stmt (si);
1740
1741           if (!stmt_interesting_for_vrp (stmt))
1742             {
1743               ssa_op_iter i;
1744               tree def;
1745               FOR_EACH_SSA_TREE_OPERAND (def, stmt, i, SSA_OP_DEF)
1746                 set_value_range (get_value_range (def), VR_VARYING, 0, 0);
1747               DONT_SIMULATE_AGAIN (stmt) = true;
1748             }
1749           else
1750             {
1751               if (TREE_CODE (stmt) == MODIFY_EXPR
1752                    && TREE_CODE (TREE_OPERAND (stmt, 1)) == ASSERT_EXPR)
1753                 do_vrp = true;
1754
1755               DONT_SIMULATE_AGAIN (stmt) = false;
1756             }
1757         }
1758     }
1759
1760   return do_vrp;
1761 }
1762
1763
1764 /* Visit assignment STMT.  If it produces an interesting range, record
1765    the SSA name in *OUTPUT_P.  */
1766
1767 static enum ssa_prop_result
1768 vrp_visit_assignment (tree stmt, tree *output_p)
1769 {
1770   tree lhs, rhs, def;
1771   ssa_op_iter iter;
1772
1773   lhs = TREE_OPERAND (stmt, 0);
1774   rhs = TREE_OPERAND (stmt, 1);
1775
1776   /* We only keep track of ranges in integral and pointer types.  */
1777   if (TREE_CODE (lhs) == SSA_NAME
1778       && (INTEGRAL_TYPE_P (TREE_TYPE (lhs))
1779           || POINTER_TYPE_P (TREE_TYPE (lhs))))
1780     {
1781       value_range *vr, new_vr;
1782       struct loop *l;
1783       
1784       vr = get_value_range (lhs);
1785       extract_range_from_expr (&new_vr, rhs);
1786
1787       /* If STMT is inside a loop, we may be able to know something
1788          else about the range of LHS by examining scalar evolution
1789          information.  */
1790       if (cfg_loops && (l = loop_containing_stmt (stmt)))
1791         adjust_range_with_scev (&new_vr, l, lhs);
1792
1793       if (update_value_range (vr, new_vr.type, new_vr.min, new_vr.max))
1794         {
1795           *output_p = lhs;
1796
1797           if (dump_file && (dump_flags & TDF_DETAILS))
1798             {
1799               fprintf (dump_file, "Found new range ");
1800               dump_value_range (dump_file, &new_vr);
1801               fprintf (dump_file, " for ");
1802               print_generic_expr (dump_file, lhs, 0);
1803               fprintf (dump_file, "\n\n");
1804             }
1805
1806           if (new_vr.type == VR_VARYING)
1807             return SSA_PROP_VARYING;
1808
1809           return SSA_PROP_INTERESTING;
1810         }
1811
1812       return SSA_PROP_NOT_INTERESTING;
1813     }
1814   
1815   /* Every other statements produces no useful ranges.  */
1816   FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF)
1817     set_value_range (get_value_range (def), VR_VARYING, 0, 0);
1818
1819   return SSA_PROP_VARYING;
1820 }
1821
1822
1823 /* Given a conditional predicate COND, try to determine if COND yields
1824    true or false based on the value ranges of its operands.  */
1825
1826 static tree
1827 vrp_evaluate_conditional (tree cond)
1828 {
1829   gcc_assert (TREE_CODE (cond) == SSA_NAME
1830               || TREE_CODE_CLASS (TREE_CODE (cond)) == tcc_comparison);
1831
1832   if (TREE_CODE (cond) == SSA_NAME)
1833     {
1834       /* For SSA names, only return a truth value if the range is
1835          known and contains exactly one value.  */
1836       value_range *vr = SSA_NAME_VALUE_RANGE (cond);
1837       if (vr && vr->type == VR_RANGE && vr->min == vr->max)
1838         return vr->min;
1839     }
1840   else
1841     {
1842       /* For comparisons, evaluate each operand and compare their
1843          ranges.  */
1844       tree op0, op1;
1845       value_range *vr0, *vr1;
1846
1847       op0 = TREE_OPERAND (cond, 0);
1848       vr0 = (TREE_CODE (op0) == SSA_NAME) ? get_value_range (op0) : NULL;
1849
1850       op1 = TREE_OPERAND (cond, 1);
1851       vr1 = (TREE_CODE (op1) == SSA_NAME) ? get_value_range (op1) : NULL;
1852
1853       if (vr0 && vr1)
1854         return compare_ranges (TREE_CODE (cond), vr0, vr1);
1855       else if (vr0 && vr1 == NULL)
1856         return compare_range_with_value (TREE_CODE (cond), vr0, op1);
1857       else if (vr0 == NULL && vr1)
1858         return compare_range_with_value (opposite_comparison (TREE_CODE (cond)),
1859                                          vr1, op0);
1860     }
1861
1862   /* Anything else cannot be computed statically.  */
1863   return NULL_TREE;
1864 }
1865
1866
1867 /* Visit conditional statement STMT.  If we can determine which edge
1868    will be taken out of STMT's basic block, record it in
1869    *TAKEN_EDGE_P and return SSA_PROP_INTERESTING.  Otherwise, return
1870    SSA_PROP_VARYING.  */
1871
1872 static enum ssa_prop_result
1873 vrp_visit_cond_stmt (tree stmt, edge *taken_edge_p)
1874 {
1875   tree cond, val;
1876
1877   *taken_edge_p = NULL;
1878
1879   /* FIXME.  Handle SWITCH_EXPRs.  But first, the assert pass needs to
1880      add ASSERT_EXPRs for them.  */
1881   if (TREE_CODE (stmt) == SWITCH_EXPR)
1882     return SSA_PROP_VARYING;
1883
1884   cond = COND_EXPR_COND (stmt);
1885
1886   if (dump_file && (dump_flags & TDF_DETAILS))
1887     {
1888       tree use;
1889       ssa_op_iter i;
1890
1891       fprintf (dump_file, "\nVisiting conditional with predicate: ");
1892       print_generic_expr (dump_file, cond, 0);
1893       fprintf (dump_file, "\nWith known ranges\n");
1894       
1895       FOR_EACH_SSA_TREE_OPERAND (use, stmt, i, SSA_OP_USE)
1896         {
1897           fprintf (dump_file, "\t");
1898           print_generic_expr (dump_file, use, 0);
1899           fprintf (dump_file, ": ");
1900           dump_value_range (dump_file, SSA_NAME_VALUE_RANGE (use));
1901         }
1902
1903       fprintf (dump_file, "\n");
1904     }
1905
1906   /* Compute the value of the predicate COND by checking the known
1907      ranges of each of its operands.  */
1908   val = vrp_evaluate_conditional (cond);
1909   if (val)
1910     *taken_edge_p = find_taken_edge (bb_for_stmt (stmt), val);
1911
1912   if (dump_file && (dump_flags & TDF_DETAILS))
1913     {
1914       fprintf (dump_file, "\nPredicate evaluates to: ");
1915       if (val == NULL_TREE)
1916         fprintf (dump_file, "DON'T KNOW\n");
1917       else
1918         print_generic_stmt (dump_file, val, 0);
1919     }
1920
1921   return (*taken_edge_p) ? SSA_PROP_INTERESTING : SSA_PROP_VARYING;
1922 }
1923
1924
1925 /* Evaluate statement STMT.  If the statement produces a useful range,
1926    return SSA_PROP_INTERESTING and record the SSA name with the
1927    interesting range into *OUTPUT_P.
1928
1929    If STMT is a conditional branch and we can determine its truth
1930    value, the taken edge is recorded in *TAKEN_EDGE_P.
1931
1932    If STMT produces a varying value, return SSA_PROP_VARYING.  */
1933
1934 static enum ssa_prop_result
1935 vrp_visit_stmt (tree stmt, edge *taken_edge_p, tree *output_p)
1936 {
1937   tree def;
1938   ssa_op_iter iter;
1939   stmt_ann_t ann;
1940
1941   if (dump_file && (dump_flags & TDF_DETAILS))
1942     {
1943       fprintf (dump_file, "\nVisiting statement:\n");
1944       print_generic_stmt (dump_file, stmt, dump_flags);
1945       fprintf (dump_file, "\n");
1946     }
1947
1948   ann = stmt_ann (stmt);
1949   if (TREE_CODE (stmt) == MODIFY_EXPR
1950       && NUM_V_MAY_DEFS (V_MAY_DEF_OPS (ann)) == 0
1951       && NUM_VUSES (VUSE_OPS (ann)) == 0
1952       && NUM_V_MUST_DEFS (V_MUST_DEF_OPS (ann)) == 0)
1953     return vrp_visit_assignment (stmt, output_p);
1954   else if (TREE_CODE (stmt) == COND_EXPR || TREE_CODE (stmt) == SWITCH_EXPR)
1955     return vrp_visit_cond_stmt (stmt, taken_edge_p);
1956
1957   /* All other statements produce nothing of interest for VRP, so mark
1958      their outputs varying and prevent further simulation.  */
1959   FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF)
1960     set_value_range (get_value_range (def), VR_VARYING, 0, 0);
1961
1962   return SSA_PROP_VARYING;
1963 }
1964
1965
1966 /* Meet operation for value ranges.  Given two value ranges VR0 and
1967    VR1, store in VR0 the result of meeting VR0 and VR1.
1968    
1969    The meeting rules are as follows:
1970
1971    1- If VR0 and VR1 have an empty intersection, set VR0 to VR_VARYING.
1972
1973    2- If VR0 and VR1 have a non-empty intersection, set VR0 to the
1974       union of VR0 and VR1.  */
1975
1976 static void
1977 vrp_meet (value_range *vr0, value_range *vr1)
1978 {
1979   if (vr0->type == VR_UNDEFINED)
1980     {
1981       *vr0 = *vr1;
1982       return;
1983     }
1984
1985   if (vr1->type == VR_UNDEFINED)
1986     {
1987       /* Nothing to do.  VR0 already has the resulting range.  */
1988       return;
1989     }
1990
1991   if (vr0->type == VR_VARYING)
1992     {
1993       /* Nothing to do.  VR0 already has the resulting range.  */
1994       return;
1995     }
1996
1997   if (vr1->type == VR_VARYING)
1998     {
1999       *vr0 = *vr1;
2000       return;
2001     }
2002
2003   /* If either is a symbolic range, drop to VARYING.  */
2004   if (symbolic_range_p (vr0) || symbolic_range_p (vr1))
2005     {
2006       set_value_range (vr0, VR_VARYING, NULL_TREE, NULL_TREE);
2007       return;
2008     }
2009
2010   if (vr0->type == VR_RANGE && vr1->type == VR_RANGE)
2011     {
2012       /* If VR0 and VR1 have a non-empty intersection, compute the
2013          union of both ranges.  */
2014       if (value_ranges_intersect_p (vr0, vr1))
2015         {
2016           tree min, max;
2017
2018           min = vr0->min;
2019           max = vr0->max;
2020
2021           /* The lower limit of the new range is the minimum of the
2022              two ranges.  */
2023           if (compare_values (vr0->min, vr1->min) == 1)
2024             min = vr1->min;
2025
2026           /* The upper limit of the new range is the maximum of the
2027              two ranges.  */
2028           if (compare_values (vr0->max, vr1->max) == -1)
2029             max = vr1->max;
2030
2031           set_value_range (vr0, vr0->type, min, max);
2032         }
2033       else
2034         {
2035           /* The two ranges don't intersect, set the result to VR_VARYING.  */
2036           set_value_range (vr0, VR_VARYING, NULL_TREE, NULL_TREE);
2037         }
2038     }
2039   else if (vr0->type == VR_ANTI_RANGE && vr1->type == VR_ANTI_RANGE)
2040     {
2041       /* Two anti-ranges meet only if they are both identical.  */
2042       if (compare_values (vr0->min, vr1->min) == 0
2043           && compare_values (vr0->max, vr1->max) == 0
2044           && compare_values (vr0->min, vr0->max) == 0)
2045         /* Nothing to do.  */ ;
2046       else
2047         set_value_range (vr0, VR_VARYING, NULL_TREE, NULL_TREE);
2048     }
2049   else if (vr0->type == VR_ANTI_RANGE || vr1->type == VR_ANTI_RANGE)
2050     {
2051       /* A range [VAL1, VAL2] and an anti-range ~[VAL3, VAL4] meet
2052          only if the ranges have an empty intersection.  The result of
2053          the meet operation is the anti-range.  */
2054       if (!value_ranges_intersect_p (vr0, vr1))
2055         {
2056           if (vr1->type == VR_ANTI_RANGE)
2057             *vr0 = *vr1;
2058         }
2059       else
2060         set_value_range (vr0, VR_VARYING, NULL_TREE, NULL_TREE);
2061     }
2062   else
2063     gcc_unreachable ();
2064 }
2065
2066       
2067 /* Visit all arguments for PHI node PHI that flow through executable
2068    edges.  If a valid value range can be derived from all the incoming
2069    value ranges, set a new range for the LHS of PHI.  */
2070
2071 static enum ssa_prop_result
2072 vrp_visit_phi_node (tree phi)
2073 {
2074   int i;
2075   tree lhs = PHI_RESULT (phi);
2076   value_range *lhs_vr = get_value_range (lhs);
2077   value_range vr_result = *lhs_vr;
2078
2079   if (dump_file && (dump_flags & TDF_DETAILS))
2080     {
2081       fprintf (dump_file, "\nVisiting PHI node: ");
2082       print_generic_expr (dump_file, phi, dump_flags);
2083     }
2084
2085   for (i = 0; i < PHI_NUM_ARGS (phi); i++)
2086     {
2087       edge e = PHI_ARG_EDGE (phi, i);
2088
2089       if (dump_file && (dump_flags & TDF_DETAILS))
2090         {
2091           fprintf (dump_file,
2092               "\n    Argument #%d (%d -> %d %sexecutable)\n",
2093               i, e->src->index, e->dest->index,
2094               (e->flags & EDGE_EXECUTABLE) ? "" : "not ");
2095         }
2096
2097       if (e->flags & EDGE_EXECUTABLE)
2098         {
2099           tree arg = PHI_ARG_DEF (phi, i);
2100           value_range vr_arg;
2101
2102           if (TREE_CODE (arg) == SSA_NAME)
2103             vr_arg = *(get_value_range (arg));
2104           else
2105             {
2106               vr_arg.type = VR_RANGE;
2107               vr_arg.min = arg;
2108               vr_arg.max = arg;
2109             }
2110
2111           if (dump_file && (dump_flags & TDF_DETAILS))
2112             {
2113               fprintf (dump_file, "\t");
2114               print_generic_expr (dump_file, arg, dump_flags);
2115               fprintf (dump_file, "\n\tValue: ");
2116               dump_value_range (dump_file, &vr_arg);
2117               fprintf (dump_file, "\n");
2118             }
2119
2120           vrp_meet (&vr_result, &vr_arg);
2121
2122           if (vr_result.type == VR_VARYING)
2123             break;
2124         }
2125     }
2126
2127   if (vr_result.type == VR_VARYING)
2128     {
2129       set_value_range (lhs_vr, VR_VARYING, 0, 0);
2130       return SSA_PROP_VARYING;
2131     }
2132
2133   /* To prevent infinite iterations in the algorithm, derive ranges
2134      when the new value is slightly bigger or smaller than the
2135      previous one.  */
2136   if (lhs_vr->type == VR_RANGE)
2137     {
2138       if (!POINTER_TYPE_P (TREE_TYPE (lhs)))
2139         {
2140           int cmp_min = compare_values (lhs_vr->min, vr_result.min);
2141           int cmp_max = compare_values (lhs_vr->max, vr_result.max);
2142
2143           /* If the new minimum is smaller or larger than the previous
2144              one, go all the way to -INF.  In the first case, to avoid
2145              iterating millions of times to reach -INF, and in the
2146              other case to avoid infinite bouncing between different
2147              minimums.  */
2148           if (cmp_min > 0 || cmp_min < 0)
2149             vr_result.min = TYPE_MIN_VALUE (TREE_TYPE (vr_result.min));
2150
2151           /* Similarly, if the new maximum is smaller or larger than
2152              the previous one, go all the way to +INF.  */
2153           if (cmp_max < 0 || cmp_max > 0)
2154             vr_result.max = TYPE_MAX_VALUE (TREE_TYPE (vr_result.max));
2155
2156           /* If we ended up with a (-INF, +INF) range, set it to
2157              VARYING.  */
2158           if (vr_result.min == TYPE_MIN_VALUE (TREE_TYPE (vr_result.min))
2159               && vr_result.max == TYPE_MAX_VALUE (TREE_TYPE (vr_result.max)))
2160             {
2161               set_value_range (lhs_vr, VR_VARYING, 0, 0);
2162               return SSA_PROP_VARYING;
2163             }
2164         }
2165     }
2166
2167   /* If the new range is different than the previous value, keep
2168      iterating.  */
2169   if (update_value_range (lhs_vr, vr_result.type, vr_result.min, vr_result.max))
2170     return SSA_PROP_INTERESTING;
2171
2172   /* Nothing changed, don't add outgoing edges.  */
2173   return SSA_PROP_NOT_INTERESTING;
2174 }
2175
2176
2177 /* Traverse all the blocks folding conditionals with known ranges.  */
2178
2179 static void
2180 vrp_finalize (void)
2181 {
2182   basic_block bb;
2183   int num_pred_folded = 0;
2184
2185   if (dump_file)
2186     {
2187       fprintf (dump_file, "\nValue ranges after VRP:\n\n");
2188       dump_all_value_ranges (dump_file);
2189       fprintf (dump_file, "\n");
2190     }
2191
2192   FOR_EACH_BB (bb)
2193     {
2194       tree last = last_stmt (bb);
2195       if (last && TREE_CODE (last) == COND_EXPR)
2196         {
2197           tree val = vrp_evaluate_conditional (COND_EXPR_COND (last));
2198           if (val)
2199             {
2200               if (dump_file)
2201                 {
2202                   fprintf (dump_file, "Folding predicate ");
2203                   print_generic_expr (dump_file, COND_EXPR_COND (last), 0);
2204                   fprintf (dump_file, " to ");
2205                   print_generic_expr (dump_file, val, 0);
2206                   fprintf (dump_file, "\n");
2207                 }
2208
2209               num_pred_folded++;
2210               COND_EXPR_COND (last) = val;
2211               update_stmt (last);
2212             }
2213         }
2214     }
2215
2216   if (dump_file && (dump_flags & TDF_STATS))
2217     fprintf (dump_file, "\nNumber of predicates folded: %d\n\n",
2218              num_pred_folded);
2219 }
2220
2221
2222 /* Main entry point to VRP (Value Range Propagation).  This pass is
2223    loosely based on J. R. C. Patterson, ``Accurate Static Branch
2224    Prediction by Value Range Propagation,'' in SIGPLAN Conference on
2225    Programming Language Design and Implementation, pp. 67-78, 1995.
2226    Also available at http://citeseer.ist.psu.edu/patterson95accurate.html
2227
2228    This is essentially an SSA-CCP pass modified to deal with ranges
2229    instead of constants.
2230
2231    TODO, the main difference between this pass and Patterson's is that
2232    we do not propagate edge probabilities.  We only compute whether
2233    edges can be taken or not.  That is, instead of having a spectrum
2234    of jump probabilities between 0 and 1, we only deal with 0, 1 and
2235    DON'T KNOW.  In the future, it may be worthwhile to propagate
2236    probabilities to aid branch prediction.  */
2237
2238 static void
2239 execute_vrp (void)
2240 {
2241   insert_range_assertions ();
2242
2243   cfg_loops = loop_optimizer_init (NULL);
2244   if (cfg_loops)
2245     scev_initialize (cfg_loops);
2246
2247   if (vrp_initialize ())
2248     {
2249       ssa_propagate (vrp_visit_stmt, vrp_visit_phi_node);
2250       vrp_finalize ();
2251     }
2252
2253   if (cfg_loops)
2254     {
2255       scev_finalize ();
2256       loop_optimizer_finalize (cfg_loops, NULL);
2257       current_loops = NULL;
2258     }
2259
2260   remove_range_assertions ();
2261 }
2262
2263 static bool
2264 gate_vrp (void)
2265 {
2266   return flag_tree_vrp != 0;
2267 }
2268
2269 struct tree_opt_pass pass_vrp =
2270 {
2271   "vrp",                                /* name */
2272   gate_vrp,                             /* gate */
2273   execute_vrp,                          /* execute */
2274   NULL,                                 /* sub */
2275   NULL,                                 /* next */
2276   0,                                    /* static_pass_number */
2277   TV_TREE_VRP,                          /* tv_id */
2278   PROP_ssa | PROP_alias,                /* properties_required */
2279   0,                                    /* properties_provided */
2280   0,                                    /* properties_destroyed */
2281   0,                                    /* todo_flags_start */
2282   TODO_cleanup_cfg
2283     | TODO_ggc_collect
2284     | TODO_verify_ssa
2285     | TODO_dump_func
2286     | TODO_update_ssa,                  /* todo_flags_finish */
2287   0                                     /* letter */
2288 };