OpenCores
URL https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk

Subversion Repositories openrisc_2011-10-31

[/] [openrisc/] [trunk/] [gnu-src/] [gcc-4.5.1/] [gcc/] [tree-vrp.c] - Blame information for rev 454

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 280 jeremybenn
/* Support routines for Value Range Propagation (VRP).
2
   Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010
3
   Free Software Foundation, Inc.
4
   Contributed by Diego Novillo <dnovillo@redhat.com>.
5
 
6
This file is part of GCC.
7
 
8
GCC is free software; you can redistribute it and/or modify
9
it under the terms of the GNU General Public License as published by
10
the Free Software Foundation; either version 3, or (at your option)
11
any later version.
12
 
13
GCC is distributed in the hope that it will be useful,
14
but WITHOUT ANY WARRANTY; without even the implied warranty of
15
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
GNU General Public License for more details.
17
 
18
You should have received a copy of the GNU General Public License
19
along with GCC; see the file COPYING3.  If not see
20
<http://www.gnu.org/licenses/>.  */
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 "toplev.h"
36
#include "intl.h"
37
#include "cfgloop.h"
38
#include "tree-scalar-evolution.h"
39
#include "tree-ssa-propagate.h"
40
#include "tree-chrec.h"
41
 
42
 
43
/* Set of SSA names found live during the RPO traversal of the function
44
   for still active basic-blocks.  */
45
static sbitmap *live;
46
 
47
/* Return true if the SSA name NAME is live on the edge E.  */
48
 
49
static bool
50
live_on_edge (edge e, tree name)
51
{
52
  return (live[e->dest->index]
53
          && TEST_BIT (live[e->dest->index], SSA_NAME_VERSION (name)));
54
}
55
 
56
/* Local functions.  */
57
static int compare_values (tree val1, tree val2);
58
static int compare_values_warnv (tree val1, tree val2, bool *);
59
static void vrp_meet (value_range_t *, value_range_t *);
60
static tree vrp_evaluate_conditional_warnv_with_ops (enum tree_code,
61
                                                     tree, tree, bool, bool *,
62
                                                     bool *);
63
 
64
/* Location information for ASSERT_EXPRs.  Each instance of this
65
   structure describes an ASSERT_EXPR for an SSA name.  Since a single
66
   SSA name may have more than one assertion associated with it, these
67
   locations are kept in a linked list attached to the corresponding
68
   SSA name.  */
69
struct assert_locus_d
70
{
71
  /* Basic block where the assertion would be inserted.  */
72
  basic_block bb;
73
 
74
  /* Some assertions need to be inserted on an edge (e.g., assertions
75
     generated by COND_EXPRs).  In those cases, BB will be NULL.  */
76
  edge e;
77
 
78
  /* Pointer to the statement that generated this assertion.  */
79
  gimple_stmt_iterator si;
80
 
81
  /* Predicate code for the ASSERT_EXPR.  Must be COMPARISON_CLASS_P.  */
82
  enum tree_code comp_code;
83
 
84
  /* Value being compared against.  */
85
  tree val;
86
 
87
  /* Expression to compare.  */
88
  tree expr;
89
 
90
  /* Next node in the linked list.  */
91
  struct assert_locus_d *next;
92
};
93
 
94
typedef struct assert_locus_d *assert_locus_t;
95
 
96
/* If bit I is present, it means that SSA name N_i has a list of
97
   assertions that should be inserted in the IL.  */
98
static bitmap need_assert_for;
99
 
100
/* Array of locations lists where to insert assertions.  ASSERTS_FOR[I]
101
   holds a list of ASSERT_LOCUS_T nodes that describe where
102
   ASSERT_EXPRs for SSA name N_I should be inserted.  */
103
static assert_locus_t *asserts_for;
104
 
105
/* Value range array.  After propagation, VR_VALUE[I] holds the range
106
   of values that SSA name N_I may take.  */
107
static value_range_t **vr_value;
108
 
109
/* For a PHI node which sets SSA name N_I, VR_COUNTS[I] holds the
110
   number of executable edges we saw the last time we visited the
111
   node.  */
112
static int *vr_phi_edge_counts;
113
 
114
typedef struct {
115
  gimple stmt;
116
  tree vec;
117
} switch_update;
118
 
119
static VEC (edge, heap) *to_remove_edges;
120
DEF_VEC_O(switch_update);
121
DEF_VEC_ALLOC_O(switch_update, heap);
122
static VEC (switch_update, heap) *to_update_switch_stmts;
123
 
124
 
125
/* Return the maximum value for TYPE.  */
126
 
127
static inline tree
128
vrp_val_max (const_tree type)
129
{
130
  if (!INTEGRAL_TYPE_P (type))
131
    return NULL_TREE;
132
 
133
  return TYPE_MAX_VALUE (type);
134
}
135
 
136
/* Return the minimum value for TYPE.  */
137
 
138
static inline tree
139
vrp_val_min (const_tree type)
140
{
141
  if (!INTEGRAL_TYPE_P (type))
142
    return NULL_TREE;
143
 
144
  return TYPE_MIN_VALUE (type);
145
}
146
 
147
/* Return whether VAL is equal to the maximum value of its type.  This
148
   will be true for a positive overflow infinity.  We can't do a
149
   simple equality comparison with TYPE_MAX_VALUE because C typedefs
150
   and Ada subtypes can produce types whose TYPE_MAX_VALUE is not ==
151
   to the integer constant with the same value in the type.  */
152
 
153
static inline bool
154
vrp_val_is_max (const_tree val)
155
{
156
  tree type_max = vrp_val_max (TREE_TYPE (val));
157
  return (val == type_max
158
          || (type_max != NULL_TREE
159
              && operand_equal_p (val, type_max, 0)));
160
}
161
 
162
/* Return whether VAL is equal to the minimum value of its type.  This
163
   will be true for a negative overflow infinity.  */
164
 
165
static inline bool
166
vrp_val_is_min (const_tree val)
167
{
168
  tree type_min = vrp_val_min (TREE_TYPE (val));
169
  return (val == type_min
170
          || (type_min != NULL_TREE
171
              && operand_equal_p (val, type_min, 0)));
172
}
173
 
174
 
175
/* Return whether TYPE should use an overflow infinity distinct from
176
   TYPE_{MIN,MAX}_VALUE.  We use an overflow infinity value to
177
   represent a signed overflow during VRP computations.  An infinity
178
   is distinct from a half-range, which will go from some number to
179
   TYPE_{MIN,MAX}_VALUE.  */
180
 
181
static inline bool
182
needs_overflow_infinity (const_tree type)
183
{
184
  return INTEGRAL_TYPE_P (type) && !TYPE_OVERFLOW_WRAPS (type);
185
}
186
 
187
/* Return whether TYPE can support our overflow infinity
188
   representation: we use the TREE_OVERFLOW flag, which only exists
189
   for constants.  If TYPE doesn't support this, we don't optimize
190
   cases which would require signed overflow--we drop them to
191
   VARYING.  */
192
 
193
static inline bool
194
supports_overflow_infinity (const_tree type)
195
{
196
  tree min = vrp_val_min (type), max = vrp_val_max (type);
197
#ifdef ENABLE_CHECKING
198
  gcc_assert (needs_overflow_infinity (type));
199
#endif
200
  return (min != NULL_TREE
201
          && CONSTANT_CLASS_P (min)
202
          && max != NULL_TREE
203
          && CONSTANT_CLASS_P (max));
204
}
205
 
206
/* VAL is the maximum or minimum value of a type.  Return a
207
   corresponding overflow infinity.  */
208
 
209
static inline tree
210
make_overflow_infinity (tree val)
211
{
212
#ifdef ENABLE_CHECKING
213
  gcc_assert (val != NULL_TREE && CONSTANT_CLASS_P (val));
214
#endif
215
  val = copy_node (val);
216
  TREE_OVERFLOW (val) = 1;
217
  return val;
218
}
219
 
220
/* Return a negative overflow infinity for TYPE.  */
221
 
222
static inline tree
223
negative_overflow_infinity (tree type)
224
{
225
#ifdef ENABLE_CHECKING
226
  gcc_assert (supports_overflow_infinity (type));
227
#endif
228
  return make_overflow_infinity (vrp_val_min (type));
229
}
230
 
231
/* Return a positive overflow infinity for TYPE.  */
232
 
233
static inline tree
234
positive_overflow_infinity (tree type)
235
{
236
#ifdef ENABLE_CHECKING
237
  gcc_assert (supports_overflow_infinity (type));
238
#endif
239
  return make_overflow_infinity (vrp_val_max (type));
240
}
241
 
242
/* Return whether VAL is a negative overflow infinity.  */
243
 
244
static inline bool
245
is_negative_overflow_infinity (const_tree val)
246
{
247
  return (needs_overflow_infinity (TREE_TYPE (val))
248
          && CONSTANT_CLASS_P (val)
249
          && TREE_OVERFLOW (val)
250
          && vrp_val_is_min (val));
251
}
252
 
253
/* Return whether VAL is a positive overflow infinity.  */
254
 
255
static inline bool
256
is_positive_overflow_infinity (const_tree val)
257
{
258
  return (needs_overflow_infinity (TREE_TYPE (val))
259
          && CONSTANT_CLASS_P (val)
260
          && TREE_OVERFLOW (val)
261
          && vrp_val_is_max (val));
262
}
263
 
264
/* Return whether VAL is a positive or negative overflow infinity.  */
265
 
266
static inline bool
267
is_overflow_infinity (const_tree val)
268
{
269
  return (needs_overflow_infinity (TREE_TYPE (val))
270
          && CONSTANT_CLASS_P (val)
271
          && TREE_OVERFLOW (val)
272
          && (vrp_val_is_min (val) || vrp_val_is_max (val)));
273
}
274
 
275
/* Return whether STMT has a constant rhs that is_overflow_infinity. */
276
 
277
static inline bool
278
stmt_overflow_infinity (gimple stmt)
279
{
280
  if (is_gimple_assign (stmt)
281
      && get_gimple_rhs_class (gimple_assign_rhs_code (stmt)) ==
282
      GIMPLE_SINGLE_RHS)
283
    return is_overflow_infinity (gimple_assign_rhs1 (stmt));
284
  return false;
285
}
286
 
287
/* If VAL is now an overflow infinity, return VAL.  Otherwise, return
288
   the same value with TREE_OVERFLOW clear.  This can be used to avoid
289
   confusing a regular value with an overflow value.  */
290
 
291
static inline tree
292
avoid_overflow_infinity (tree val)
293
{
294
  if (!is_overflow_infinity (val))
295
    return val;
296
 
297
  if (vrp_val_is_max (val))
298
    return vrp_val_max (TREE_TYPE (val));
299
  else
300
    {
301
#ifdef ENABLE_CHECKING
302
      gcc_assert (vrp_val_is_min (val));
303
#endif
304
      return vrp_val_min (TREE_TYPE (val));
305
    }
306
}
307
 
308
 
309
/* Return true if ARG is marked with the nonnull attribute in the
310
   current function signature.  */
311
 
312
static bool
313
nonnull_arg_p (const_tree arg)
314
{
315
  tree t, attrs, fntype;
316
  unsigned HOST_WIDE_INT arg_num;
317
 
318
  gcc_assert (TREE_CODE (arg) == PARM_DECL && POINTER_TYPE_P (TREE_TYPE (arg)));
319
 
320
  /* The static chain decl is always non null.  */
321
  if (arg == cfun->static_chain_decl)
322
    return true;
323
 
324
  fntype = TREE_TYPE (current_function_decl);
325
  attrs = lookup_attribute ("nonnull", TYPE_ATTRIBUTES (fntype));
326
 
327
  /* If "nonnull" wasn't specified, we know nothing about the argument.  */
328
  if (attrs == NULL_TREE)
329
    return false;
330
 
331
  /* If "nonnull" applies to all the arguments, then ARG is non-null.  */
332
  if (TREE_VALUE (attrs) == NULL_TREE)
333
    return true;
334
 
335
  /* Get the position number for ARG in the function signature.  */
336
  for (arg_num = 1, t = DECL_ARGUMENTS (current_function_decl);
337
       t;
338
       t = TREE_CHAIN (t), arg_num++)
339
    {
340
      if (t == arg)
341
        break;
342
    }
343
 
344
  gcc_assert (t == arg);
345
 
346
  /* Now see if ARG_NUM is mentioned in the nonnull list.  */
347
  for (t = TREE_VALUE (attrs); t; t = TREE_CHAIN (t))
348
    {
349
      if (compare_tree_int (TREE_VALUE (t), arg_num) == 0)
350
        return true;
351
    }
352
 
353
  return false;
354
}
355
 
356
 
357
/* Set value range VR to VR_VARYING.  */
358
 
359
static inline void
360
set_value_range_to_varying (value_range_t *vr)
361
{
362
  vr->type = VR_VARYING;
363
  vr->min = vr->max = NULL_TREE;
364
  if (vr->equiv)
365
    bitmap_clear (vr->equiv);
366
}
367
 
368
 
369
/* Set value range VR to {T, MIN, MAX, EQUIV}.  */
370
 
371
static void
372
set_value_range (value_range_t *vr, enum value_range_type t, tree min,
373
                 tree max, bitmap equiv)
374
{
375
#if defined ENABLE_CHECKING
376
  /* Check the validity of the range.  */
377
  if (t == VR_RANGE || t == VR_ANTI_RANGE)
378
    {
379
      int cmp;
380
 
381
      gcc_assert (min && max);
382
 
383
      if (INTEGRAL_TYPE_P (TREE_TYPE (min)) && t == VR_ANTI_RANGE)
384
        gcc_assert (!vrp_val_is_min (min) || !vrp_val_is_max (max));
385
 
386
      cmp = compare_values (min, max);
387
      gcc_assert (cmp == 0 || cmp == -1 || cmp == -2);
388
 
389
      if (needs_overflow_infinity (TREE_TYPE (min)))
390
        gcc_assert (!is_overflow_infinity (min)
391
                    || !is_overflow_infinity (max));
392
    }
393
 
394
  if (t == VR_UNDEFINED || t == VR_VARYING)
395
    gcc_assert (min == NULL_TREE && max == NULL_TREE);
396
 
397
  if (t == VR_UNDEFINED || t == VR_VARYING)
398
    gcc_assert (equiv == NULL || bitmap_empty_p (equiv));
399
#endif
400
 
401
  vr->type = t;
402
  vr->min = min;
403
  vr->max = max;
404
 
405
  /* Since updating the equivalence set involves deep copying the
406
     bitmaps, only do it if absolutely necessary.  */
407
  if (vr->equiv == NULL
408
      && equiv != NULL)
409
    vr->equiv = BITMAP_ALLOC (NULL);
410
 
411
  if (equiv != vr->equiv)
412
    {
413
      if (equiv && !bitmap_empty_p (equiv))
414
        bitmap_copy (vr->equiv, equiv);
415
      else
416
        bitmap_clear (vr->equiv);
417
    }
418
}
419
 
420
 
421
/* Set value range VR to the canonical form of {T, MIN, MAX, EQUIV}.
422
   This means adjusting T, MIN and MAX representing the case of a
423
   wrapping range with MAX < MIN covering [MIN, type_max] U [type_min, MAX]
424
   as anti-rage ~[MAX+1, MIN-1].  Likewise for wrapping anti-ranges.
425
   In corner cases where MAX+1 or MIN-1 wraps this will fall back
426
   to varying.
427
   This routine exists to ease canonicalization in the case where we
428
   extract ranges from var + CST op limit.  */
429
 
430
static void
431
set_and_canonicalize_value_range (value_range_t *vr, enum value_range_type t,
432
                                  tree min, tree max, bitmap equiv)
433
{
434
  /* Nothing to canonicalize for symbolic or unknown or varying ranges.  */
435
  if ((t != VR_RANGE
436
       && t != VR_ANTI_RANGE)
437
      || TREE_CODE (min) != INTEGER_CST
438
      || TREE_CODE (max) != INTEGER_CST)
439
    {
440
      set_value_range (vr, t, min, max, equiv);
441
      return;
442
    }
443
 
444
  /* Wrong order for min and max, to swap them and the VR type we need
445
     to adjust them.  */
446
  if (tree_int_cst_lt (max, min))
447
    {
448
      tree one = build_int_cst (TREE_TYPE (min), 1);
449
      tree tmp = int_const_binop (PLUS_EXPR, max, one, 0);
450
      max = int_const_binop (MINUS_EXPR, min, one, 0);
451
      min = tmp;
452
 
453
      /* There's one corner case, if we had [C+1, C] before we now have
454
         that again.  But this represents an empty value range, so drop
455
         to varying in this case.  */
456
      if (tree_int_cst_lt (max, min))
457
        {
458
          set_value_range_to_varying (vr);
459
          return;
460
        }
461
 
462
      t = t == VR_RANGE ? VR_ANTI_RANGE : VR_RANGE;
463
    }
464
 
465
  /* Anti-ranges that can be represented as ranges should be so.  */
466
  if (t == VR_ANTI_RANGE)
467
    {
468
      bool is_min = vrp_val_is_min (min);
469
      bool is_max = vrp_val_is_max (max);
470
 
471
      if (is_min && is_max)
472
        {
473
          /* We cannot deal with empty ranges, drop to varying.  */
474
          set_value_range_to_varying (vr);
475
          return;
476
        }
477
      else if (is_min
478
               /* As a special exception preserve non-null ranges.  */
479
               && !(TYPE_UNSIGNED (TREE_TYPE (min))
480
                    && integer_zerop (max)))
481
        {
482
          tree one = build_int_cst (TREE_TYPE (max), 1);
483
          min = int_const_binop (PLUS_EXPR, max, one, 0);
484
          max = vrp_val_max (TREE_TYPE (max));
485
          t = VR_RANGE;
486
        }
487
      else if (is_max)
488
        {
489
          tree one = build_int_cst (TREE_TYPE (min), 1);
490
          max = int_const_binop (MINUS_EXPR, min, one, 0);
491
          min = vrp_val_min (TREE_TYPE (min));
492
          t = VR_RANGE;
493
        }
494
    }
495
 
496
  set_value_range (vr, t, min, max, equiv);
497
}
498
 
499
/* Copy value range FROM into value range TO.  */
500
 
501
static inline void
502
copy_value_range (value_range_t *to, value_range_t *from)
503
{
504
  set_value_range (to, from->type, from->min, from->max, from->equiv);
505
}
506
 
507
/* Set value range VR to a single value.  This function is only called
508
   with values we get from statements, and exists to clear the
509
   TREE_OVERFLOW flag so that we don't think we have an overflow
510
   infinity when we shouldn't.  */
511
 
512
static inline void
513
set_value_range_to_value (value_range_t *vr, tree val, bitmap equiv)
514
{
515
  gcc_assert (is_gimple_min_invariant (val));
516
  val = avoid_overflow_infinity (val);
517
  set_value_range (vr, VR_RANGE, val, val, equiv);
518
}
519
 
520
/* Set value range VR to a non-negative range of type TYPE.
521
   OVERFLOW_INFINITY indicates whether to use an overflow infinity
522
   rather than TYPE_MAX_VALUE; this should be true if we determine
523
   that the range is nonnegative based on the assumption that signed
524
   overflow does not occur.  */
525
 
526
static inline void
527
set_value_range_to_nonnegative (value_range_t *vr, tree type,
528
                                bool overflow_infinity)
529
{
530
  tree zero;
531
 
532
  if (overflow_infinity && !supports_overflow_infinity (type))
533
    {
534
      set_value_range_to_varying (vr);
535
      return;
536
    }
537
 
538
  zero = build_int_cst (type, 0);
539
  set_value_range (vr, VR_RANGE, zero,
540
                   (overflow_infinity
541
                    ? positive_overflow_infinity (type)
542
                    : TYPE_MAX_VALUE (type)),
543
                   vr->equiv);
544
}
545
 
546
/* Set value range VR to a non-NULL range of type TYPE.  */
547
 
548
static inline void
549
set_value_range_to_nonnull (value_range_t *vr, tree type)
550
{
551
  tree zero = build_int_cst (type, 0);
552
  set_value_range (vr, VR_ANTI_RANGE, zero, zero, vr->equiv);
553
}
554
 
555
 
556
/* Set value range VR to a NULL range of type TYPE.  */
557
 
558
static inline void
559
set_value_range_to_null (value_range_t *vr, tree type)
560
{
561
  set_value_range_to_value (vr, build_int_cst (type, 0), vr->equiv);
562
}
563
 
564
 
565
/* Set value range VR to a range of a truthvalue of type TYPE.  */
566
 
567
static inline void
568
set_value_range_to_truthvalue (value_range_t *vr, tree type)
569
{
570
  if (TYPE_PRECISION (type) == 1)
571
    set_value_range_to_varying (vr);
572
  else
573
    set_value_range (vr, VR_RANGE,
574
                     build_int_cst (type, 0), build_int_cst (type, 1),
575
                     vr->equiv);
576
}
577
 
578
 
579
/* Set value range VR to VR_UNDEFINED.  */
580
 
581
static inline void
582
set_value_range_to_undefined (value_range_t *vr)
583
{
584
  vr->type = VR_UNDEFINED;
585
  vr->min = vr->max = NULL_TREE;
586
  if (vr->equiv)
587
    bitmap_clear (vr->equiv);
588
}
589
 
590
 
591
/* If abs (min) < abs (max), set VR to [-max, max], if
592
   abs (min) >= abs (max), set VR to [-min, min].  */
593
 
594
static void
595
abs_extent_range (value_range_t *vr, tree min, tree max)
596
{
597
  int cmp;
598
 
599
  gcc_assert (TREE_CODE (min) == INTEGER_CST);
600
  gcc_assert (TREE_CODE (max) == INTEGER_CST);
601
  gcc_assert (INTEGRAL_TYPE_P (TREE_TYPE (min)));
602
  gcc_assert (!TYPE_UNSIGNED (TREE_TYPE (min)));
603
  min = fold_unary (ABS_EXPR, TREE_TYPE (min), min);
604
  max = fold_unary (ABS_EXPR, TREE_TYPE (max), max);
605
  if (TREE_OVERFLOW (min) || TREE_OVERFLOW (max))
606
    {
607
      set_value_range_to_varying (vr);
608
      return;
609
    }
610
  cmp = compare_values (min, max);
611
  if (cmp == -1)
612
    min = fold_unary (NEGATE_EXPR, TREE_TYPE (min), max);
613
  else if (cmp == 0 || cmp == 1)
614
    {
615
      max = min;
616
      min = fold_unary (NEGATE_EXPR, TREE_TYPE (min), min);
617
    }
618
  else
619
    {
620
      set_value_range_to_varying (vr);
621
      return;
622
    }
623
  set_and_canonicalize_value_range (vr, VR_RANGE, min, max, NULL);
624
}
625
 
626
 
627
/* Return value range information for VAR.
628
 
629
   If we have no values ranges recorded (ie, VRP is not running), then
630
   return NULL.  Otherwise create an empty range if none existed for VAR.  */
631
 
632
static value_range_t *
633
get_value_range (const_tree var)
634
{
635
  value_range_t *vr;
636
  tree sym;
637
  unsigned ver = SSA_NAME_VERSION (var);
638
 
639
  /* If we have no recorded ranges, then return NULL.  */
640
  if (! vr_value)
641
    return NULL;
642
 
643
  vr = vr_value[ver];
644
  if (vr)
645
    return vr;
646
 
647
  /* Create a default value range.  */
648
  vr_value[ver] = vr = XCNEW (value_range_t);
649
 
650
  /* Defer allocating the equivalence set.  */
651
  vr->equiv = NULL;
652
 
653
  /* If VAR is a default definition, the variable can take any value
654
     in VAR's type.  */
655
  sym = SSA_NAME_VAR (var);
656
  if (SSA_NAME_IS_DEFAULT_DEF (var))
657
    {
658
      /* Try to use the "nonnull" attribute to create ~[0, 0]
659
         anti-ranges for pointers.  Note that this is only valid with
660
         default definitions of PARM_DECLs.  */
661
      if (TREE_CODE (sym) == PARM_DECL
662
          && POINTER_TYPE_P (TREE_TYPE (sym))
663
          && nonnull_arg_p (sym))
664
        set_value_range_to_nonnull (vr, TREE_TYPE (sym));
665
      else
666
        set_value_range_to_varying (vr);
667
    }
668
 
669
  return vr;
670
}
671
 
672
/* Return true, if VAL1 and VAL2 are equal values for VRP purposes.  */
673
 
674
static inline bool
675
vrp_operand_equal_p (const_tree val1, const_tree val2)
676
{
677
  if (val1 == val2)
678
    return true;
679
  if (!val1 || !val2 || !operand_equal_p (val1, val2, 0))
680
    return false;
681
  if (is_overflow_infinity (val1))
682
    return is_overflow_infinity (val2);
683
  return true;
684
}
685
 
686
/* Return true, if the bitmaps B1 and B2 are equal.  */
687
 
688
static inline bool
689
vrp_bitmap_equal_p (const_bitmap b1, const_bitmap b2)
690
{
691
  return (b1 == b2
692
          || (b1 && b2
693
              && bitmap_equal_p (b1, b2)));
694
}
695
 
696
/* Update the value range and equivalence set for variable VAR to
697
   NEW_VR.  Return true if NEW_VR is different from VAR's previous
698
   value.
699
 
700
   NOTE: This function assumes that NEW_VR is a temporary value range
701
   object created for the sole purpose of updating VAR's range.  The
702
   storage used by the equivalence set from NEW_VR will be freed by
703
   this function.  Do not call update_value_range when NEW_VR
704
   is the range object associated with another SSA name.  */
705
 
706
static inline bool
707
update_value_range (const_tree var, value_range_t *new_vr)
708
{
709
  value_range_t *old_vr;
710
  bool is_new;
711
 
712
  /* Update the value range, if necessary.  */
713
  old_vr = get_value_range (var);
714
  is_new = old_vr->type != new_vr->type
715
           || !vrp_operand_equal_p (old_vr->min, new_vr->min)
716
           || !vrp_operand_equal_p (old_vr->max, new_vr->max)
717
           || !vrp_bitmap_equal_p (old_vr->equiv, new_vr->equiv);
718
 
719
  if (is_new)
720
    set_value_range (old_vr, new_vr->type, new_vr->min, new_vr->max,
721
                     new_vr->equiv);
722
 
723
  BITMAP_FREE (new_vr->equiv);
724
 
725
  return is_new;
726
}
727
 
728
 
729
/* Add VAR and VAR's equivalence set to EQUIV.  This is the central
730
   point where equivalence processing can be turned on/off.  */
731
 
732
static void
733
add_equivalence (bitmap *equiv, const_tree var)
734
{
735
  unsigned ver = SSA_NAME_VERSION (var);
736
  value_range_t *vr = vr_value[ver];
737
 
738
  if (*equiv == NULL)
739
    *equiv = BITMAP_ALLOC (NULL);
740
  bitmap_set_bit (*equiv, ver);
741
  if (vr && vr->equiv)
742
    bitmap_ior_into (*equiv, vr->equiv);
743
}
744
 
745
 
746
/* Return true if VR is ~[0, 0].  */
747
 
748
static inline bool
749
range_is_nonnull (value_range_t *vr)
750
{
751
  return vr->type == VR_ANTI_RANGE
752
         && integer_zerop (vr->min)
753
         && integer_zerop (vr->max);
754
}
755
 
756
 
757
/* Return true if VR is [0, 0].  */
758
 
759
static inline bool
760
range_is_null (value_range_t *vr)
761
{
762
  return vr->type == VR_RANGE
763
         && integer_zerop (vr->min)
764
         && integer_zerop (vr->max);
765
}
766
 
767
/* Return true if max and min of VR are INTEGER_CST.  It's not necessary
768
   a singleton.  */
769
 
770
static inline bool
771
range_int_cst_p (value_range_t *vr)
772
{
773
  return (vr->type == VR_RANGE
774
          && TREE_CODE (vr->max) == INTEGER_CST
775
          && TREE_CODE (vr->min) == INTEGER_CST
776
          && !TREE_OVERFLOW (vr->max)
777
          && !TREE_OVERFLOW (vr->min));
778
}
779
 
780
/* Return true if VR is a INTEGER_CST singleton.  */
781
 
782
static inline bool
783
range_int_cst_singleton_p (value_range_t *vr)
784
{
785
  return (range_int_cst_p (vr)
786
          && tree_int_cst_equal (vr->min, vr->max));
787
}
788
 
789
/* Return true if value range VR involves at least one symbol.  */
790
 
791
static inline bool
792
symbolic_range_p (value_range_t *vr)
793
{
794
  return (!is_gimple_min_invariant (vr->min)
795
          || !is_gimple_min_invariant (vr->max));
796
}
797
 
798
/* Return true if value range VR uses an overflow infinity.  */
799
 
800
static inline bool
801
overflow_infinity_range_p (value_range_t *vr)
802
{
803
  return (vr->type == VR_RANGE
804
          && (is_overflow_infinity (vr->min)
805
              || is_overflow_infinity (vr->max)));
806
}
807
 
808
/* Return false if we can not make a valid comparison based on VR;
809
   this will be the case if it uses an overflow infinity and overflow
810
   is not undefined (i.e., -fno-strict-overflow is in effect).
811
   Otherwise return true, and set *STRICT_OVERFLOW_P to true if VR
812
   uses an overflow infinity.  */
813
 
814
static bool
815
usable_range_p (value_range_t *vr, bool *strict_overflow_p)
816
{
817
  gcc_assert (vr->type == VR_RANGE);
818
  if (is_overflow_infinity (vr->min))
819
    {
820
      *strict_overflow_p = true;
821
      if (!TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (vr->min)))
822
        return false;
823
    }
824
  if (is_overflow_infinity (vr->max))
825
    {
826
      *strict_overflow_p = true;
827
      if (!TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (vr->max)))
828
        return false;
829
    }
830
  return true;
831
}
832
 
833
 
834
/* Like tree_expr_nonnegative_warnv_p, but this function uses value
835
   ranges obtained so far.  */
836
 
837
static bool
838
vrp_expr_computes_nonnegative (tree expr, bool *strict_overflow_p)
839
{
840
  return (tree_expr_nonnegative_warnv_p (expr, strict_overflow_p)
841
          || (TREE_CODE (expr) == SSA_NAME
842
              && ssa_name_nonnegative_p (expr)));
843
}
844
 
845
/* Return true if the result of assignment STMT is know to be non-negative.
846
   If the return value is based on the assumption that signed overflow is
847
   undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't change
848
   *STRICT_OVERFLOW_P.*/
849
 
850
static bool
851
gimple_assign_nonnegative_warnv_p (gimple stmt, bool *strict_overflow_p)
852
{
853
  enum tree_code code = gimple_assign_rhs_code (stmt);
854
  switch (get_gimple_rhs_class (code))
855
    {
856
    case GIMPLE_UNARY_RHS:
857
      return tree_unary_nonnegative_warnv_p (gimple_assign_rhs_code (stmt),
858
                                             gimple_expr_type (stmt),
859
                                             gimple_assign_rhs1 (stmt),
860
                                             strict_overflow_p);
861
    case GIMPLE_BINARY_RHS:
862
      return tree_binary_nonnegative_warnv_p (gimple_assign_rhs_code (stmt),
863
                                              gimple_expr_type (stmt),
864
                                              gimple_assign_rhs1 (stmt),
865
                                              gimple_assign_rhs2 (stmt),
866
                                              strict_overflow_p);
867
    case GIMPLE_SINGLE_RHS:
868
      return tree_single_nonnegative_warnv_p (gimple_assign_rhs1 (stmt),
869
                                              strict_overflow_p);
870
    case GIMPLE_INVALID_RHS:
871
      gcc_unreachable ();
872
    default:
873
      gcc_unreachable ();
874
    }
875
}
876
 
877
/* Return true if return value of call STMT is know to be non-negative.
878
   If the return value is based on the assumption that signed overflow is
879
   undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't change
880
   *STRICT_OVERFLOW_P.*/
881
 
882
static bool
883
gimple_call_nonnegative_warnv_p (gimple stmt, bool *strict_overflow_p)
884
{
885
  tree arg0 = gimple_call_num_args (stmt) > 0 ?
886
    gimple_call_arg (stmt, 0) : NULL_TREE;
887
  tree arg1 = gimple_call_num_args (stmt) > 1 ?
888
    gimple_call_arg (stmt, 1) : NULL_TREE;
889
 
890
  return tree_call_nonnegative_warnv_p (gimple_expr_type (stmt),
891
                                        gimple_call_fndecl (stmt),
892
                                        arg0,
893
                                        arg1,
894
                                        strict_overflow_p);
895
}
896
 
897
/* Return true if STMT is know to to compute a non-negative value.
898
   If the return value is based on the assumption that signed overflow is
899
   undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't change
900
   *STRICT_OVERFLOW_P.*/
901
 
902
static bool
903
gimple_stmt_nonnegative_warnv_p (gimple stmt, bool *strict_overflow_p)
904
{
905
  switch (gimple_code (stmt))
906
    {
907
    case GIMPLE_ASSIGN:
908
      return gimple_assign_nonnegative_warnv_p (stmt, strict_overflow_p);
909
    case GIMPLE_CALL:
910
      return gimple_call_nonnegative_warnv_p (stmt, strict_overflow_p);
911
    default:
912
      gcc_unreachable ();
913
    }
914
}
915
 
916
/* Return true if the result of assignment STMT is know to be non-zero.
917
   If the return value is based on the assumption that signed overflow is
918
   undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't change
919
   *STRICT_OVERFLOW_P.*/
920
 
921
static bool
922
gimple_assign_nonzero_warnv_p (gimple stmt, bool *strict_overflow_p)
923
{
924
  enum tree_code code = gimple_assign_rhs_code (stmt);
925
  switch (get_gimple_rhs_class (code))
926
    {
927
    case GIMPLE_UNARY_RHS:
928
      return tree_unary_nonzero_warnv_p (gimple_assign_rhs_code (stmt),
929
                                         gimple_expr_type (stmt),
930
                                         gimple_assign_rhs1 (stmt),
931
                                         strict_overflow_p);
932
    case GIMPLE_BINARY_RHS:
933
      return tree_binary_nonzero_warnv_p (gimple_assign_rhs_code (stmt),
934
                                          gimple_expr_type (stmt),
935
                                          gimple_assign_rhs1 (stmt),
936
                                          gimple_assign_rhs2 (stmt),
937
                                          strict_overflow_p);
938
    case GIMPLE_SINGLE_RHS:
939
      return tree_single_nonzero_warnv_p (gimple_assign_rhs1 (stmt),
940
                                          strict_overflow_p);
941
    case GIMPLE_INVALID_RHS:
942
      gcc_unreachable ();
943
    default:
944
      gcc_unreachable ();
945
    }
946
}
947
 
948
/* Return true if STMT is know to to compute a non-zero value.
949
   If the return value is based on the assumption that signed overflow is
950
   undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't change
951
   *STRICT_OVERFLOW_P.*/
952
 
953
static bool
954
gimple_stmt_nonzero_warnv_p (gimple stmt, bool *strict_overflow_p)
955
{
956
  switch (gimple_code (stmt))
957
    {
958
    case GIMPLE_ASSIGN:
959
      return gimple_assign_nonzero_warnv_p (stmt, strict_overflow_p);
960
    case GIMPLE_CALL:
961
      return gimple_alloca_call_p (stmt);
962
    default:
963
      gcc_unreachable ();
964
    }
965
}
966
 
967
/* Like tree_expr_nonzero_warnv_p, but this function uses value ranges
968
   obtained so far.  */
969
 
970
static bool
971
vrp_stmt_computes_nonzero (gimple stmt, bool *strict_overflow_p)
972
{
973
  if (gimple_stmt_nonzero_warnv_p (stmt, strict_overflow_p))
974
    return true;
975
 
976
  /* If we have an expression of the form &X->a, then the expression
977
     is nonnull if X is nonnull.  */
978
  if (is_gimple_assign (stmt)
979
      && gimple_assign_rhs_code (stmt) == ADDR_EXPR)
980
    {
981
      tree expr = gimple_assign_rhs1 (stmt);
982
      tree base = get_base_address (TREE_OPERAND (expr, 0));
983
 
984
      if (base != NULL_TREE
985
          && TREE_CODE (base) == INDIRECT_REF
986
          && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME)
987
        {
988
          value_range_t *vr = get_value_range (TREE_OPERAND (base, 0));
989
          if (range_is_nonnull (vr))
990
            return true;
991
        }
992
    }
993
 
994
  return false;
995
}
996
 
997
/* Returns true if EXPR is a valid value (as expected by compare_values) --
998
   a gimple invariant, or SSA_NAME +- CST.  */
999
 
1000
static bool
1001
valid_value_p (tree expr)
1002
{
1003
  if (TREE_CODE (expr) == SSA_NAME)
1004
    return true;
1005
 
1006
  if (TREE_CODE (expr) == PLUS_EXPR
1007
      || TREE_CODE (expr) == MINUS_EXPR)
1008
    return (TREE_CODE (TREE_OPERAND (expr, 0)) == SSA_NAME
1009
            && TREE_CODE (TREE_OPERAND (expr, 1)) == INTEGER_CST);
1010
 
1011
  return is_gimple_min_invariant (expr);
1012
}
1013
 
1014
/* Return
1015
   1 if VAL < VAL2
1016
 
1017
   -2 if those are incomparable.  */
1018
static inline int
1019
operand_less_p (tree val, tree val2)
1020
{
1021
  /* LT is folded faster than GE and others.  Inline the common case.  */
1022
  if (TREE_CODE (val) == INTEGER_CST && TREE_CODE (val2) == INTEGER_CST)
1023
    {
1024
      if (TYPE_UNSIGNED (TREE_TYPE (val)))
1025
        return INT_CST_LT_UNSIGNED (val, val2);
1026
      else
1027
        {
1028
          if (INT_CST_LT (val, val2))
1029
            return 1;
1030
        }
1031
    }
1032
  else
1033
    {
1034
      tree tcmp;
1035
 
1036
      fold_defer_overflow_warnings ();
1037
 
1038
      tcmp = fold_binary_to_constant (LT_EXPR, boolean_type_node, val, val2);
1039
 
1040
      fold_undefer_and_ignore_overflow_warnings ();
1041
 
1042
      if (!tcmp
1043
          || TREE_CODE (tcmp) != INTEGER_CST)
1044
        return -2;
1045
 
1046
      if (!integer_zerop (tcmp))
1047
        return 1;
1048
    }
1049
 
1050
  /* val >= val2, not considering overflow infinity.  */
1051
  if (is_negative_overflow_infinity (val))
1052
    return is_negative_overflow_infinity (val2) ? 0 : 1;
1053
  else if (is_positive_overflow_infinity (val2))
1054
    return is_positive_overflow_infinity (val) ? 0 : 1;
1055
 
1056
  return 0;
1057
}
1058
 
1059
/* Compare two values VAL1 and VAL2.  Return
1060
 
1061
        -2 if VAL1 and VAL2 cannot be compared at compile-time,
1062
        -1 if VAL1 < VAL2,
1063
 
1064
        +1 if VAL1 > VAL2, and
1065
        +2 if VAL1 != VAL2
1066
 
1067
   This is similar to tree_int_cst_compare but supports pointer values
1068
   and values that cannot be compared at compile time.
1069
 
1070
   If STRICT_OVERFLOW_P is not NULL, then set *STRICT_OVERFLOW_P to
1071
   true if the return value is only valid if we assume that signed
1072
   overflow is undefined.  */
1073
 
1074
static int
1075
compare_values_warnv (tree val1, tree val2, bool *strict_overflow_p)
1076
{
1077
  if (val1 == val2)
1078
    return 0;
1079
 
1080
  /* Below we rely on the fact that VAL1 and VAL2 are both pointers or
1081
     both integers.  */
1082
  gcc_assert (POINTER_TYPE_P (TREE_TYPE (val1))
1083
              == POINTER_TYPE_P (TREE_TYPE (val2)));
1084
  /* Convert the two values into the same type.  This is needed because
1085
     sizetype causes sign extension even for unsigned types.  */
1086
  val2 = fold_convert (TREE_TYPE (val1), val2);
1087
  STRIP_USELESS_TYPE_CONVERSION (val2);
1088
 
1089
  if ((TREE_CODE (val1) == SSA_NAME
1090
       || TREE_CODE (val1) == PLUS_EXPR
1091
       || TREE_CODE (val1) == MINUS_EXPR)
1092
      && (TREE_CODE (val2) == SSA_NAME
1093
          || TREE_CODE (val2) == PLUS_EXPR
1094
          || TREE_CODE (val2) == MINUS_EXPR))
1095
    {
1096
      tree n1, c1, n2, c2;
1097
      enum tree_code code1, code2;
1098
 
1099
      /* If VAL1 and VAL2 are of the form 'NAME [+-] CST' or 'NAME',
1100
         return -1 or +1 accordingly.  If VAL1 and VAL2 don't use the
1101
         same name, return -2.  */
1102
      if (TREE_CODE (val1) == SSA_NAME)
1103
        {
1104
          code1 = SSA_NAME;
1105
          n1 = val1;
1106
          c1 = NULL_TREE;
1107
        }
1108
      else
1109
        {
1110
          code1 = TREE_CODE (val1);
1111
          n1 = TREE_OPERAND (val1, 0);
1112
          c1 = TREE_OPERAND (val1, 1);
1113
          if (tree_int_cst_sgn (c1) == -1)
1114
            {
1115
              if (is_negative_overflow_infinity (c1))
1116
                return -2;
1117
              c1 = fold_unary_to_constant (NEGATE_EXPR, TREE_TYPE (c1), c1);
1118
              if (!c1)
1119
                return -2;
1120
              code1 = code1 == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR;
1121
            }
1122
        }
1123
 
1124
      if (TREE_CODE (val2) == SSA_NAME)
1125
        {
1126
          code2 = SSA_NAME;
1127
          n2 = val2;
1128
          c2 = NULL_TREE;
1129
        }
1130
      else
1131
        {
1132
          code2 = TREE_CODE (val2);
1133
          n2 = TREE_OPERAND (val2, 0);
1134
          c2 = TREE_OPERAND (val2, 1);
1135
          if (tree_int_cst_sgn (c2) == -1)
1136
            {
1137
              if (is_negative_overflow_infinity (c2))
1138
                return -2;
1139
              c2 = fold_unary_to_constant (NEGATE_EXPR, TREE_TYPE (c2), c2);
1140
              if (!c2)
1141
                return -2;
1142
              code2 = code2 == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR;
1143
            }
1144
        }
1145
 
1146
      /* Both values must use the same name.  */
1147
      if (n1 != n2)
1148
        return -2;
1149
 
1150
      if (code1 == SSA_NAME
1151
          && code2 == SSA_NAME)
1152
        /* NAME == NAME  */
1153
        return 0;
1154
 
1155
      /* If overflow is defined we cannot simplify more.  */
1156
      if (!TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (val1)))
1157
        return -2;
1158
 
1159
      if (strict_overflow_p != NULL
1160
          && (code1 == SSA_NAME || !TREE_NO_WARNING (val1))
1161
          && (code2 == SSA_NAME || !TREE_NO_WARNING (val2)))
1162
        *strict_overflow_p = true;
1163
 
1164
      if (code1 == SSA_NAME)
1165
        {
1166
          if (code2 == PLUS_EXPR)
1167
            /* NAME < NAME + CST  */
1168
            return -1;
1169
          else if (code2 == MINUS_EXPR)
1170
            /* NAME > NAME - CST  */
1171
            return 1;
1172
        }
1173
      else if (code1 == PLUS_EXPR)
1174
        {
1175
          if (code2 == SSA_NAME)
1176
            /* NAME + CST > NAME  */
1177
            return 1;
1178
          else if (code2 == PLUS_EXPR)
1179
            /* NAME + CST1 > NAME + CST2, if CST1 > CST2  */
1180
            return compare_values_warnv (c1, c2, strict_overflow_p);
1181
          else if (code2 == MINUS_EXPR)
1182
            /* NAME + CST1 > NAME - CST2  */
1183
            return 1;
1184
        }
1185
      else if (code1 == MINUS_EXPR)
1186
        {
1187
          if (code2 == SSA_NAME)
1188
            /* NAME - CST < NAME  */
1189
            return -1;
1190
          else if (code2 == PLUS_EXPR)
1191
            /* NAME - CST1 < NAME + CST2  */
1192
            return -1;
1193
          else if (code2 == MINUS_EXPR)
1194
            /* NAME - CST1 > NAME - CST2, if CST1 < CST2.  Notice that
1195
               C1 and C2 are swapped in the call to compare_values.  */
1196
            return compare_values_warnv (c2, c1, strict_overflow_p);
1197
        }
1198
 
1199
      gcc_unreachable ();
1200
    }
1201
 
1202
  /* We cannot compare non-constants.  */
1203
  if (!is_gimple_min_invariant (val1) || !is_gimple_min_invariant (val2))
1204
    return -2;
1205
 
1206
  if (!POINTER_TYPE_P (TREE_TYPE (val1)))
1207
    {
1208
      /* We cannot compare overflowed values, except for overflow
1209
         infinities.  */
1210
      if (TREE_OVERFLOW (val1) || TREE_OVERFLOW (val2))
1211
        {
1212
          if (strict_overflow_p != NULL)
1213
            *strict_overflow_p = true;
1214
          if (is_negative_overflow_infinity (val1))
1215
            return is_negative_overflow_infinity (val2) ? 0 : -1;
1216
          else if (is_negative_overflow_infinity (val2))
1217
            return 1;
1218
          else if (is_positive_overflow_infinity (val1))
1219
            return is_positive_overflow_infinity (val2) ? 0 : 1;
1220
          else if (is_positive_overflow_infinity (val2))
1221
            return -1;
1222
          return -2;
1223
        }
1224
 
1225
      return tree_int_cst_compare (val1, val2);
1226
    }
1227
  else
1228
    {
1229
      tree t;
1230
 
1231
      /* First see if VAL1 and VAL2 are not the same.  */
1232
      if (val1 == val2 || operand_equal_p (val1, val2, 0))
1233
        return 0;
1234
 
1235
      /* If VAL1 is a lower address than VAL2, return -1.  */
1236
      if (operand_less_p (val1, val2) == 1)
1237
        return -1;
1238
 
1239
      /* If VAL1 is a higher address than VAL2, return +1.  */
1240
      if (operand_less_p (val2, val1) == 1)
1241
        return 1;
1242
 
1243
      /* If VAL1 is different than VAL2, return +2.
1244
         For integer constants we either have already returned -1 or 1
1245
         or they are equivalent.  We still might succeed in proving
1246
         something about non-trivial operands.  */
1247
      if (TREE_CODE (val1) != INTEGER_CST
1248
          || TREE_CODE (val2) != INTEGER_CST)
1249
        {
1250
          t = fold_binary_to_constant (NE_EXPR, boolean_type_node, val1, val2);
1251
          if (t && integer_onep (t))
1252
            return 2;
1253
        }
1254
 
1255
      return -2;
1256
    }
1257
}
1258
 
1259
/* Compare values like compare_values_warnv, but treat comparisons of
1260
   nonconstants which rely on undefined overflow as incomparable.  */
1261
 
1262
static int
1263
compare_values (tree val1, tree val2)
1264
{
1265
  bool sop;
1266
  int ret;
1267
 
1268
  sop = false;
1269
  ret = compare_values_warnv (val1, val2, &sop);
1270
  if (sop
1271
      && (!is_gimple_min_invariant (val1) || !is_gimple_min_invariant (val2)))
1272
    ret = -2;
1273
  return ret;
1274
}
1275
 
1276
 
1277
/* Return 1 if VAL is inside value range VR (VR->MIN <= VAL <= VR->MAX),
1278
 
1279
         -2 if we cannot tell either way.
1280
 
1281
   FIXME, the current semantics of this functions are a bit quirky
1282
          when taken in the context of VRP.  In here we do not care
1283
          about VR's type.  If VR is the anti-range ~[3, 5] the call
1284
          value_inside_range (4, VR) will return 1.
1285
 
1286
          This is counter-intuitive in a strict sense, but the callers
1287
          currently expect this.  They are calling the function
1288
          merely to determine whether VR->MIN <= VAL <= VR->MAX.  The
1289
          callers are applying the VR_RANGE/VR_ANTI_RANGE semantics
1290
          themselves.
1291
 
1292
          This also applies to value_ranges_intersect_p and
1293
          range_includes_zero_p.  The semantics of VR_RANGE and
1294
          VR_ANTI_RANGE should be encoded here, but that also means
1295
          adapting the users of these functions to the new semantics.
1296
 
1297
   Benchmark compile/20001226-1.c compilation time after changing this
1298
   function.  */
1299
 
1300
static inline int
1301
value_inside_range (tree val, value_range_t * vr)
1302
{
1303
  int cmp1, cmp2;
1304
 
1305
  cmp1 = operand_less_p (val, vr->min);
1306
  if (cmp1 == -2)
1307
    return -2;
1308
  if (cmp1 == 1)
1309
    return 0;
1310
 
1311
  cmp2 = operand_less_p (vr->max, val);
1312
  if (cmp2 == -2)
1313
    return -2;
1314
 
1315
  return !cmp2;
1316
}
1317
 
1318
 
1319
/* Return true if value ranges VR0 and VR1 have a non-empty
1320
   intersection.
1321
 
1322
   Benchmark compile/20001226-1.c compilation time after changing this
1323
   function.
1324
   */
1325
 
1326
static inline bool
1327
value_ranges_intersect_p (value_range_t *vr0, value_range_t *vr1)
1328
{
1329
  /* The value ranges do not intersect if the maximum of the first range is
1330
     less than the minimum of the second range or vice versa.
1331
     When those relations are unknown, we can't do any better.  */
1332
  if (operand_less_p (vr0->max, vr1->min) != 0)
1333
    return false;
1334
  if (operand_less_p (vr1->max, vr0->min) != 0)
1335
    return false;
1336
  return true;
1337
}
1338
 
1339
 
1340
/* Return true if VR includes the value zero, false otherwise.  FIXME,
1341
   currently this will return false for an anti-range like ~[-4, 3].
1342
   This will be wrong when the semantics of value_inside_range are
1343
   modified (currently the users of this function expect these
1344
   semantics).  */
1345
 
1346
static inline bool
1347
range_includes_zero_p (value_range_t *vr)
1348
{
1349
  tree zero;
1350
 
1351
  gcc_assert (vr->type != VR_UNDEFINED
1352
              && vr->type != VR_VARYING
1353
              && !symbolic_range_p (vr));
1354
 
1355
  zero = build_int_cst (TREE_TYPE (vr->min), 0);
1356
  return (value_inside_range (zero, vr) == 1);
1357
}
1358
 
1359
/* Return true if T, an SSA_NAME, is known to be nonnegative.  Return
1360
   false otherwise or if no value range information is available.  */
1361
 
1362
bool
1363
ssa_name_nonnegative_p (const_tree t)
1364
{
1365
  value_range_t *vr = get_value_range (t);
1366
 
1367
  if (INTEGRAL_TYPE_P (t)
1368
      && TYPE_UNSIGNED (t))
1369
    return true;
1370
 
1371
  if (!vr)
1372
    return false;
1373
 
1374
  /* Testing for VR_ANTI_RANGE is not useful here as any anti-range
1375
     which would return a useful value should be encoded as a VR_RANGE.  */
1376
  if (vr->type == VR_RANGE)
1377
    {
1378
      int result = compare_values (vr->min, integer_zero_node);
1379
 
1380
      return (result == 0 || result == 1);
1381
    }
1382
  return false;
1383
}
1384
 
1385
/* If OP has a value range with a single constant value return that,
1386
   otherwise return NULL_TREE.  This returns OP itself if OP is a
1387
   constant.  */
1388
 
1389
static tree
1390
op_with_constant_singleton_value_range (tree op)
1391
{
1392
  value_range_t *vr;
1393
 
1394
  if (is_gimple_min_invariant (op))
1395
    return op;
1396
 
1397
  if (TREE_CODE (op) != SSA_NAME)
1398
    return NULL_TREE;
1399
 
1400
  vr = get_value_range (op);
1401
  if (vr->type == VR_RANGE
1402
      && operand_equal_p (vr->min, vr->max, 0)
1403
      && is_gimple_min_invariant (vr->min))
1404
    return vr->min;
1405
 
1406
  return NULL_TREE;
1407
}
1408
 
1409
 
1410
/* Extract value range information from an ASSERT_EXPR EXPR and store
1411
   it in *VR_P.  */
1412
 
1413
static void
1414
extract_range_from_assert (value_range_t *vr_p, tree expr)
1415
{
1416
  tree var, cond, limit, min, max, type;
1417
  value_range_t *var_vr, *limit_vr;
1418
  enum tree_code cond_code;
1419
 
1420
  var = ASSERT_EXPR_VAR (expr);
1421
  cond = ASSERT_EXPR_COND (expr);
1422
 
1423
  gcc_assert (COMPARISON_CLASS_P (cond));
1424
 
1425
  /* Find VAR in the ASSERT_EXPR conditional.  */
1426
  if (var == TREE_OPERAND (cond, 0)
1427
      || TREE_CODE (TREE_OPERAND (cond, 0)) == PLUS_EXPR
1428
      || TREE_CODE (TREE_OPERAND (cond, 0)) == NOP_EXPR)
1429
    {
1430
      /* If the predicate is of the form VAR COMP LIMIT, then we just
1431
         take LIMIT from the RHS and use the same comparison code.  */
1432
      cond_code = TREE_CODE (cond);
1433
      limit = TREE_OPERAND (cond, 1);
1434
      cond = TREE_OPERAND (cond, 0);
1435
    }
1436
  else
1437
    {
1438
      /* If the predicate is of the form LIMIT COMP VAR, then we need
1439
         to flip around the comparison code to create the proper range
1440
         for VAR.  */
1441
      cond_code = swap_tree_comparison (TREE_CODE (cond));
1442
      limit = TREE_OPERAND (cond, 0);
1443
      cond = TREE_OPERAND (cond, 1);
1444
    }
1445
 
1446
  limit = avoid_overflow_infinity (limit);
1447
 
1448
  type = TREE_TYPE (limit);
1449
  gcc_assert (limit != var);
1450
 
1451
  /* For pointer arithmetic, we only keep track of pointer equality
1452
     and inequality.  */
1453
  if (POINTER_TYPE_P (type) && cond_code != NE_EXPR && cond_code != EQ_EXPR)
1454
    {
1455
      set_value_range_to_varying (vr_p);
1456
      return;
1457
    }
1458
 
1459
  /* If LIMIT is another SSA name and LIMIT has a range of its own,
1460
     try to use LIMIT's range to avoid creating symbolic ranges
1461
     unnecessarily. */
1462
  limit_vr = (TREE_CODE (limit) == SSA_NAME) ? get_value_range (limit) : NULL;
1463
 
1464
  /* LIMIT's range is only interesting if it has any useful information.  */
1465
  if (limit_vr
1466
      && (limit_vr->type == VR_UNDEFINED
1467
          || limit_vr->type == VR_VARYING
1468
          || symbolic_range_p (limit_vr)))
1469
    limit_vr = NULL;
1470
 
1471
  /* Initially, the new range has the same set of equivalences of
1472
     VAR's range.  This will be revised before returning the final
1473
     value.  Since assertions may be chained via mutually exclusive
1474
     predicates, we will need to trim the set of equivalences before
1475
     we are done.  */
1476
  gcc_assert (vr_p->equiv == NULL);
1477
  add_equivalence (&vr_p->equiv, var);
1478
 
1479
  /* Extract a new range based on the asserted comparison for VAR and
1480
     LIMIT's value range.  Notice that if LIMIT has an anti-range, we
1481
     will only use it for equality comparisons (EQ_EXPR).  For any
1482
     other kind of assertion, we cannot derive a range from LIMIT's
1483
     anti-range that can be used to describe the new range.  For
1484
     instance, ASSERT_EXPR <x_2, x_2 <= b_4>.  If b_4 is ~[2, 10],
1485
     then b_4 takes on the ranges [-INF, 1] and [11, +INF].  There is
1486
     no single range for x_2 that could describe LE_EXPR, so we might
1487
     as well build the range [b_4, +INF] for it.
1488
     One special case we handle is extracting a range from a
1489
     range test encoded as (unsigned)var + CST <= limit.  */
1490
  if (TREE_CODE (cond) == NOP_EXPR
1491
      || TREE_CODE (cond) == PLUS_EXPR)
1492
    {
1493
      if (TREE_CODE (cond) == PLUS_EXPR)
1494
        {
1495
          min = fold_build1 (NEGATE_EXPR, TREE_TYPE (TREE_OPERAND (cond, 1)),
1496
                             TREE_OPERAND (cond, 1));
1497
          max = int_const_binop (PLUS_EXPR, limit, min, 0);
1498
          cond = TREE_OPERAND (cond, 0);
1499
        }
1500
      else
1501
        {
1502
          min = build_int_cst (TREE_TYPE (var), 0);
1503
          max = limit;
1504
        }
1505
 
1506
      /* Make sure to not set TREE_OVERFLOW on the final type
1507
         conversion.  We are willingly interpreting large positive
1508
         unsigned values as negative singed values here.  */
1509
      min = force_fit_type_double (TREE_TYPE (var), TREE_INT_CST_LOW (min),
1510
                                   TREE_INT_CST_HIGH (min), 0, false);
1511
      max = force_fit_type_double (TREE_TYPE (var), TREE_INT_CST_LOW (max),
1512
                                   TREE_INT_CST_HIGH (max), 0, false);
1513
 
1514
      /* We can transform a max, min range to an anti-range or
1515
         vice-versa.  Use set_and_canonicalize_value_range which does
1516
         this for us.  */
1517
      if (cond_code == LE_EXPR)
1518
        set_and_canonicalize_value_range (vr_p, VR_RANGE,
1519
                                          min, max, vr_p->equiv);
1520
      else if (cond_code == GT_EXPR)
1521
        set_and_canonicalize_value_range (vr_p, VR_ANTI_RANGE,
1522
                                          min, max, vr_p->equiv);
1523
      else
1524
        gcc_unreachable ();
1525
    }
1526
  else if (cond_code == EQ_EXPR)
1527
    {
1528
      enum value_range_type range_type;
1529
 
1530
      if (limit_vr)
1531
        {
1532
          range_type = limit_vr->type;
1533
          min = limit_vr->min;
1534
          max = limit_vr->max;
1535
        }
1536
      else
1537
        {
1538
          range_type = VR_RANGE;
1539
          min = limit;
1540
          max = limit;
1541
        }
1542
 
1543
      set_value_range (vr_p, range_type, min, max, vr_p->equiv);
1544
 
1545
      /* When asserting the equality VAR == LIMIT and LIMIT is another
1546
         SSA name, the new range will also inherit the equivalence set
1547
         from LIMIT.  */
1548
      if (TREE_CODE (limit) == SSA_NAME)
1549
        add_equivalence (&vr_p->equiv, limit);
1550
    }
1551
  else if (cond_code == NE_EXPR)
1552
    {
1553
      /* As described above, when LIMIT's range is an anti-range and
1554
         this assertion is an inequality (NE_EXPR), then we cannot
1555
         derive anything from the anti-range.  For instance, if
1556
         LIMIT's range was ~[0, 0], the assertion 'VAR != LIMIT' does
1557
         not imply that VAR's range is [0, 0].  So, in the case of
1558
         anti-ranges, we just assert the inequality using LIMIT and
1559
         not its anti-range.
1560
 
1561
         If LIMIT_VR is a range, we can only use it to build a new
1562
         anti-range if LIMIT_VR is a single-valued range.  For
1563
         instance, if LIMIT_VR is [0, 1], the predicate
1564
         VAR != [0, 1] does not mean that VAR's range is ~[0, 1].
1565
         Rather, it means that for value 0 VAR should be ~[0, 0]
1566
         and for value 1, VAR should be ~[1, 1].  We cannot
1567
         represent these ranges.
1568
 
1569
         The only situation in which we can build a valid
1570
         anti-range is when LIMIT_VR is a single-valued range
1571
         (i.e., LIMIT_VR->MIN == LIMIT_VR->MAX).  In that case,
1572
         build the anti-range ~[LIMIT_VR->MIN, LIMIT_VR->MAX].  */
1573
      if (limit_vr
1574
          && limit_vr->type == VR_RANGE
1575
          && compare_values (limit_vr->min, limit_vr->max) == 0)
1576
        {
1577
          min = limit_vr->min;
1578
          max = limit_vr->max;
1579
        }
1580
      else
1581
        {
1582
          /* In any other case, we cannot use LIMIT's range to build a
1583
             valid anti-range.  */
1584
          min = max = limit;
1585
        }
1586
 
1587
      /* If MIN and MAX cover the whole range for their type, then
1588
         just use the original LIMIT.  */
1589
      if (INTEGRAL_TYPE_P (type)
1590
          && vrp_val_is_min (min)
1591
          && vrp_val_is_max (max))
1592
        min = max = limit;
1593
 
1594
      set_value_range (vr_p, VR_ANTI_RANGE, min, max, vr_p->equiv);
1595
    }
1596
  else if (cond_code == LE_EXPR || cond_code == LT_EXPR)
1597
    {
1598
      min = TYPE_MIN_VALUE (type);
1599
 
1600
      if (limit_vr == NULL || limit_vr->type == VR_ANTI_RANGE)
1601
        max = limit;
1602
      else
1603
        {
1604
          /* If LIMIT_VR is of the form [N1, N2], we need to build the
1605
             range [MIN, N2] for LE_EXPR and [MIN, N2 - 1] for
1606
             LT_EXPR.  */
1607
          max = limit_vr->max;
1608
        }
1609
 
1610
      /* If the maximum value forces us to be out of bounds, simply punt.
1611
         It would be pointless to try and do anything more since this
1612
         all should be optimized away above us.  */
1613
      if ((cond_code == LT_EXPR
1614
           && compare_values (max, min) == 0)
1615
          || (CONSTANT_CLASS_P (max) && TREE_OVERFLOW (max)))
1616
        set_value_range_to_varying (vr_p);
1617
      else
1618
        {
1619
          /* For LT_EXPR, we create the range [MIN, MAX - 1].  */
1620
          if (cond_code == LT_EXPR)
1621
            {
1622
              tree one = build_int_cst (type, 1);
1623
              max = fold_build2 (MINUS_EXPR, type, max, one);
1624
              if (EXPR_P (max))
1625
                TREE_NO_WARNING (max) = 1;
1626
            }
1627
 
1628
          set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
1629
        }
1630
    }
1631
  else if (cond_code == GE_EXPR || cond_code == GT_EXPR)
1632
    {
1633
      max = TYPE_MAX_VALUE (type);
1634
 
1635
      if (limit_vr == NULL || limit_vr->type == VR_ANTI_RANGE)
1636
        min = limit;
1637
      else
1638
        {
1639
          /* If LIMIT_VR is of the form [N1, N2], we need to build the
1640
             range [N1, MAX] for GE_EXPR and [N1 + 1, MAX] for
1641
             GT_EXPR.  */
1642
          min = limit_vr->min;
1643
        }
1644
 
1645
      /* If the minimum value forces us to be out of bounds, simply punt.
1646
         It would be pointless to try and do anything more since this
1647
         all should be optimized away above us.  */
1648
      if ((cond_code == GT_EXPR
1649
           && compare_values (min, max) == 0)
1650
          || (CONSTANT_CLASS_P (min) && TREE_OVERFLOW (min)))
1651
        set_value_range_to_varying (vr_p);
1652
      else
1653
        {
1654
          /* For GT_EXPR, we create the range [MIN + 1, MAX].  */
1655
          if (cond_code == GT_EXPR)
1656
            {
1657
              tree one = build_int_cst (type, 1);
1658
              min = fold_build2 (PLUS_EXPR, type, min, one);
1659
              if (EXPR_P (min))
1660
                TREE_NO_WARNING (min) = 1;
1661
            }
1662
 
1663
          set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
1664
        }
1665
    }
1666
  else
1667
    gcc_unreachable ();
1668
 
1669
  /* If VAR already had a known range, it may happen that the new
1670
     range we have computed and VAR's range are not compatible.  For
1671
     instance,
1672
 
1673
        if (p_5 == NULL)
1674
          p_6 = ASSERT_EXPR <p_5, p_5 == NULL>;
1675
          x_7 = p_6->fld;
1676
          p_8 = ASSERT_EXPR <p_6, p_6 != NULL>;
1677
 
1678
     While the above comes from a faulty program, it will cause an ICE
1679
     later because p_8 and p_6 will have incompatible ranges and at
1680
     the same time will be considered equivalent.  A similar situation
1681
     would arise from
1682
 
1683
        if (i_5 > 10)
1684
          i_6 = ASSERT_EXPR <i_5, i_5 > 10>;
1685
          if (i_5 < 5)
1686
            i_7 = ASSERT_EXPR <i_6, i_6 < 5>;
1687
 
1688
     Again i_6 and i_7 will have incompatible ranges.  It would be
1689
     pointless to try and do anything with i_7's range because
1690
     anything dominated by 'if (i_5 < 5)' will be optimized away.
1691
     Note, due to the wa in which simulation proceeds, the statement
1692
     i_7 = ASSERT_EXPR <...> we would never be visited because the
1693
     conditional 'if (i_5 < 5)' always evaluates to false.  However,
1694
     this extra check does not hurt and may protect against future
1695
     changes to VRP that may get into a situation similar to the
1696
     NULL pointer dereference example.
1697
 
1698
     Note that these compatibility tests are only needed when dealing
1699
     with ranges or a mix of range and anti-range.  If VAR_VR and VR_P
1700
     are both anti-ranges, they will always be compatible, because two
1701
     anti-ranges will always have a non-empty intersection.  */
1702
 
1703
  var_vr = get_value_range (var);
1704
 
1705
  /* We may need to make adjustments when VR_P and VAR_VR are numeric
1706
     ranges or anti-ranges.  */
1707
  if (vr_p->type == VR_VARYING
1708
      || vr_p->type == VR_UNDEFINED
1709
      || var_vr->type == VR_VARYING
1710
      || var_vr->type == VR_UNDEFINED
1711
      || symbolic_range_p (vr_p)
1712
      || symbolic_range_p (var_vr))
1713
    return;
1714
 
1715
  if (var_vr->type == VR_RANGE && vr_p->type == VR_RANGE)
1716
    {
1717
      /* If the two ranges have a non-empty intersection, we can
1718
         refine the resulting range.  Since the assert expression
1719
         creates an equivalency and at the same time it asserts a
1720
         predicate, we can take the intersection of the two ranges to
1721
         get better precision.  */
1722
      if (value_ranges_intersect_p (var_vr, vr_p))
1723
        {
1724
          /* Use the larger of the two minimums.  */
1725
          if (compare_values (vr_p->min, var_vr->min) == -1)
1726
            min = var_vr->min;
1727
          else
1728
            min = vr_p->min;
1729
 
1730
          /* Use the smaller of the two maximums.  */
1731
          if (compare_values (vr_p->max, var_vr->max) == 1)
1732
            max = var_vr->max;
1733
          else
1734
            max = vr_p->max;
1735
 
1736
          set_value_range (vr_p, vr_p->type, min, max, vr_p->equiv);
1737
        }
1738
      else
1739
        {
1740
          /* The two ranges do not intersect, set the new range to
1741
             VARYING, because we will not be able to do anything
1742
             meaningful with it.  */
1743
          set_value_range_to_varying (vr_p);
1744
        }
1745
    }
1746
  else if ((var_vr->type == VR_RANGE && vr_p->type == VR_ANTI_RANGE)
1747
           || (var_vr->type == VR_ANTI_RANGE && vr_p->type == VR_RANGE))
1748
    {
1749
      /* A range and an anti-range will cancel each other only if
1750
         their ends are the same.  For instance, in the example above,
1751
         p_8's range ~[0, 0] and p_6's range [0, 0] are incompatible,
1752
         so VR_P should be set to VR_VARYING.  */
1753
      if (compare_values (var_vr->min, vr_p->min) == 0
1754
          && compare_values (var_vr->max, vr_p->max) == 0)
1755
        set_value_range_to_varying (vr_p);
1756
      else
1757
        {
1758
          tree min, max, anti_min, anti_max, real_min, real_max;
1759
          int cmp;
1760
 
1761
          /* We want to compute the logical AND of the two ranges;
1762
             there are three cases to consider.
1763
 
1764
 
1765
             1. The VR_ANTI_RANGE range is completely within the
1766
                VR_RANGE and the endpoints of the ranges are
1767
                different.  In that case the resulting range
1768
                should be whichever range is more precise.
1769
                Typically that will be the VR_RANGE.
1770
 
1771
             2. The VR_ANTI_RANGE is completely disjoint from
1772
                the VR_RANGE.  In this case the resulting range
1773
                should be the VR_RANGE.
1774
 
1775
             3. There is some overlap between the VR_ANTI_RANGE
1776
                and the VR_RANGE.
1777
 
1778
                3a. If the high limit of the VR_ANTI_RANGE resides
1779
                    within the VR_RANGE, then the result is a new
1780
                    VR_RANGE starting at the high limit of the
1781
                    VR_ANTI_RANGE + 1 and extending to the
1782
                    high limit of the original VR_RANGE.
1783
 
1784
                3b. If the low limit of the VR_ANTI_RANGE resides
1785
                    within the VR_RANGE, then the result is a new
1786
                    VR_RANGE starting at the low limit of the original
1787
                    VR_RANGE and extending to the low limit of the
1788
                    VR_ANTI_RANGE - 1.  */
1789
          if (vr_p->type == VR_ANTI_RANGE)
1790
            {
1791
              anti_min = vr_p->min;
1792
              anti_max = vr_p->max;
1793
              real_min = var_vr->min;
1794
              real_max = var_vr->max;
1795
            }
1796
          else
1797
            {
1798
              anti_min = var_vr->min;
1799
              anti_max = var_vr->max;
1800
              real_min = vr_p->min;
1801
              real_max = vr_p->max;
1802
            }
1803
 
1804
 
1805
          /* Case 1, VR_ANTI_RANGE completely within VR_RANGE,
1806
             not including any endpoints.  */
1807
          if (compare_values (anti_max, real_max) == -1
1808
              && compare_values (anti_min, real_min) == 1)
1809
            {
1810
              /* If the range is covering the whole valid range of
1811
                 the type keep the anti-range.  */
1812
              if (!vrp_val_is_min (real_min)
1813
                  || !vrp_val_is_max (real_max))
1814
                set_value_range (vr_p, VR_RANGE, real_min,
1815
                                 real_max, vr_p->equiv);
1816
            }
1817
          /* Case 2, VR_ANTI_RANGE completely disjoint from
1818
             VR_RANGE.  */
1819
          else if (compare_values (anti_min, real_max) == 1
1820
                   || compare_values (anti_max, real_min) == -1)
1821
            {
1822
              set_value_range (vr_p, VR_RANGE, real_min,
1823
                               real_max, vr_p->equiv);
1824
            }
1825
          /* Case 3a, the anti-range extends into the low
1826
             part of the real range.  Thus creating a new
1827
             low for the real range.  */
1828
          else if (((cmp = compare_values (anti_max, real_min)) == 1
1829
                    || cmp == 0)
1830
                   && compare_values (anti_max, real_max) == -1)
1831
            {
1832
              gcc_assert (!is_positive_overflow_infinity (anti_max));
1833
              if (needs_overflow_infinity (TREE_TYPE (anti_max))
1834
                  && vrp_val_is_max (anti_max))
1835
                {
1836
                  if (!supports_overflow_infinity (TREE_TYPE (var_vr->min)))
1837
                    {
1838
                      set_value_range_to_varying (vr_p);
1839
                      return;
1840
                    }
1841
                  min = positive_overflow_infinity (TREE_TYPE (var_vr->min));
1842
                }
1843
              else if (!POINTER_TYPE_P (TREE_TYPE (var_vr->min)))
1844
                min = fold_build2 (PLUS_EXPR, TREE_TYPE (var_vr->min),
1845
                                   anti_max,
1846
                                   build_int_cst (TREE_TYPE (var_vr->min), 1));
1847
              else
1848
                min = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (var_vr->min),
1849
                                   anti_max, size_int (1));
1850
              max = real_max;
1851
              set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
1852
            }
1853
          /* Case 3b, the anti-range extends into the high
1854
             part of the real range.  Thus creating a new
1855
             higher for the real range.  */
1856
          else if (compare_values (anti_min, real_min) == 1
1857
                   && ((cmp = compare_values (anti_min, real_max)) == -1
1858
                       || cmp == 0))
1859
            {
1860
              gcc_assert (!is_negative_overflow_infinity (anti_min));
1861
              if (needs_overflow_infinity (TREE_TYPE (anti_min))
1862
                  && vrp_val_is_min (anti_min))
1863
                {
1864
                  if (!supports_overflow_infinity (TREE_TYPE (var_vr->min)))
1865
                    {
1866
                      set_value_range_to_varying (vr_p);
1867
                      return;
1868
                    }
1869
                  max = negative_overflow_infinity (TREE_TYPE (var_vr->min));
1870
                }
1871
              else if (!POINTER_TYPE_P (TREE_TYPE (var_vr->min)))
1872
                max = fold_build2 (MINUS_EXPR, TREE_TYPE (var_vr->min),
1873
                                   anti_min,
1874
                                   build_int_cst (TREE_TYPE (var_vr->min), 1));
1875
              else
1876
                max = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (var_vr->min),
1877
                                   anti_min,
1878
                                   size_int (-1));
1879
              min = real_min;
1880
              set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
1881
            }
1882
        }
1883
    }
1884
}
1885
 
1886
 
1887
/* Extract range information from SSA name VAR and store it in VR.  If
1888
   VAR has an interesting range, use it.  Otherwise, create the
1889
   range [VAR, VAR] and return it.  This is useful in situations where
1890
   we may have conditionals testing values of VARYING names.  For
1891
   instance,
1892
 
1893
        x_3 = y_5;
1894
        if (x_3 > y_5)
1895
          ...
1896
 
1897
    Even if y_5 is deemed VARYING, we can determine that x_3 > y_5 is
1898
    always false.  */
1899
 
1900
static void
1901
extract_range_from_ssa_name (value_range_t *vr, tree var)
1902
{
1903
  value_range_t *var_vr = get_value_range (var);
1904
 
1905
  if (var_vr->type != VR_UNDEFINED && var_vr->type != VR_VARYING)
1906
    copy_value_range (vr, var_vr);
1907
  else
1908
    set_value_range (vr, VR_RANGE, var, var, NULL);
1909
 
1910
  add_equivalence (&vr->equiv, var);
1911
}
1912
 
1913
 
1914
/* Wrapper around int_const_binop.  If the operation overflows and we
1915
   are not using wrapping arithmetic, then adjust the result to be
1916
   -INF or +INF depending on CODE, VAL1 and VAL2.  This can return
1917
   NULL_TREE if we need to use an overflow infinity representation but
1918
   the type does not support it.  */
1919
 
1920
static tree
1921
vrp_int_const_binop (enum tree_code code, tree val1, tree val2)
1922
{
1923
  tree res;
1924
 
1925
  res = int_const_binop (code, val1, val2, 0);
1926
 
1927
  /* If we are using unsigned arithmetic, operate symbolically
1928
     on -INF and +INF as int_const_binop only handles signed overflow.  */
1929
  if (TYPE_UNSIGNED (TREE_TYPE (val1)))
1930
    {
1931
      int checkz = compare_values (res, val1);
1932
      bool overflow = false;
1933
 
1934
      /* Ensure that res = val1 [+*] val2 >= val1
1935
         or that res = val1 - val2 <= val1.  */
1936
      if ((code == PLUS_EXPR
1937
           && !(checkz == 1 || checkz == 0))
1938
          || (code == MINUS_EXPR
1939
              && !(checkz == 0 || checkz == -1)))
1940
        {
1941
          overflow = true;
1942
        }
1943
      /* Checking for multiplication overflow is done by dividing the
1944
         output of the multiplication by the first input of the
1945
         multiplication.  If the result of that division operation is
1946
         not equal to the second input of the multiplication, then the
1947
         multiplication overflowed.  */
1948
      else if (code == MULT_EXPR && !integer_zerop (val1))
1949
        {
1950
          tree tmp = int_const_binop (TRUNC_DIV_EXPR,
1951
                                      res,
1952
                                      val1, 0);
1953
          int check = compare_values (tmp, val2);
1954
 
1955
          if (check != 0)
1956
            overflow = true;
1957
        }
1958
 
1959
      if (overflow)
1960
        {
1961
          res = copy_node (res);
1962
          TREE_OVERFLOW (res) = 1;
1963
        }
1964
 
1965
    }
1966
  else if (TYPE_OVERFLOW_WRAPS (TREE_TYPE (val1)))
1967
    /* If the singed operation wraps then int_const_binop has done
1968
       everything we want.  */
1969
    ;
1970
  else if ((TREE_OVERFLOW (res)
1971
            && !TREE_OVERFLOW (val1)
1972
            && !TREE_OVERFLOW (val2))
1973
           || is_overflow_infinity (val1)
1974
           || is_overflow_infinity (val2))
1975
    {
1976
      /* If the operation overflowed but neither VAL1 nor VAL2 are
1977
         overflown, return -INF or +INF depending on the operation
1978
         and the combination of signs of the operands.  */
1979
      int sgn1 = tree_int_cst_sgn (val1);
1980
      int sgn2 = tree_int_cst_sgn (val2);
1981
 
1982
      if (needs_overflow_infinity (TREE_TYPE (res))
1983
          && !supports_overflow_infinity (TREE_TYPE (res)))
1984
        return NULL_TREE;
1985
 
1986
      /* We have to punt on adding infinities of different signs,
1987
         since we can't tell what the sign of the result should be.
1988
         Likewise for subtracting infinities of the same sign.  */
1989
      if (((code == PLUS_EXPR && sgn1 != sgn2)
1990
           || (code == MINUS_EXPR && sgn1 == sgn2))
1991
          && is_overflow_infinity (val1)
1992
          && is_overflow_infinity (val2))
1993
        return NULL_TREE;
1994
 
1995
      /* Don't try to handle division or shifting of infinities.  */
1996
      if ((code == TRUNC_DIV_EXPR
1997
           || code == FLOOR_DIV_EXPR
1998
           || code == CEIL_DIV_EXPR
1999
           || code == EXACT_DIV_EXPR
2000
           || code == ROUND_DIV_EXPR
2001
           || code == RSHIFT_EXPR)
2002
          && (is_overflow_infinity (val1)
2003
              || is_overflow_infinity (val2)))
2004
        return NULL_TREE;
2005
 
2006
      /* Notice that we only need to handle the restricted set of
2007
         operations handled by extract_range_from_binary_expr.
2008
         Among them, only multiplication, addition and subtraction
2009
         can yield overflow without overflown operands because we
2010
         are working with integral types only... except in the
2011
         case VAL1 = -INF and VAL2 = -1 which overflows to +INF
2012
         for division too.  */
2013
 
2014
      /* For multiplication, the sign of the overflow is given
2015
         by the comparison of the signs of the operands.  */
2016
      if ((code == MULT_EXPR && sgn1 == sgn2)
2017
          /* For addition, the operands must be of the same sign
2018
             to yield an overflow.  Its sign is therefore that
2019
             of one of the operands, for example the first.  For
2020
             infinite operands X + -INF is negative, not positive.  */
2021
          || (code == PLUS_EXPR
2022
              && (sgn1 >= 0
2023
                  ? !is_negative_overflow_infinity (val2)
2024
                  : is_positive_overflow_infinity (val2)))
2025
          /* For subtraction, non-infinite operands must be of
2026
             different signs to yield an overflow.  Its sign is
2027
             therefore that of the first operand or the opposite of
2028
             that of the second operand.  A first operand of 0 counts
2029
             as positive here, for the corner case 0 - (-INF), which
2030
             overflows, but must yield +INF.  For infinite operands 0
2031
             - INF is negative, not positive.  */
2032
          || (code == MINUS_EXPR
2033
              && (sgn1 >= 0
2034
                  ? !is_positive_overflow_infinity (val2)
2035
                  : is_negative_overflow_infinity (val2)))
2036
          /* We only get in here with positive shift count, so the
2037
             overflow direction is the same as the sign of val1.
2038
             Actually rshift does not overflow at all, but we only
2039
             handle the case of shifting overflowed -INF and +INF.  */
2040
          || (code == RSHIFT_EXPR
2041
              && sgn1 >= 0)
2042
          /* For division, the only case is -INF / -1 = +INF.  */
2043
          || code == TRUNC_DIV_EXPR
2044
          || code == FLOOR_DIV_EXPR
2045
          || code == CEIL_DIV_EXPR
2046
          || code == EXACT_DIV_EXPR
2047
          || code == ROUND_DIV_EXPR)
2048
        return (needs_overflow_infinity (TREE_TYPE (res))
2049
                ? positive_overflow_infinity (TREE_TYPE (res))
2050
                : TYPE_MAX_VALUE (TREE_TYPE (res)));
2051
      else
2052
        return (needs_overflow_infinity (TREE_TYPE (res))
2053
                ? negative_overflow_infinity (TREE_TYPE (res))
2054
                : TYPE_MIN_VALUE (TREE_TYPE (res)));
2055
    }
2056
 
2057
  return res;
2058
}
2059
 
2060
 
2061
/* Extract range information from a binary expression EXPR based on
2062
   the ranges of each of its operands and the expression code.  */
2063
 
2064
static void
2065
extract_range_from_binary_expr (value_range_t *vr,
2066
                                enum tree_code code,
2067
                                tree expr_type, tree op0, tree op1)
2068
{
2069
  enum value_range_type type;
2070
  tree min, max;
2071
  int cmp;
2072
  value_range_t vr0 = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
2073
  value_range_t vr1 = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
2074
 
2075
  /* Not all binary expressions can be applied to ranges in a
2076
     meaningful way.  Handle only arithmetic operations.  */
2077
  if (code != PLUS_EXPR
2078
      && code != MINUS_EXPR
2079
      && code != POINTER_PLUS_EXPR
2080
      && code != MULT_EXPR
2081
      && code != TRUNC_DIV_EXPR
2082
      && code != FLOOR_DIV_EXPR
2083
      && code != CEIL_DIV_EXPR
2084
      && code != EXACT_DIV_EXPR
2085
      && code != ROUND_DIV_EXPR
2086
      && code != TRUNC_MOD_EXPR
2087
      && code != RSHIFT_EXPR
2088
      && code != MIN_EXPR
2089
      && code != MAX_EXPR
2090
      && code != BIT_AND_EXPR
2091
      && code != BIT_IOR_EXPR
2092
      && code != TRUTH_AND_EXPR
2093
      && code != TRUTH_OR_EXPR)
2094
    {
2095
      /* We can still do constant propagation here.  */
2096
      tree const_op0 = op_with_constant_singleton_value_range (op0);
2097
      tree const_op1 = op_with_constant_singleton_value_range (op1);
2098
      if (const_op0 || const_op1)
2099
        {
2100
          tree tem = fold_binary (code, expr_type,
2101
                                  const_op0 ? const_op0 : op0,
2102
                                  const_op1 ? const_op1 : op1);
2103
          if (tem
2104
              && is_gimple_min_invariant (tem)
2105
              && !is_overflow_infinity (tem))
2106
            {
2107
              set_value_range (vr, VR_RANGE, tem, tem, NULL);
2108
              return;
2109
            }
2110
        }
2111
      set_value_range_to_varying (vr);
2112
      return;
2113
    }
2114
 
2115
  /* Get value ranges for each operand.  For constant operands, create
2116
     a new value range with the operand to simplify processing.  */
2117
  if (TREE_CODE (op0) == SSA_NAME)
2118
    vr0 = *(get_value_range (op0));
2119
  else if (is_gimple_min_invariant (op0))
2120
    set_value_range_to_value (&vr0, op0, NULL);
2121
  else
2122
    set_value_range_to_varying (&vr0);
2123
 
2124
  if (TREE_CODE (op1) == SSA_NAME)
2125
    vr1 = *(get_value_range (op1));
2126
  else if (is_gimple_min_invariant (op1))
2127
    set_value_range_to_value (&vr1, op1, NULL);
2128
  else
2129
    set_value_range_to_varying (&vr1);
2130
 
2131
  /* If either range is UNDEFINED, so is the result.  */
2132
  if (vr0.type == VR_UNDEFINED || vr1.type == VR_UNDEFINED)
2133
    {
2134
      set_value_range_to_undefined (vr);
2135
      return;
2136
    }
2137
 
2138
  /* The type of the resulting value range defaults to VR0.TYPE.  */
2139
  type = vr0.type;
2140
 
2141
  /* Refuse to operate on VARYING ranges, ranges of different kinds
2142
     and symbolic ranges.  As an exception, we allow BIT_AND_EXPR
2143
     because we may be able to derive a useful range even if one of
2144
     the operands is VR_VARYING or symbolic range.  Similarly for
2145
     divisions.  TODO, we may be able to derive anti-ranges in
2146
     some cases.  */
2147
  if (code != BIT_AND_EXPR
2148
      && code != TRUTH_AND_EXPR
2149
      && code != TRUTH_OR_EXPR
2150
      && code != TRUNC_DIV_EXPR
2151
      && code != FLOOR_DIV_EXPR
2152
      && code != CEIL_DIV_EXPR
2153
      && code != EXACT_DIV_EXPR
2154
      && code != ROUND_DIV_EXPR
2155
      && code != TRUNC_MOD_EXPR
2156
      && (vr0.type == VR_VARYING
2157
          || vr1.type == VR_VARYING
2158
          || vr0.type != vr1.type
2159
          || symbolic_range_p (&vr0)
2160
          || symbolic_range_p (&vr1)))
2161
    {
2162
      set_value_range_to_varying (vr);
2163
      return;
2164
    }
2165
 
2166
  /* Now evaluate the expression to determine the new range.  */
2167
  if (POINTER_TYPE_P (expr_type)
2168
      || POINTER_TYPE_P (TREE_TYPE (op0))
2169
      || POINTER_TYPE_P (TREE_TYPE (op1)))
2170
    {
2171
      if (code == MIN_EXPR || code == MAX_EXPR)
2172
        {
2173
          /* For MIN/MAX expressions with pointers, we only care about
2174
             nullness, if both are non null, then the result is nonnull.
2175
             If both are null, then the result is null. Otherwise they
2176
             are varying.  */
2177
          if (range_is_nonnull (&vr0) && range_is_nonnull (&vr1))
2178
            set_value_range_to_nonnull (vr, expr_type);
2179
          else if (range_is_null (&vr0) && range_is_null (&vr1))
2180
            set_value_range_to_null (vr, expr_type);
2181
          else
2182
            set_value_range_to_varying (vr);
2183
 
2184
          return;
2185
        }
2186
      gcc_assert (code == POINTER_PLUS_EXPR);
2187
      /* For pointer types, we are really only interested in asserting
2188
         whether the expression evaluates to non-NULL.  */
2189
      if (range_is_nonnull (&vr0) || range_is_nonnull (&vr1))
2190
        set_value_range_to_nonnull (vr, expr_type);
2191
      else if (range_is_null (&vr0) && range_is_null (&vr1))
2192
        set_value_range_to_null (vr, expr_type);
2193
      else
2194
        set_value_range_to_varying (vr);
2195
 
2196
      return;
2197
    }
2198
 
2199
  /* For integer ranges, apply the operation to each end of the
2200
     range and see what we end up with.  */
2201
  if (code == TRUTH_AND_EXPR
2202
      || code == TRUTH_OR_EXPR)
2203
    {
2204
      /* If one of the operands is zero, we know that the whole
2205
         expression evaluates zero.  */
2206
      if (code == TRUTH_AND_EXPR
2207
          && ((vr0.type == VR_RANGE
2208
               && integer_zerop (vr0.min)
2209
               && integer_zerop (vr0.max))
2210
              || (vr1.type == VR_RANGE
2211
                  && integer_zerop (vr1.min)
2212
                  && integer_zerop (vr1.max))))
2213
        {
2214
          type = VR_RANGE;
2215
          min = max = build_int_cst (expr_type, 0);
2216
        }
2217
      /* If one of the operands is one, we know that the whole
2218
         expression evaluates one.  */
2219
      else if (code == TRUTH_OR_EXPR
2220
               && ((vr0.type == VR_RANGE
2221
                    && integer_onep (vr0.min)
2222
                    && integer_onep (vr0.max))
2223
                   || (vr1.type == VR_RANGE
2224
                       && integer_onep (vr1.min)
2225
                       && integer_onep (vr1.max))))
2226
        {
2227
          type = VR_RANGE;
2228
          min = max = build_int_cst (expr_type, 1);
2229
        }
2230
      else if (vr0.type != VR_VARYING
2231
               && vr1.type != VR_VARYING
2232
               && vr0.type == vr1.type
2233
               && !symbolic_range_p (&vr0)
2234
               && !overflow_infinity_range_p (&vr0)
2235
               && !symbolic_range_p (&vr1)
2236
               && !overflow_infinity_range_p (&vr1))
2237
        {
2238
          /* Boolean expressions cannot be folded with int_const_binop.  */
2239
          min = fold_binary (code, expr_type, vr0.min, vr1.min);
2240
          max = fold_binary (code, expr_type, vr0.max, vr1.max);
2241
        }
2242
      else
2243
        {
2244
          /* The result of a TRUTH_*_EXPR is always true or false.  */
2245
          set_value_range_to_truthvalue (vr, expr_type);
2246
          return;
2247
        }
2248
    }
2249
  else if (code == PLUS_EXPR
2250
           || code == MIN_EXPR
2251
           || code == MAX_EXPR)
2252
    {
2253
      /* If we have a PLUS_EXPR with two VR_ANTI_RANGEs, drop to
2254
         VR_VARYING.  It would take more effort to compute a precise
2255
         range for such a case.  For example, if we have op0 == 1 and
2256
         op1 == -1 with their ranges both being ~[0,0], we would have
2257
         op0 + op1 == 0, so we cannot claim that the sum is in ~[0,0].
2258
         Note that we are guaranteed to have vr0.type == vr1.type at
2259
         this point.  */
2260
      if (code == PLUS_EXPR && vr0.type == VR_ANTI_RANGE)
2261
        {
2262
          set_value_range_to_varying (vr);
2263
          return;
2264
        }
2265
 
2266
      /* For operations that make the resulting range directly
2267
         proportional to the original ranges, apply the operation to
2268
         the same end of each range.  */
2269
      min = vrp_int_const_binop (code, vr0.min, vr1.min);
2270
      max = vrp_int_const_binop (code, vr0.max, vr1.max);
2271
 
2272
      /* If both additions overflowed the range kind is still correct.
2273
         This happens regularly with subtracting something in unsigned
2274
         arithmetic.
2275
         ???  See PR30318 for all the cases we do not handle.  */
2276
      if (code == PLUS_EXPR
2277
          && (TREE_OVERFLOW (min) && !is_overflow_infinity (min))
2278
          && (TREE_OVERFLOW (max) && !is_overflow_infinity (max)))
2279
        {
2280
          min = build_int_cst_wide (TREE_TYPE (min),
2281
                                    TREE_INT_CST_LOW (min),
2282
                                    TREE_INT_CST_HIGH (min));
2283
          max = build_int_cst_wide (TREE_TYPE (max),
2284
                                    TREE_INT_CST_LOW (max),
2285
                                    TREE_INT_CST_HIGH (max));
2286
        }
2287
    }
2288
  else if (code == MULT_EXPR
2289
           || code == TRUNC_DIV_EXPR
2290
           || code == FLOOR_DIV_EXPR
2291
           || code == CEIL_DIV_EXPR
2292
           || code == EXACT_DIV_EXPR
2293
           || code == ROUND_DIV_EXPR
2294
           || code == RSHIFT_EXPR)
2295
    {
2296
      tree val[4];
2297
      size_t i;
2298
      bool sop;
2299
 
2300
      /* If we have an unsigned MULT_EXPR with two VR_ANTI_RANGEs,
2301
         drop to VR_VARYING.  It would take more effort to compute a
2302
         precise range for such a case.  For example, if we have
2303
         op0 == 65536 and op1 == 65536 with their ranges both being
2304
         ~[0,0] on a 32-bit machine, we would have op0 * op1 == 0, so
2305
         we cannot claim that the product is in ~[0,0].  Note that we
2306
         are guaranteed to have vr0.type == vr1.type at this
2307
         point.  */
2308
      if (code == MULT_EXPR
2309
          && vr0.type == VR_ANTI_RANGE
2310
          && !TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (op0)))
2311
        {
2312
          set_value_range_to_varying (vr);
2313
          return;
2314
        }
2315
 
2316
      /* If we have a RSHIFT_EXPR with any shift values outside [0..prec-1],
2317
         then drop to VR_VARYING.  Outside of this range we get undefined
2318
         behavior from the shift operation.  We cannot even trust
2319
         SHIFT_COUNT_TRUNCATED at this stage, because that applies to rtl
2320
         shifts, and the operation at the tree level may be widened.  */
2321
      if (code == RSHIFT_EXPR)
2322
        {
2323
          if (vr1.type == VR_ANTI_RANGE
2324
              || !vrp_expr_computes_nonnegative (op1, &sop)
2325
              || (operand_less_p
2326
                  (build_int_cst (TREE_TYPE (vr1.max),
2327
                                  TYPE_PRECISION (expr_type) - 1),
2328
                   vr1.max) != 0))
2329
            {
2330
              set_value_range_to_varying (vr);
2331
              return;
2332
            }
2333
        }
2334
 
2335
      else if ((code == TRUNC_DIV_EXPR
2336
                || code == FLOOR_DIV_EXPR
2337
                || code == CEIL_DIV_EXPR
2338
                || code == EXACT_DIV_EXPR
2339
                || code == ROUND_DIV_EXPR)
2340
               && (vr0.type != VR_RANGE || symbolic_range_p (&vr0)))
2341
        {
2342
          /* For division, if op1 has VR_RANGE but op0 does not, something
2343
             can be deduced just from that range.  Say [min, max] / [4, max]
2344
             gives [min / 4, max / 4] range.  */
2345
          if (vr1.type == VR_RANGE
2346
              && !symbolic_range_p (&vr1)
2347
              && !range_includes_zero_p (&vr1))
2348
            {
2349
              vr0.type = type = VR_RANGE;
2350
              vr0.min = vrp_val_min (TREE_TYPE (op0));
2351
              vr0.max = vrp_val_max (TREE_TYPE (op1));
2352
            }
2353
          else
2354
            {
2355
              set_value_range_to_varying (vr);
2356
              return;
2357
            }
2358
        }
2359
 
2360
      /* For divisions, if op0 is VR_RANGE, we can deduce a range
2361
         even if op1 is VR_VARYING, VR_ANTI_RANGE, symbolic or can
2362
         include 0.  */
2363
      if ((code == TRUNC_DIV_EXPR
2364
           || code == FLOOR_DIV_EXPR
2365
           || code == CEIL_DIV_EXPR
2366
           || code == EXACT_DIV_EXPR
2367
           || code == ROUND_DIV_EXPR)
2368
          && vr0.type == VR_RANGE
2369
          && (vr1.type != VR_RANGE
2370
              || symbolic_range_p (&vr1)
2371
              || range_includes_zero_p (&vr1)))
2372
        {
2373
          tree zero = build_int_cst (TREE_TYPE (vr0.min), 0);
2374
          int cmp;
2375
 
2376
          sop = false;
2377
          min = NULL_TREE;
2378
          max = NULL_TREE;
2379
          if (vrp_expr_computes_nonnegative (op1, &sop) && !sop)
2380
            {
2381
              /* For unsigned division or when divisor is known
2382
                 to be non-negative, the range has to cover
2383
                 all numbers from 0 to max for positive max
2384
                 and all numbers from min to 0 for negative min.  */
2385
              cmp = compare_values (vr0.max, zero);
2386
              if (cmp == -1)
2387
                max = zero;
2388
              else if (cmp == 0 || cmp == 1)
2389
                max = vr0.max;
2390
              else
2391
                type = VR_VARYING;
2392
              cmp = compare_values (vr0.min, zero);
2393
              if (cmp == 1)
2394
                min = zero;
2395
              else if (cmp == 0 || cmp == -1)
2396
                min = vr0.min;
2397
              else
2398
                type = VR_VARYING;
2399
            }
2400
          else
2401
            {
2402
              /* Otherwise the range is -max .. max or min .. -min
2403
                 depending on which bound is bigger in absolute value,
2404
                 as the division can change the sign.  */
2405
              abs_extent_range (vr, vr0.min, vr0.max);
2406
              return;
2407
            }
2408
          if (type == VR_VARYING)
2409
            {
2410
              set_value_range_to_varying (vr);
2411
              return;
2412
            }
2413
        }
2414
 
2415
      /* Multiplications and divisions are a bit tricky to handle,
2416
         depending on the mix of signs we have in the two ranges, we
2417
         need to operate on different values to get the minimum and
2418
         maximum values for the new range.  One approach is to figure
2419
         out all the variations of range combinations and do the
2420
         operations.
2421
 
2422
         However, this involves several calls to compare_values and it
2423
         is pretty convoluted.  It's simpler to do the 4 operations
2424
         (MIN0 OP MIN1, MIN0 OP MAX1, MAX0 OP MIN1 and MAX0 OP MAX0 OP
2425
         MAX1) and then figure the smallest and largest values to form
2426
         the new range.  */
2427
      else
2428
        {
2429
          gcc_assert ((vr0.type == VR_RANGE
2430
                       || (code == MULT_EXPR && vr0.type == VR_ANTI_RANGE))
2431
                      && vr0.type == vr1.type);
2432
 
2433
          /* Compute the 4 cross operations.  */
2434
          sop = false;
2435
          val[0] = vrp_int_const_binop (code, vr0.min, vr1.min);
2436
          if (val[0] == NULL_TREE)
2437
            sop = true;
2438
 
2439
          if (vr1.max == vr1.min)
2440
            val[1] = NULL_TREE;
2441
          else
2442
            {
2443
              val[1] = vrp_int_const_binop (code, vr0.min, vr1.max);
2444
              if (val[1] == NULL_TREE)
2445
                sop = true;
2446
            }
2447
 
2448
          if (vr0.max == vr0.min)
2449
            val[2] = NULL_TREE;
2450
          else
2451
            {
2452
              val[2] = vrp_int_const_binop (code, vr0.max, vr1.min);
2453
              if (val[2] == NULL_TREE)
2454
                sop = true;
2455
            }
2456
 
2457
          if (vr0.min == vr0.max || vr1.min == vr1.max)
2458
            val[3] = NULL_TREE;
2459
          else
2460
            {
2461
              val[3] = vrp_int_const_binop (code, vr0.max, vr1.max);
2462
              if (val[3] == NULL_TREE)
2463
                sop = true;
2464
            }
2465
 
2466
          if (sop)
2467
            {
2468
              set_value_range_to_varying (vr);
2469
              return;
2470
            }
2471
 
2472
          /* Set MIN to the minimum of VAL[i] and MAX to the maximum
2473
             of VAL[i].  */
2474
          min = val[0];
2475
          max = val[0];
2476
          for (i = 1; i < 4; i++)
2477
            {
2478
              if (!is_gimple_min_invariant (min)
2479
                  || (TREE_OVERFLOW (min) && !is_overflow_infinity (min))
2480
                  || !is_gimple_min_invariant (max)
2481
                  || (TREE_OVERFLOW (max) && !is_overflow_infinity (max)))
2482
                break;
2483
 
2484
              if (val[i])
2485
                {
2486
                  if (!is_gimple_min_invariant (val[i])
2487
                      || (TREE_OVERFLOW (val[i])
2488
                          && !is_overflow_infinity (val[i])))
2489
                    {
2490
                      /* If we found an overflowed value, set MIN and MAX
2491
                         to it so that we set the resulting range to
2492
                         VARYING.  */
2493
                      min = max = val[i];
2494
                      break;
2495
                    }
2496
 
2497
                  if (compare_values (val[i], min) == -1)
2498
                    min = val[i];
2499
 
2500
                  if (compare_values (val[i], max) == 1)
2501
                    max = val[i];
2502
                }
2503
            }
2504
        }
2505
    }
2506
  else if (code == TRUNC_MOD_EXPR)
2507
    {
2508
      bool sop = false;
2509
      if (vr1.type != VR_RANGE
2510
          || symbolic_range_p (&vr1)
2511
          || range_includes_zero_p (&vr1)
2512
          || vrp_val_is_min (vr1.min))
2513
        {
2514
          set_value_range_to_varying (vr);
2515
          return;
2516
        }
2517
      type = VR_RANGE;
2518
      /* Compute MAX <|vr1.min|, |vr1.max|> - 1.  */
2519
      max = fold_unary_to_constant (ABS_EXPR, TREE_TYPE (vr1.min), vr1.min);
2520
      if (tree_int_cst_lt (max, vr1.max))
2521
        max = vr1.max;
2522
      max = int_const_binop (MINUS_EXPR, max, integer_one_node, 0);
2523
      /* If the dividend is non-negative the modulus will be
2524
         non-negative as well.  */
2525
      if (TYPE_UNSIGNED (TREE_TYPE (max))
2526
          || (vrp_expr_computes_nonnegative (op0, &sop) && !sop))
2527
        min = build_int_cst (TREE_TYPE (max), 0);
2528
      else
2529
        min = fold_unary_to_constant (NEGATE_EXPR, TREE_TYPE (max), max);
2530
    }
2531
  else if (code == MINUS_EXPR)
2532
    {
2533
      /* If we have a MINUS_EXPR with two VR_ANTI_RANGEs, drop to
2534
         VR_VARYING.  It would take more effort to compute a precise
2535
         range for such a case.  For example, if we have op0 == 1 and
2536
         op1 == 1 with their ranges both being ~[0,0], we would have
2537
         op0 - op1 == 0, so we cannot claim that the difference is in
2538
         ~[0,0].  Note that we are guaranteed to have
2539
         vr0.type == vr1.type at this point.  */
2540
      if (vr0.type == VR_ANTI_RANGE)
2541
        {
2542
          set_value_range_to_varying (vr);
2543
          return;
2544
        }
2545
 
2546
      /* For MINUS_EXPR, apply the operation to the opposite ends of
2547
         each range.  */
2548
      min = vrp_int_const_binop (code, vr0.min, vr1.max);
2549
      max = vrp_int_const_binop (code, vr0.max, vr1.min);
2550
    }
2551
  else if (code == BIT_AND_EXPR)
2552
    {
2553
      bool vr0_int_cst_singleton_p, vr1_int_cst_singleton_p;
2554
 
2555
      vr0_int_cst_singleton_p = range_int_cst_singleton_p (&vr0);
2556
      vr1_int_cst_singleton_p = range_int_cst_singleton_p (&vr1);
2557
 
2558
      if (vr0_int_cst_singleton_p && vr1_int_cst_singleton_p)
2559
        min = max = int_const_binop (code, vr0.max, vr1.max, 0);
2560
      else if (vr0_int_cst_singleton_p
2561
               && tree_int_cst_sgn (vr0.max) >= 0)
2562
        {
2563
          min = build_int_cst (expr_type, 0);
2564
          max = vr0.max;
2565
        }
2566
      else if (vr1_int_cst_singleton_p
2567
               && tree_int_cst_sgn (vr1.max) >= 0)
2568
        {
2569
          type = VR_RANGE;
2570
          min = build_int_cst (expr_type, 0);
2571
          max = vr1.max;
2572
        }
2573
      else
2574
        {
2575
          set_value_range_to_varying (vr);
2576
          return;
2577
        }
2578
    }
2579
  else if (code == BIT_IOR_EXPR)
2580
    {
2581
      if (range_int_cst_p (&vr0)
2582
          && range_int_cst_p (&vr1)
2583
          && tree_int_cst_sgn (vr0.min) >= 0
2584
          && tree_int_cst_sgn (vr1.min) >= 0)
2585
        {
2586
          double_int vr0_max = tree_to_double_int (vr0.max);
2587
          double_int vr1_max = tree_to_double_int (vr1.max);
2588
          double_int ior_max;
2589
 
2590
          /* Set all bits to the right of the most significant one to 1.
2591
             For example, [0, 4] | [4, 4] = [4, 7]. */
2592
          ior_max.low = vr0_max.low | vr1_max.low;
2593
          ior_max.high = vr0_max.high | vr1_max.high;
2594
          if (ior_max.high != 0)
2595
            {
2596
              ior_max.low = ~(unsigned HOST_WIDE_INT)0u;
2597
              ior_max.high |= ((HOST_WIDE_INT) 1
2598
                               << floor_log2 (ior_max.high)) - 1;
2599
            }
2600
          else if (ior_max.low != 0)
2601
            ior_max.low |= ((unsigned HOST_WIDE_INT) 1u
2602
                            << floor_log2 (ior_max.low)) - 1;
2603
 
2604
          /* Both of these endpoints are conservative.  */
2605
          min = vrp_int_const_binop (MAX_EXPR, vr0.min, vr1.min);
2606
          max = double_int_to_tree (expr_type, ior_max);
2607
        }
2608
      else
2609
        {
2610
          set_value_range_to_varying (vr);
2611
          return;
2612
        }
2613
    }
2614
  else
2615
    gcc_unreachable ();
2616
 
2617
  /* If either MIN or MAX overflowed, then set the resulting range to
2618
     VARYING.  But we do accept an overflow infinity
2619
     representation.  */
2620
  if (min == NULL_TREE
2621
      || !is_gimple_min_invariant (min)
2622
      || (TREE_OVERFLOW (min) && !is_overflow_infinity (min))
2623
      || max == NULL_TREE
2624
      || !is_gimple_min_invariant (max)
2625
      || (TREE_OVERFLOW (max) && !is_overflow_infinity (max)))
2626
    {
2627
      set_value_range_to_varying (vr);
2628
      return;
2629
    }
2630
 
2631
  /* We punt if:
2632
     1) [-INF, +INF]
2633
     2) [-INF, +-INF(OVF)]
2634
     3) [+-INF(OVF), +INF]
2635
     4) [+-INF(OVF), +-INF(OVF)]
2636
     We learn nothing when we have INF and INF(OVF) on both sides.
2637
     Note that we do accept [-INF, -INF] and [+INF, +INF] without
2638
     overflow.  */
2639
  if ((vrp_val_is_min (min) || is_overflow_infinity (min))
2640
      && (vrp_val_is_max (max) || is_overflow_infinity (max)))
2641
    {
2642
      set_value_range_to_varying (vr);
2643
      return;
2644
    }
2645
 
2646
  cmp = compare_values (min, max);
2647
  if (cmp == -2 || cmp == 1)
2648
    {
2649
      /* If the new range has its limits swapped around (MIN > MAX),
2650
         then the operation caused one of them to wrap around, mark
2651
         the new range VARYING.  */
2652
      set_value_range_to_varying (vr);
2653
    }
2654
  else
2655
    set_value_range (vr, type, min, max, NULL);
2656
}
2657
 
2658
 
2659
/* Extract range information from a unary expression EXPR based on
2660
   the range of its operand and the expression code.  */
2661
 
2662
static void
2663
extract_range_from_unary_expr (value_range_t *vr, enum tree_code code,
2664
                               tree type, tree op0)
2665
{
2666
  tree min, max;
2667
  int cmp;
2668
  value_range_t vr0 = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
2669
 
2670
  /* Refuse to operate on certain unary expressions for which we
2671
     cannot easily determine a resulting range.  */
2672
  if (code == FIX_TRUNC_EXPR
2673
      || code == FLOAT_EXPR
2674
      || code == BIT_NOT_EXPR
2675
      || code == CONJ_EXPR)
2676
    {
2677
      /* We can still do constant propagation here.  */
2678
      if ((op0 = op_with_constant_singleton_value_range (op0)) != NULL_TREE)
2679
        {
2680
          tree tem = fold_unary (code, type, op0);
2681
          if (tem
2682
              && is_gimple_min_invariant (tem)
2683
              && !is_overflow_infinity (tem))
2684
            {
2685
              set_value_range (vr, VR_RANGE, tem, tem, NULL);
2686
              return;
2687
            }
2688
        }
2689
      set_value_range_to_varying (vr);
2690
      return;
2691
    }
2692
 
2693
  /* Get value ranges for the operand.  For constant operands, create
2694
     a new value range with the operand to simplify processing.  */
2695
  if (TREE_CODE (op0) == SSA_NAME)
2696
    vr0 = *(get_value_range (op0));
2697
  else if (is_gimple_min_invariant (op0))
2698
    set_value_range_to_value (&vr0, op0, NULL);
2699
  else
2700
    set_value_range_to_varying (&vr0);
2701
 
2702
  /* If VR0 is UNDEFINED, so is the result.  */
2703
  if (vr0.type == VR_UNDEFINED)
2704
    {
2705
      set_value_range_to_undefined (vr);
2706
      return;
2707
    }
2708
 
2709
  /* Refuse to operate on symbolic ranges, or if neither operand is
2710
     a pointer or integral type.  */
2711
  if ((!INTEGRAL_TYPE_P (TREE_TYPE (op0))
2712
       && !POINTER_TYPE_P (TREE_TYPE (op0)))
2713
      || (vr0.type != VR_VARYING
2714
          && symbolic_range_p (&vr0)))
2715
    {
2716
      set_value_range_to_varying (vr);
2717
      return;
2718
    }
2719
 
2720
  /* If the expression involves pointers, we are only interested in
2721
     determining if it evaluates to NULL [0, 0] or non-NULL (~[0, 0]).  */
2722
  if (POINTER_TYPE_P (type) || POINTER_TYPE_P (TREE_TYPE (op0)))
2723
    {
2724
      bool sop;
2725
 
2726
      sop = false;
2727
      if (range_is_nonnull (&vr0)
2728
          || (tree_unary_nonzero_warnv_p (code, type, op0, &sop)
2729
              && !sop))
2730
        set_value_range_to_nonnull (vr, type);
2731
      else if (range_is_null (&vr0))
2732
        set_value_range_to_null (vr, type);
2733
      else
2734
        set_value_range_to_varying (vr);
2735
 
2736
      return;
2737
    }
2738
 
2739
  /* Handle unary expressions on integer ranges.  */
2740
  if (CONVERT_EXPR_CODE_P (code)
2741
      && INTEGRAL_TYPE_P (type)
2742
      && INTEGRAL_TYPE_P (TREE_TYPE (op0)))
2743
    {
2744
      tree inner_type = TREE_TYPE (op0);
2745
      tree outer_type = type;
2746
 
2747
      /* If VR0 is varying and we increase the type precision, assume
2748
         a full range for the following transformation.  */
2749
      if (vr0.type == VR_VARYING
2750
          && TYPE_PRECISION (inner_type) < TYPE_PRECISION (outer_type))
2751
        {
2752
          vr0.type = VR_RANGE;
2753
          vr0.min = TYPE_MIN_VALUE (inner_type);
2754
          vr0.max = TYPE_MAX_VALUE (inner_type);
2755
        }
2756
 
2757
      /* If VR0 is a constant range or anti-range and the conversion is
2758
         not truncating we can convert the min and max values and
2759
         canonicalize the resulting range.  Otherwise we can do the
2760
         conversion if the size of the range is less than what the
2761
         precision of the target type can represent and the range is
2762
         not an anti-range.  */
2763
      if ((vr0.type == VR_RANGE
2764
           || vr0.type == VR_ANTI_RANGE)
2765
          && TREE_CODE (vr0.min) == INTEGER_CST
2766
          && TREE_CODE (vr0.max) == INTEGER_CST
2767
          && (!is_overflow_infinity (vr0.min)
2768
              || (vr0.type == VR_RANGE
2769
                  && TYPE_PRECISION (outer_type) > TYPE_PRECISION (inner_type)
2770
                  && needs_overflow_infinity (outer_type)
2771
                  && supports_overflow_infinity (outer_type)))
2772
          && (!is_overflow_infinity (vr0.max)
2773
              || (vr0.type == VR_RANGE
2774
                  && TYPE_PRECISION (outer_type) > TYPE_PRECISION (inner_type)
2775
                  && needs_overflow_infinity (outer_type)
2776
                  && supports_overflow_infinity (outer_type)))
2777
          && (TYPE_PRECISION (outer_type) >= TYPE_PRECISION (inner_type)
2778
              || (vr0.type == VR_RANGE
2779
                  && integer_zerop (int_const_binop (RSHIFT_EXPR,
2780
                       int_const_binop (MINUS_EXPR, vr0.max, vr0.min, 0),
2781
                         size_int (TYPE_PRECISION (outer_type)), 0)))))
2782
        {
2783
          tree new_min, new_max;
2784
          new_min = force_fit_type_double (outer_type,
2785
                                           TREE_INT_CST_LOW (vr0.min),
2786
                                           TREE_INT_CST_HIGH (vr0.min), 0, 0);
2787
          new_max = force_fit_type_double (outer_type,
2788
                                           TREE_INT_CST_LOW (vr0.max),
2789
                                           TREE_INT_CST_HIGH (vr0.max), 0, 0);
2790
          if (is_overflow_infinity (vr0.min))
2791
            new_min = negative_overflow_infinity (outer_type);
2792
          if (is_overflow_infinity (vr0.max))
2793
            new_max = positive_overflow_infinity (outer_type);
2794
          set_and_canonicalize_value_range (vr, vr0.type,
2795
                                            new_min, new_max, NULL);
2796
          return;
2797
        }
2798
 
2799
      set_value_range_to_varying (vr);
2800
      return;
2801
    }
2802
 
2803
  /* Conversion of a VR_VARYING value to a wider type can result
2804
     in a usable range.  So wait until after we've handled conversions
2805
     before dropping the result to VR_VARYING if we had a source
2806
     operand that is VR_VARYING.  */
2807
  if (vr0.type == VR_VARYING)
2808
    {
2809
      set_value_range_to_varying (vr);
2810
      return;
2811
    }
2812
 
2813
  /* Apply the operation to each end of the range and see what we end
2814
     up with.  */
2815
  if (code == NEGATE_EXPR
2816
      && !TYPE_UNSIGNED (type))
2817
    {
2818
      /* NEGATE_EXPR flips the range around.  We need to treat
2819
         TYPE_MIN_VALUE specially.  */
2820
      if (is_positive_overflow_infinity (vr0.max))
2821
        min = negative_overflow_infinity (type);
2822
      else if (is_negative_overflow_infinity (vr0.max))
2823
        min = positive_overflow_infinity (type);
2824
      else if (!vrp_val_is_min (vr0.max))
2825
        min = fold_unary_to_constant (code, type, vr0.max);
2826
      else if (needs_overflow_infinity (type))
2827
        {
2828
          if (supports_overflow_infinity (type)
2829
              && !is_overflow_infinity (vr0.min)
2830
              && !vrp_val_is_min (vr0.min))
2831
            min = positive_overflow_infinity (type);
2832
          else
2833
            {
2834
              set_value_range_to_varying (vr);
2835
              return;
2836
            }
2837
        }
2838
      else
2839
        min = TYPE_MIN_VALUE (type);
2840
 
2841
      if (is_positive_overflow_infinity (vr0.min))
2842
        max = negative_overflow_infinity (type);
2843
      else if (is_negative_overflow_infinity (vr0.min))
2844
        max = positive_overflow_infinity (type);
2845
      else if (!vrp_val_is_min (vr0.min))
2846
        max = fold_unary_to_constant (code, type, vr0.min);
2847
      else if (needs_overflow_infinity (type))
2848
        {
2849
          if (supports_overflow_infinity (type))
2850
            max = positive_overflow_infinity (type);
2851
          else
2852
            {
2853
              set_value_range_to_varying (vr);
2854
              return;
2855
            }
2856
        }
2857
      else
2858
        max = TYPE_MIN_VALUE (type);
2859
    }
2860
  else if (code == NEGATE_EXPR
2861
           && TYPE_UNSIGNED (type))
2862
    {
2863
      if (!range_includes_zero_p (&vr0))
2864
        {
2865
          max = fold_unary_to_constant (code, type, vr0.min);
2866
          min = fold_unary_to_constant (code, type, vr0.max);
2867
        }
2868
      else
2869
        {
2870
          if (range_is_null (&vr0))
2871
            set_value_range_to_null (vr, type);
2872
          else
2873
            set_value_range_to_varying (vr);
2874
          return;
2875
        }
2876
    }
2877
  else if (code == ABS_EXPR
2878
           && !TYPE_UNSIGNED (type))
2879
    {
2880
      /* -TYPE_MIN_VALUE = TYPE_MIN_VALUE with flag_wrapv so we can't get a
2881
         useful range.  */
2882
      if (!TYPE_OVERFLOW_UNDEFINED (type)
2883
          && ((vr0.type == VR_RANGE
2884
               && vrp_val_is_min (vr0.min))
2885
              || (vr0.type == VR_ANTI_RANGE
2886
                  && !vrp_val_is_min (vr0.min)
2887
                  && !range_includes_zero_p (&vr0))))
2888
        {
2889
          set_value_range_to_varying (vr);
2890
          return;
2891
        }
2892
 
2893
      /* ABS_EXPR may flip the range around, if the original range
2894
         included negative values.  */
2895
      if (is_overflow_infinity (vr0.min))
2896
        min = positive_overflow_infinity (type);
2897
      else if (!vrp_val_is_min (vr0.min))
2898
        min = fold_unary_to_constant (code, type, vr0.min);
2899
      else if (!needs_overflow_infinity (type))
2900
        min = TYPE_MAX_VALUE (type);
2901
      else if (supports_overflow_infinity (type))
2902
        min = positive_overflow_infinity (type);
2903
      else
2904
        {
2905
          set_value_range_to_varying (vr);
2906
          return;
2907
        }
2908
 
2909
      if (is_overflow_infinity (vr0.max))
2910
        max = positive_overflow_infinity (type);
2911
      else if (!vrp_val_is_min (vr0.max))
2912
        max = fold_unary_to_constant (code, type, vr0.max);
2913
      else if (!needs_overflow_infinity (type))
2914
        max = TYPE_MAX_VALUE (type);
2915
      else if (supports_overflow_infinity (type)
2916
               /* We shouldn't generate [+INF, +INF] as set_value_range
2917
                  doesn't like this and ICEs.  */
2918
               && !is_positive_overflow_infinity (min))
2919
        max = positive_overflow_infinity (type);
2920
      else
2921
        {
2922
          set_value_range_to_varying (vr);
2923
          return;
2924
        }
2925
 
2926
      cmp = compare_values (min, max);
2927
 
2928
      /* If a VR_ANTI_RANGEs contains zero, then we have
2929
         ~[-INF, min(MIN, MAX)].  */
2930
      if (vr0.type == VR_ANTI_RANGE)
2931
        {
2932
          if (range_includes_zero_p (&vr0))
2933
            {
2934
              /* Take the lower of the two values.  */
2935
              if (cmp != 1)
2936
                max = min;
2937
 
2938
              /* Create ~[-INF, min (abs(MIN), abs(MAX))]
2939
                 or ~[-INF + 1, min (abs(MIN), abs(MAX))] when
2940
                 flag_wrapv is set and the original anti-range doesn't include
2941
                 TYPE_MIN_VALUE, remember -TYPE_MIN_VALUE = TYPE_MIN_VALUE.  */
2942
              if (TYPE_OVERFLOW_WRAPS (type))
2943
                {
2944
                  tree type_min_value = TYPE_MIN_VALUE (type);
2945
 
2946
                  min = (vr0.min != type_min_value
2947
                         ? int_const_binop (PLUS_EXPR, type_min_value,
2948
                                            integer_one_node, 0)
2949
                         : type_min_value);
2950
                }
2951
              else
2952
                {
2953
                  if (overflow_infinity_range_p (&vr0))
2954
                    min = negative_overflow_infinity (type);
2955
                  else
2956
                    min = TYPE_MIN_VALUE (type);
2957
                }
2958
            }
2959
          else
2960
            {
2961
              /* All else has failed, so create the range [0, INF], even for
2962
                 flag_wrapv since TYPE_MIN_VALUE is in the original
2963
                 anti-range.  */
2964
              vr0.type = VR_RANGE;
2965
              min = build_int_cst (type, 0);
2966
              if (needs_overflow_infinity (type))
2967
                {
2968
                  if (supports_overflow_infinity (type))
2969
                    max = positive_overflow_infinity (type);
2970
                  else
2971
                    {
2972
                      set_value_range_to_varying (vr);
2973
                      return;
2974
                    }
2975
                }
2976
              else
2977
                max = TYPE_MAX_VALUE (type);
2978
            }
2979
        }
2980
 
2981
      /* If the range contains zero then we know that the minimum value in the
2982
         range will be zero.  */
2983
      else if (range_includes_zero_p (&vr0))
2984
        {
2985
          if (cmp == 1)
2986
            max = min;
2987
          min = build_int_cst (type, 0);
2988
        }
2989
      else
2990
        {
2991
          /* If the range was reversed, swap MIN and MAX.  */
2992
          if (cmp == 1)
2993
            {
2994
              tree t = min;
2995
              min = max;
2996
              max = t;
2997
            }
2998
        }
2999
    }
3000
  else
3001
    {
3002
      /* Otherwise, operate on each end of the range.  */
3003
      min = fold_unary_to_constant (code, type, vr0.min);
3004
      max = fold_unary_to_constant (code, type, vr0.max);
3005
 
3006
      if (needs_overflow_infinity (type))
3007
        {
3008
          gcc_assert (code != NEGATE_EXPR && code != ABS_EXPR);
3009
 
3010
          /* If both sides have overflowed, we don't know
3011
             anything.  */
3012
          if ((is_overflow_infinity (vr0.min)
3013
               || TREE_OVERFLOW (min))
3014
              && (is_overflow_infinity (vr0.max)
3015
                  || TREE_OVERFLOW (max)))
3016
            {
3017
              set_value_range_to_varying (vr);
3018
              return;
3019
            }
3020
 
3021
          if (is_overflow_infinity (vr0.min))
3022
            min = vr0.min;
3023
          else if (TREE_OVERFLOW (min))
3024
            {
3025
              if (supports_overflow_infinity (type))
3026
                min = (tree_int_cst_sgn (min) >= 0
3027
                       ? positive_overflow_infinity (TREE_TYPE (min))
3028
                       : negative_overflow_infinity (TREE_TYPE (min)));
3029
              else
3030
                {
3031
                  set_value_range_to_varying (vr);
3032
                  return;
3033
                }
3034
            }
3035
 
3036
          if (is_overflow_infinity (vr0.max))
3037
            max = vr0.max;
3038
          else if (TREE_OVERFLOW (max))
3039
            {
3040
              if (supports_overflow_infinity (type))
3041
                max = (tree_int_cst_sgn (max) >= 0
3042
                       ? positive_overflow_infinity (TREE_TYPE (max))
3043
                       : negative_overflow_infinity (TREE_TYPE (max)));
3044
              else
3045
                {
3046
                  set_value_range_to_varying (vr);
3047
                  return;
3048
                }
3049
            }
3050
        }
3051
    }
3052
 
3053
  cmp = compare_values (min, max);
3054
  if (cmp == -2 || cmp == 1)
3055
    {
3056
      /* If the new range has its limits swapped around (MIN > MAX),
3057
         then the operation caused one of them to wrap around, mark
3058
         the new range VARYING.  */
3059
      set_value_range_to_varying (vr);
3060
    }
3061
  else
3062
    set_value_range (vr, vr0.type, min, max, NULL);
3063
}
3064
 
3065
 
3066
/* Extract range information from a conditional expression EXPR based on
3067
   the ranges of each of its operands and the expression code.  */
3068
 
3069
static void
3070
extract_range_from_cond_expr (value_range_t *vr, tree expr)
3071
{
3072
  tree op0, op1;
3073
  value_range_t vr0 = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
3074
  value_range_t vr1 = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
3075
 
3076
  /* Get value ranges for each operand.  For constant operands, create
3077
     a new value range with the operand to simplify processing.  */
3078
  op0 = COND_EXPR_THEN (expr);
3079
  if (TREE_CODE (op0) == SSA_NAME)
3080
    vr0 = *(get_value_range (op0));
3081
  else if (is_gimple_min_invariant (op0))
3082
    set_value_range_to_value (&vr0, op0, NULL);
3083
  else
3084
    set_value_range_to_varying (&vr0);
3085
 
3086
  op1 = COND_EXPR_ELSE (expr);
3087
  if (TREE_CODE (op1) == SSA_NAME)
3088
    vr1 = *(get_value_range (op1));
3089
  else if (is_gimple_min_invariant (op1))
3090
    set_value_range_to_value (&vr1, op1, NULL);
3091
  else
3092
    set_value_range_to_varying (&vr1);
3093
 
3094
  /* The resulting value range is the union of the operand ranges */
3095
  vrp_meet (&vr0, &vr1);
3096
  copy_value_range (vr, &vr0);
3097
}
3098
 
3099
 
3100
/* Extract range information from a comparison expression EXPR based
3101
   on the range of its operand and the expression code.  */
3102
 
3103
static void
3104
extract_range_from_comparison (value_range_t *vr, enum tree_code code,
3105
                               tree type, tree op0, tree op1)
3106
{
3107
  bool sop = false;
3108
  tree val;
3109
 
3110
  val = vrp_evaluate_conditional_warnv_with_ops (code, op0, op1, false, &sop,
3111
                                                 NULL);
3112
 
3113
  /* A disadvantage of using a special infinity as an overflow
3114
     representation is that we lose the ability to record overflow
3115
     when we don't have an infinity.  So we have to ignore a result
3116
     which relies on overflow.  */
3117
 
3118
  if (val && !is_overflow_infinity (val) && !sop)
3119
    {
3120
      /* Since this expression was found on the RHS of an assignment,
3121
         its type may be different from _Bool.  Convert VAL to EXPR's
3122
         type.  */
3123
      val = fold_convert (type, val);
3124
      if (is_gimple_min_invariant (val))
3125
        set_value_range_to_value (vr, val, vr->equiv);
3126
      else
3127
        set_value_range (vr, VR_RANGE, val, val, vr->equiv);
3128
    }
3129
  else
3130
    /* The result of a comparison is always true or false.  */
3131
    set_value_range_to_truthvalue (vr, type);
3132
}
3133
 
3134
/* Try to derive a nonnegative or nonzero range out of STMT relying
3135
   primarily on generic routines in fold in conjunction with range data.
3136
   Store the result in *VR */
3137
 
3138
static void
3139
extract_range_basic (value_range_t *vr, gimple stmt)
3140
{
3141
  bool sop = false;
3142
  tree type = gimple_expr_type (stmt);
3143
 
3144
  if (INTEGRAL_TYPE_P (type)
3145
      && gimple_stmt_nonnegative_warnv_p (stmt, &sop))
3146
    set_value_range_to_nonnegative (vr, type,
3147
                                    sop || stmt_overflow_infinity (stmt));
3148
  else if (vrp_stmt_computes_nonzero (stmt, &sop)
3149
           && !sop)
3150
    set_value_range_to_nonnull (vr, type);
3151
  else
3152
    set_value_range_to_varying (vr);
3153
}
3154
 
3155
 
3156
/* Try to compute a useful range out of assignment STMT and store it
3157
   in *VR.  */
3158
 
3159
static void
3160
extract_range_from_assignment (value_range_t *vr, gimple stmt)
3161
{
3162
  enum tree_code code = gimple_assign_rhs_code (stmt);
3163
 
3164
  if (code == ASSERT_EXPR)
3165
    extract_range_from_assert (vr, gimple_assign_rhs1 (stmt));
3166
  else if (code == SSA_NAME)
3167
    extract_range_from_ssa_name (vr, gimple_assign_rhs1 (stmt));
3168
  else if (TREE_CODE_CLASS (code) == tcc_binary
3169
           || code == TRUTH_AND_EXPR
3170
           || code == TRUTH_OR_EXPR
3171
           || code == TRUTH_XOR_EXPR)
3172
    extract_range_from_binary_expr (vr, gimple_assign_rhs_code (stmt),
3173
                                    gimple_expr_type (stmt),
3174
                                    gimple_assign_rhs1 (stmt),
3175
                                    gimple_assign_rhs2 (stmt));
3176
  else if (TREE_CODE_CLASS (code) == tcc_unary)
3177
    extract_range_from_unary_expr (vr, gimple_assign_rhs_code (stmt),
3178
                                   gimple_expr_type (stmt),
3179
                                   gimple_assign_rhs1 (stmt));
3180
  else if (code == COND_EXPR)
3181
    extract_range_from_cond_expr (vr, gimple_assign_rhs1 (stmt));
3182
  else if (TREE_CODE_CLASS (code) == tcc_comparison)
3183
    extract_range_from_comparison (vr, gimple_assign_rhs_code (stmt),
3184
                                   gimple_expr_type (stmt),
3185
                                   gimple_assign_rhs1 (stmt),
3186
                                   gimple_assign_rhs2 (stmt));
3187
  else if (get_gimple_rhs_class (code) == GIMPLE_SINGLE_RHS
3188
           && is_gimple_min_invariant (gimple_assign_rhs1 (stmt)))
3189
    set_value_range_to_value (vr, gimple_assign_rhs1 (stmt), NULL);
3190
  else
3191
    set_value_range_to_varying (vr);
3192
 
3193
  if (vr->type == VR_VARYING)
3194
    extract_range_basic (vr, stmt);
3195
}
3196
 
3197
/* Given a range VR, a LOOP and a variable VAR, determine whether it
3198
   would be profitable to adjust VR using scalar evolution information
3199
   for VAR.  If so, update VR with the new limits.  */
3200
 
3201
static void
3202
adjust_range_with_scev (value_range_t *vr, struct loop *loop,
3203
                        gimple stmt, tree var)
3204
{
3205
  tree init, step, chrec, tmin, tmax, min, max, type, tem;
3206
  enum ev_direction dir;
3207
 
3208
  /* TODO.  Don't adjust anti-ranges.  An anti-range may provide
3209
     better opportunities than a regular range, but I'm not sure.  */
3210
  if (vr->type == VR_ANTI_RANGE)
3211
    return;
3212
 
3213
  chrec = instantiate_parameters (loop, analyze_scalar_evolution (loop, var));
3214
 
3215
  /* Like in PR19590, scev can return a constant function.  */
3216
  if (is_gimple_min_invariant (chrec))
3217
    {
3218
      set_value_range_to_value (vr, chrec, vr->equiv);
3219
      return;
3220
    }
3221
 
3222
  if (TREE_CODE (chrec) != POLYNOMIAL_CHREC)
3223
    return;
3224
 
3225
  init = initial_condition_in_loop_num (chrec, loop->num);
3226
  tem = op_with_constant_singleton_value_range (init);
3227
  if (tem)
3228
    init = tem;
3229
  step = evolution_part_in_loop_num (chrec, loop->num);
3230
  tem = op_with_constant_singleton_value_range (step);
3231
  if (tem)
3232
    step = tem;
3233
 
3234
  /* If STEP is symbolic, we can't know whether INIT will be the
3235
     minimum or maximum value in the range.  Also, unless INIT is
3236
     a simple expression, compare_values and possibly other functions
3237
     in tree-vrp won't be able to handle it.  */
3238
  if (step == NULL_TREE
3239
      || !is_gimple_min_invariant (step)
3240
      || !valid_value_p (init))
3241
    return;
3242
 
3243
  dir = scev_direction (chrec);
3244
  if (/* Do not adjust ranges if we do not know whether the iv increases
3245
         or decreases,  ... */
3246
      dir == EV_DIR_UNKNOWN
3247
      /* ... or if it may wrap.  */
3248
      || scev_probably_wraps_p (init, step, stmt, get_chrec_loop (chrec),
3249
                                true))
3250
    return;
3251
 
3252
  /* We use TYPE_MIN_VALUE and TYPE_MAX_VALUE here instead of
3253
     negative_overflow_infinity and positive_overflow_infinity,
3254
     because we have concluded that the loop probably does not
3255
     wrap.  */
3256
 
3257
  type = TREE_TYPE (var);
3258
  if (POINTER_TYPE_P (type) || !TYPE_MIN_VALUE (type))
3259
    tmin = lower_bound_in_type (type, type);
3260
  else
3261
    tmin = TYPE_MIN_VALUE (type);
3262
  if (POINTER_TYPE_P (type) || !TYPE_MAX_VALUE (type))
3263
    tmax = upper_bound_in_type (type, type);
3264
  else
3265
    tmax = TYPE_MAX_VALUE (type);
3266
 
3267
  if (vr->type == VR_VARYING || vr->type == VR_UNDEFINED)
3268
    {
3269
      min = tmin;
3270
      max = tmax;
3271
 
3272
      /* For VARYING or UNDEFINED ranges, just about anything we get
3273
         from scalar evolutions should be better.  */
3274
 
3275
      if (dir == EV_DIR_DECREASES)
3276
        max = init;
3277
      else
3278
        min = init;
3279
 
3280
      /* If we would create an invalid range, then just assume we
3281
         know absolutely nothing.  This may be over-conservative,
3282
         but it's clearly safe, and should happen only in unreachable
3283
         parts of code, or for invalid programs.  */
3284
      if (compare_values (min, max) == 1)
3285
        return;
3286
 
3287
      set_value_range (vr, VR_RANGE, min, max, vr->equiv);
3288
    }
3289
  else if (vr->type == VR_RANGE)
3290
    {
3291
      min = vr->min;
3292
      max = vr->max;
3293
 
3294
      if (dir == EV_DIR_DECREASES)
3295
        {
3296
          /* INIT is the maximum value.  If INIT is lower than VR->MAX
3297
             but no smaller than VR->MIN, set VR->MAX to INIT.  */
3298
          if (compare_values (init, max) == -1)
3299
            {
3300
              max = init;
3301
 
3302
              /* If we just created an invalid range with the minimum
3303
                 greater than the maximum, we fail conservatively.
3304
                 This should happen only in unreachable
3305
                 parts of code, or for invalid programs.  */
3306
              if (compare_values (min, max) == 1)
3307
                return;
3308
            }
3309
 
3310
          /* According to the loop information, the variable does not
3311
             overflow.  If we think it does, probably because of an
3312
             overflow due to arithmetic on a different INF value,
3313
             reset now.  */
3314
          if (is_negative_overflow_infinity (min))
3315
            min = tmin;
3316
        }
3317
      else
3318
        {
3319
          /* If INIT is bigger than VR->MIN, set VR->MIN to INIT.  */
3320
          if (compare_values (init, min) == 1)
3321
            {
3322
              min = init;
3323
 
3324
              /* Again, avoid creating invalid range by failing.  */
3325
              if (compare_values (min, max) == 1)
3326
                return;
3327
            }
3328
 
3329
          if (is_positive_overflow_infinity (max))
3330
            max = tmax;
3331
        }
3332
 
3333
      set_value_range (vr, VR_RANGE, min, max, vr->equiv);
3334
    }
3335
}
3336
 
3337
/* Return true if VAR may overflow at STMT.  This checks any available
3338
   loop information to see if we can determine that VAR does not
3339
   overflow.  */
3340
 
3341
static bool
3342
vrp_var_may_overflow (tree var, gimple stmt)
3343
{
3344
  struct loop *l;
3345
  tree chrec, init, step;
3346
 
3347
  if (current_loops == NULL)
3348
    return true;
3349
 
3350
  l = loop_containing_stmt (stmt);
3351
  if (l == NULL
3352
      || !loop_outer (l))
3353
    return true;
3354
 
3355
  chrec = instantiate_parameters (l, analyze_scalar_evolution (l, var));
3356
  if (TREE_CODE (chrec) != POLYNOMIAL_CHREC)
3357
    return true;
3358
 
3359
  init = initial_condition_in_loop_num (chrec, l->num);
3360
  step = evolution_part_in_loop_num (chrec, l->num);
3361
 
3362
  if (step == NULL_TREE
3363
      || !is_gimple_min_invariant (step)
3364
      || !valid_value_p (init))
3365
    return true;
3366
 
3367
  /* If we get here, we know something useful about VAR based on the
3368
     loop information.  If it wraps, it may overflow.  */
3369
 
3370
  if (scev_probably_wraps_p (init, step, stmt, get_chrec_loop (chrec),
3371
                             true))
3372
    return true;
3373
 
3374
  if (dump_file && (dump_flags & TDF_DETAILS) != 0)
3375
    {
3376
      print_generic_expr (dump_file, var, 0);
3377
      fprintf (dump_file, ": loop information indicates does not overflow\n");
3378
    }
3379
 
3380
  return false;
3381
}
3382
 
3383
 
3384
/* Given two numeric value ranges VR0, VR1 and a comparison code COMP:
3385
 
3386
   - Return BOOLEAN_TRUE_NODE if VR0 COMP VR1 always returns true for
3387
     all the values in the ranges.
3388
 
3389
   - Return BOOLEAN_FALSE_NODE if the comparison always returns false.
3390
 
3391
   - Return NULL_TREE if it is not always possible to determine the
3392
     value of the comparison.
3393
 
3394
   Also set *STRICT_OVERFLOW_P to indicate whether a range with an
3395
   overflow infinity was used in the test.  */
3396
 
3397
 
3398
static tree
3399
compare_ranges (enum tree_code comp, value_range_t *vr0, value_range_t *vr1,
3400
                bool *strict_overflow_p)
3401
{
3402
  /* VARYING or UNDEFINED ranges cannot be compared.  */
3403
  if (vr0->type == VR_VARYING
3404
      || vr0->type == VR_UNDEFINED
3405
      || vr1->type == VR_VARYING
3406
      || vr1->type == VR_UNDEFINED)
3407
    return NULL_TREE;
3408
 
3409
  /* Anti-ranges need to be handled separately.  */
3410
  if (vr0->type == VR_ANTI_RANGE || vr1->type == VR_ANTI_RANGE)
3411
    {
3412
      /* If both are anti-ranges, then we cannot compute any
3413
         comparison.  */
3414
      if (vr0->type == VR_ANTI_RANGE && vr1->type == VR_ANTI_RANGE)
3415
        return NULL_TREE;
3416
 
3417
      /* These comparisons are never statically computable.  */
3418
      if (comp == GT_EXPR
3419
          || comp == GE_EXPR
3420
          || comp == LT_EXPR
3421
          || comp == LE_EXPR)
3422
        return NULL_TREE;
3423
 
3424
      /* Equality can be computed only between a range and an
3425
         anti-range.  ~[VAL1, VAL2] == [VAL1, VAL2] is always false.  */
3426
      if (vr0->type == VR_RANGE)
3427
        {
3428
          /* To simplify processing, make VR0 the anti-range.  */
3429
          value_range_t *tmp = vr0;
3430
          vr0 = vr1;
3431
          vr1 = tmp;
3432
        }
3433
 
3434
      gcc_assert (comp == NE_EXPR || comp == EQ_EXPR);
3435
 
3436
      if (compare_values_warnv (vr0->min, vr1->min, strict_overflow_p) == 0
3437
          && compare_values_warnv (vr0->max, vr1->max, strict_overflow_p) == 0)
3438
        return (comp == NE_EXPR) ? boolean_true_node : boolean_false_node;
3439
 
3440
      return NULL_TREE;
3441
    }
3442
 
3443
  if (!usable_range_p (vr0, strict_overflow_p)
3444
      || !usable_range_p (vr1, strict_overflow_p))
3445
    return NULL_TREE;
3446
 
3447
  /* Simplify processing.  If COMP is GT_EXPR or GE_EXPR, switch the
3448
     operands around and change the comparison code.  */
3449
  if (comp == GT_EXPR || comp == GE_EXPR)
3450
    {
3451
      value_range_t *tmp;
3452
      comp = (comp == GT_EXPR) ? LT_EXPR : LE_EXPR;
3453
      tmp = vr0;
3454
      vr0 = vr1;
3455
      vr1 = tmp;
3456
    }
3457
 
3458
  if (comp == EQ_EXPR)
3459
    {
3460
      /* Equality may only be computed if both ranges represent
3461
         exactly one value.  */
3462
      if (compare_values_warnv (vr0->min, vr0->max, strict_overflow_p) == 0
3463
          && compare_values_warnv (vr1->min, vr1->max, strict_overflow_p) == 0)
3464
        {
3465
          int cmp_min = compare_values_warnv (vr0->min, vr1->min,
3466
                                              strict_overflow_p);
3467
          int cmp_max = compare_values_warnv (vr0->max, vr1->max,
3468
                                              strict_overflow_p);
3469
          if (cmp_min == 0 && cmp_max == 0)
3470
            return boolean_true_node;
3471
          else if (cmp_min != -2 && cmp_max != -2)
3472
            return boolean_false_node;
3473
        }
3474
      /* If [V0_MIN, V1_MAX] < [V1_MIN, V1_MAX] then V0 != V1.  */
3475
      else if (compare_values_warnv (vr0->min, vr1->max,
3476
                                     strict_overflow_p) == 1
3477
               || compare_values_warnv (vr1->min, vr0->max,
3478
                                        strict_overflow_p) == 1)
3479
        return boolean_false_node;
3480
 
3481
      return NULL_TREE;
3482
    }
3483
  else if (comp == NE_EXPR)
3484
    {
3485
      int cmp1, cmp2;
3486
 
3487
      /* If VR0 is completely to the left or completely to the right
3488
         of VR1, they are always different.  Notice that we need to
3489
         make sure that both comparisons yield similar results to
3490
         avoid comparing values that cannot be compared at
3491
         compile-time.  */
3492
      cmp1 = compare_values_warnv (vr0->max, vr1->min, strict_overflow_p);
3493
      cmp2 = compare_values_warnv (vr0->min, vr1->max, strict_overflow_p);
3494
      if ((cmp1 == -1 && cmp2 == -1) || (cmp1 == 1 && cmp2 == 1))
3495
        return boolean_true_node;
3496
 
3497
      /* If VR0 and VR1 represent a single value and are identical,
3498
         return false.  */
3499
      else if (compare_values_warnv (vr0->min, vr0->max,
3500
                                     strict_overflow_p) == 0
3501
               && compare_values_warnv (vr1->min, vr1->max,
3502
                                        strict_overflow_p) == 0
3503
               && compare_values_warnv (vr0->min, vr1->min,
3504
                                        strict_overflow_p) == 0
3505
               && compare_values_warnv (vr0->max, vr1->max,
3506
                                        strict_overflow_p) == 0)
3507
        return boolean_false_node;
3508
 
3509
      /* Otherwise, they may or may not be different.  */
3510
      else
3511
        return NULL_TREE;
3512
    }
3513
  else if (comp == LT_EXPR || comp == LE_EXPR)
3514
    {
3515
      int tst;
3516
 
3517
      /* If VR0 is to the left of VR1, return true.  */
3518
      tst = compare_values_warnv (vr0->max, vr1->min, strict_overflow_p);
3519
      if ((comp == LT_EXPR && tst == -1)
3520
          || (comp == LE_EXPR && (tst == -1 || tst == 0)))
3521
        {
3522
          if (overflow_infinity_range_p (vr0)
3523
              || overflow_infinity_range_p (vr1))
3524
            *strict_overflow_p = true;
3525
          return boolean_true_node;
3526
        }
3527
 
3528
      /* If VR0 is to the right of VR1, return false.  */
3529
      tst = compare_values_warnv (vr0->min, vr1->max, strict_overflow_p);
3530
      if ((comp == LT_EXPR && (tst == 0 || tst == 1))
3531
          || (comp == LE_EXPR && tst == 1))
3532
        {
3533
          if (overflow_infinity_range_p (vr0)
3534
              || overflow_infinity_range_p (vr1))
3535
            *strict_overflow_p = true;
3536
          return boolean_false_node;
3537
        }
3538
 
3539
      /* Otherwise, we don't know.  */
3540
      return NULL_TREE;
3541
    }
3542
 
3543
  gcc_unreachable ();
3544
}
3545
 
3546
 
3547
/* Given a value range VR, a value VAL and a comparison code COMP, return
3548
   BOOLEAN_TRUE_NODE if VR COMP VAL always returns true for all the
3549
   values in VR.  Return BOOLEAN_FALSE_NODE if the comparison
3550
   always returns false.  Return NULL_TREE if it is not always
3551
   possible to determine the value of the comparison.  Also set
3552
   *STRICT_OVERFLOW_P to indicate whether a range with an overflow
3553
   infinity was used in the test.  */
3554
 
3555
static tree
3556
compare_range_with_value (enum tree_code comp, value_range_t *vr, tree val,
3557
                          bool *strict_overflow_p)
3558
{
3559
  if (vr->type == VR_VARYING || vr->type == VR_UNDEFINED)
3560
    return NULL_TREE;
3561
 
3562
  /* Anti-ranges need to be handled separately.  */
3563
  if (vr->type == VR_ANTI_RANGE)
3564
    {
3565
      /* For anti-ranges, the only predicates that we can compute at
3566
         compile time are equality and inequality.  */
3567
      if (comp == GT_EXPR
3568
          || comp == GE_EXPR
3569
          || comp == LT_EXPR
3570
          || comp == LE_EXPR)
3571
        return NULL_TREE;
3572
 
3573
      /* ~[VAL_1, VAL_2] OP VAL is known if VAL_1 <= VAL <= VAL_2.  */
3574
      if (value_inside_range (val, vr) == 1)
3575
        return (comp == NE_EXPR) ? boolean_true_node : boolean_false_node;
3576
 
3577
      return NULL_TREE;
3578
    }
3579
 
3580
  if (!usable_range_p (vr, strict_overflow_p))
3581
    return NULL_TREE;
3582
 
3583
  if (comp == EQ_EXPR)
3584
    {
3585
      /* EQ_EXPR may only be computed if VR represents exactly
3586
         one value.  */
3587
      if (compare_values_warnv (vr->min, vr->max, strict_overflow_p) == 0)
3588
        {
3589
          int cmp = compare_values_warnv (vr->min, val, strict_overflow_p);
3590
          if (cmp == 0)
3591
            return boolean_true_node;
3592
          else if (cmp == -1 || cmp == 1 || cmp == 2)
3593
            return boolean_false_node;
3594
        }
3595
      else if (compare_values_warnv (val, vr->min, strict_overflow_p) == -1
3596
               || compare_values_warnv (vr->max, val, strict_overflow_p) == -1)
3597
        return boolean_false_node;
3598
 
3599
      return NULL_TREE;
3600
    }
3601
  else if (comp == NE_EXPR)
3602
    {
3603
      /* If VAL is not inside VR, then they are always different.  */
3604
      if (compare_values_warnv (vr->max, val, strict_overflow_p) == -1
3605
          || compare_values_warnv (vr->min, val, strict_overflow_p) == 1)
3606
        return boolean_true_node;
3607
 
3608
      /* If VR represents exactly one value equal to VAL, then return
3609
         false.  */
3610
      if (compare_values_warnv (vr->min, vr->max, strict_overflow_p) == 0
3611
          && compare_values_warnv (vr->min, val, strict_overflow_p) == 0)
3612
        return boolean_false_node;
3613
 
3614
      /* Otherwise, they may or may not be different.  */
3615
      return NULL_TREE;
3616
    }
3617
  else if (comp == LT_EXPR || comp == LE_EXPR)
3618
    {
3619
      int tst;
3620
 
3621
      /* If VR is to the left of VAL, return true.  */
3622
      tst = compare_values_warnv (vr->max, val, strict_overflow_p);
3623
      if ((comp == LT_EXPR && tst == -1)
3624
          || (comp == LE_EXPR && (tst == -1 || tst == 0)))
3625
        {
3626
          if (overflow_infinity_range_p (vr))
3627
            *strict_overflow_p = true;
3628
          return boolean_true_node;
3629
        }
3630
 
3631
      /* If VR is to the right of VAL, return false.  */
3632
      tst = compare_values_warnv (vr->min, val, strict_overflow_p);
3633
      if ((comp == LT_EXPR && (tst == 0 || tst == 1))
3634
          || (comp == LE_EXPR && tst == 1))
3635
        {
3636
          if (overflow_infinity_range_p (vr))
3637
            *strict_overflow_p = true;
3638
          return boolean_false_node;
3639
        }
3640
 
3641
      /* Otherwise, we don't know.  */
3642
      return NULL_TREE;
3643
    }
3644
  else if (comp == GT_EXPR || comp == GE_EXPR)
3645
    {
3646
      int tst;
3647
 
3648
      /* If VR is to the right of VAL, return true.  */
3649
      tst = compare_values_warnv (vr->min, val, strict_overflow_p);
3650
      if ((comp == GT_EXPR && tst == 1)
3651
          || (comp == GE_EXPR && (tst == 0 || tst == 1)))
3652
        {
3653
          if (overflow_infinity_range_p (vr))
3654
            *strict_overflow_p = true;
3655
          return boolean_true_node;
3656
        }
3657
 
3658
      /* If VR is to the left of VAL, return false.  */
3659
      tst = compare_values_warnv (vr->max, val, strict_overflow_p);
3660
      if ((comp == GT_EXPR && (tst == -1 || tst == 0))
3661
          || (comp == GE_EXPR && tst == -1))
3662
        {
3663
          if (overflow_infinity_range_p (vr))
3664
            *strict_overflow_p = true;
3665
          return boolean_false_node;
3666
        }
3667
 
3668
      /* Otherwise, we don't know.  */
3669
      return NULL_TREE;
3670
    }
3671
 
3672
  gcc_unreachable ();
3673
}
3674
 
3675
 
3676
/* Debugging dumps.  */
3677
 
3678
void dump_value_range (FILE *, value_range_t *);
3679
void debug_value_range (value_range_t *);
3680
void dump_all_value_ranges (FILE *);
3681
void debug_all_value_ranges (void);
3682
void dump_vr_equiv (FILE *, bitmap);
3683
void debug_vr_equiv (bitmap);
3684
 
3685
 
3686
/* Dump value range VR to FILE.  */
3687
 
3688
void
3689
dump_value_range (FILE *file, value_range_t *vr)
3690
{
3691
  if (vr == NULL)
3692
    fprintf (file, "[]");
3693
  else if (vr->type == VR_UNDEFINED)
3694
    fprintf (file, "UNDEFINED");
3695
  else if (vr->type == VR_RANGE || vr->type == VR_ANTI_RANGE)
3696
    {
3697
      tree type = TREE_TYPE (vr->min);
3698
 
3699
      fprintf (file, "%s[", (vr->type == VR_ANTI_RANGE) ? "~" : "");
3700
 
3701
      if (is_negative_overflow_infinity (vr->min))
3702
        fprintf (file, "-INF(OVF)");
3703
      else if (INTEGRAL_TYPE_P (type)
3704
               && !TYPE_UNSIGNED (type)
3705
               && vrp_val_is_min (vr->min))
3706
        fprintf (file, "-INF");
3707
      else
3708
        print_generic_expr (file, vr->min, 0);
3709
 
3710
      fprintf (file, ", ");
3711
 
3712
      if (is_positive_overflow_infinity (vr->max))
3713
        fprintf (file, "+INF(OVF)");
3714
      else if (INTEGRAL_TYPE_P (type)
3715
               && vrp_val_is_max (vr->max))
3716
        fprintf (file, "+INF");
3717
      else
3718
        print_generic_expr (file, vr->max, 0);
3719
 
3720
      fprintf (file, "]");
3721
 
3722
      if (vr->equiv)
3723
        {
3724
          bitmap_iterator bi;
3725
          unsigned i, c = 0;
3726
 
3727
          fprintf (file, "  EQUIVALENCES: { ");
3728
 
3729
          EXECUTE_IF_SET_IN_BITMAP (vr->equiv, 0, i, bi)
3730
            {
3731
              print_generic_expr (file, ssa_name (i), 0);
3732
              fprintf (file, " ");
3733
              c++;
3734
            }
3735
 
3736
          fprintf (file, "} (%u elements)", c);
3737
        }
3738
    }
3739
  else if (vr->type == VR_VARYING)
3740
    fprintf (file, "VARYING");
3741
  else
3742
    fprintf (file, "INVALID RANGE");
3743
}
3744
 
3745
 
3746
/* Dump value range VR to stderr.  */
3747
 
3748
void
3749
debug_value_range (value_range_t *vr)
3750
{
3751
  dump_value_range (stderr, vr);
3752
  fprintf (stderr, "\n");
3753
}
3754
 
3755
 
3756
/* Dump value ranges of all SSA_NAMEs to FILE.  */
3757
 
3758
void
3759
dump_all_value_ranges (FILE *file)
3760
{
3761
  size_t i;
3762
 
3763
  for (i = 0; i < num_ssa_names; i++)
3764
    {
3765
      if (vr_value[i])
3766
        {
3767
          print_generic_expr (file, ssa_name (i), 0);
3768
          fprintf (file, ": ");
3769
          dump_value_range (file, vr_value[i]);
3770
          fprintf (file, "\n");
3771
        }
3772
    }
3773
 
3774
  fprintf (file, "\n");
3775
}
3776
 
3777
 
3778
/* Dump all value ranges to stderr.  */
3779
 
3780
void
3781
debug_all_value_ranges (void)
3782
{
3783
  dump_all_value_ranges (stderr);
3784
}
3785
 
3786
 
3787
/* Given a COND_EXPR COND of the form 'V OP W', and an SSA name V,
3788
   create a new SSA name N and return the assertion assignment
3789
   'V = ASSERT_EXPR <V, V OP W>'.  */
3790
 
3791
static gimple
3792
build_assert_expr_for (tree cond, tree v)
3793
{
3794
  tree n;
3795
  gimple assertion;
3796
 
3797
  gcc_assert (TREE_CODE (v) == SSA_NAME);
3798
  n = duplicate_ssa_name (v, NULL);
3799
 
3800
  if (COMPARISON_CLASS_P (cond))
3801
    {
3802
      tree a = build2 (ASSERT_EXPR, TREE_TYPE (v), v, cond);
3803
      assertion = gimple_build_assign (n, a);
3804
    }
3805
  else if (TREE_CODE (cond) == TRUTH_NOT_EXPR)
3806
    {
3807
      /* Given !V, build the assignment N = false.  */
3808
      tree op0 = TREE_OPERAND (cond, 0);
3809
      gcc_assert (op0 == v);
3810
      assertion = gimple_build_assign (n, boolean_false_node);
3811
    }
3812
  else if (TREE_CODE (cond) == SSA_NAME)
3813
    {
3814
      /* Given V, build the assignment N = true.  */
3815
      gcc_assert (v == cond);
3816
      assertion = gimple_build_assign (n, boolean_true_node);
3817
    }
3818
  else
3819
    gcc_unreachable ();
3820
 
3821
  SSA_NAME_DEF_STMT (n) = assertion;
3822
 
3823
  /* The new ASSERT_EXPR, creates a new SSA name that replaces the
3824
     operand of the ASSERT_EXPR. Register the new name and the old one
3825
     in the replacement table so that we can fix the SSA web after
3826
     adding all the ASSERT_EXPRs.  */
3827
  register_new_name_mapping (n, v);
3828
 
3829
  return assertion;
3830
}
3831
 
3832
 
3833
/* Return false if EXPR is a predicate expression involving floating
3834
   point values.  */
3835
 
3836
static inline bool
3837
fp_predicate (gimple stmt)
3838
{
3839
  GIMPLE_CHECK (stmt, GIMPLE_COND);
3840
 
3841
  return FLOAT_TYPE_P (TREE_TYPE (gimple_cond_lhs (stmt)));
3842
}
3843
 
3844
 
3845
/* If the range of values taken by OP can be inferred after STMT executes,
3846
   return the comparison code (COMP_CODE_P) and value (VAL_P) that
3847
   describes the inferred range.  Return true if a range could be
3848
   inferred.  */
3849
 
3850
static bool
3851
infer_value_range (gimple stmt, tree op, enum tree_code *comp_code_p, tree *val_p)
3852
{
3853
  *val_p = NULL_TREE;
3854
  *comp_code_p = ERROR_MARK;
3855
 
3856
  /* Do not attempt to infer anything in names that flow through
3857
     abnormal edges.  */
3858
  if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op))
3859
    return false;
3860
 
3861
  /* Similarly, don't infer anything from statements that may throw
3862
     exceptions.  */
3863
  if (stmt_could_throw_p (stmt))
3864
    return false;
3865
 
3866
  /* If STMT is the last statement of a basic block with no
3867
     successors, there is no point inferring anything about any of its
3868
     operands.  We would not be able to find a proper insertion point
3869
     for the assertion, anyway.  */
3870
  if (stmt_ends_bb_p (stmt) && EDGE_COUNT (gimple_bb (stmt)->succs) == 0)
3871
    return false;
3872
 
3873
  /* We can only assume that a pointer dereference will yield
3874
     non-NULL if -fdelete-null-pointer-checks is enabled.  */
3875
  if (flag_delete_null_pointer_checks
3876
      && POINTER_TYPE_P (TREE_TYPE (op))
3877
      && gimple_code (stmt) != GIMPLE_ASM)
3878
    {
3879
      unsigned num_uses, num_loads, num_stores;
3880
 
3881
      count_uses_and_derefs (op, stmt, &num_uses, &num_loads, &num_stores);
3882
      if (num_loads + num_stores > 0)
3883
        {
3884
          *val_p = build_int_cst (TREE_TYPE (op), 0);
3885
          *comp_code_p = NE_EXPR;
3886
          return true;
3887
        }
3888
    }
3889
 
3890
  return false;
3891
}
3892
 
3893
 
3894
void dump_asserts_for (FILE *, tree);
3895
void debug_asserts_for (tree);
3896
void dump_all_asserts (FILE *);
3897
void debug_all_asserts (void);
3898
 
3899
/* Dump all the registered assertions for NAME to FILE.  */
3900
 
3901
void
3902
dump_asserts_for (FILE *file, tree name)
3903
{
3904
  assert_locus_t loc;
3905
 
3906
  fprintf (file, "Assertions to be inserted for ");
3907
  print_generic_expr (file, name, 0);
3908
  fprintf (file, "\n");
3909
 
3910
  loc = asserts_for[SSA_NAME_VERSION (name)];
3911
  while (loc)
3912
    {
3913
      fprintf (file, "\t");
3914
      print_gimple_stmt (file, gsi_stmt (loc->si), 0, 0);
3915
      fprintf (file, "\n\tBB #%d", loc->bb->index);
3916
      if (loc->e)
3917
        {
3918
          fprintf (file, "\n\tEDGE %d->%d", loc->e->src->index,
3919
                   loc->e->dest->index);
3920
          dump_edge_info (file, loc->e, 0);
3921
        }
3922
      fprintf (file, "\n\tPREDICATE: ");
3923
      print_generic_expr (file, name, 0);
3924
      fprintf (file, " %s ", tree_code_name[(int)loc->comp_code]);
3925
      print_generic_expr (file, loc->val, 0);
3926
      fprintf (file, "\n\n");
3927
      loc = loc->next;
3928
    }
3929
 
3930
  fprintf (file, "\n");
3931
}
3932
 
3933
 
3934
/* Dump all the registered assertions for NAME to stderr.  */
3935
 
3936
void
3937
debug_asserts_for (tree name)
3938
{
3939
  dump_asserts_for (stderr, name);
3940
}
3941
 
3942
 
3943
/* Dump all the registered assertions for all the names to FILE.  */
3944
 
3945
void
3946
dump_all_asserts (FILE *file)
3947
{
3948
  unsigned i;
3949
  bitmap_iterator bi;
3950
 
3951
  fprintf (file, "\nASSERT_EXPRs to be inserted\n\n");
3952
  EXECUTE_IF_SET_IN_BITMAP (need_assert_for, 0, i, bi)
3953
    dump_asserts_for (file, ssa_name (i));
3954
  fprintf (file, "\n");
3955
}
3956
 
3957
 
3958
/* Dump all the registered assertions for all the names to stderr.  */
3959
 
3960
void
3961
debug_all_asserts (void)
3962
{
3963
  dump_all_asserts (stderr);
3964
}
3965
 
3966
 
3967
/* If NAME doesn't have an ASSERT_EXPR registered for asserting
3968
   'EXPR COMP_CODE VAL' at a location that dominates block BB or
3969
   E->DEST, then register this location as a possible insertion point
3970
   for ASSERT_EXPR <NAME, EXPR COMP_CODE VAL>.
3971
 
3972
   BB, E and SI provide the exact insertion point for the new
3973
   ASSERT_EXPR.  If BB is NULL, then the ASSERT_EXPR is to be inserted
3974
   on edge E.  Otherwise, if E is NULL, the ASSERT_EXPR is inserted on
3975
   BB.  If SI points to a COND_EXPR or a SWITCH_EXPR statement, then E
3976
   must not be NULL.  */
3977
 
3978
static void
3979
register_new_assert_for (tree name, tree expr,
3980
                         enum tree_code comp_code,
3981
                         tree val,
3982
                         basic_block bb,
3983
                         edge e,
3984
                         gimple_stmt_iterator si)
3985
{
3986
  assert_locus_t n, loc, last_loc;
3987
  basic_block dest_bb;
3988
 
3989
#if defined ENABLE_CHECKING
3990
  gcc_assert (bb == NULL || e == NULL);
3991
 
3992
  if (e == NULL)
3993
    gcc_assert (gimple_code (gsi_stmt (si)) != GIMPLE_COND
3994
                && gimple_code (gsi_stmt (si)) != GIMPLE_SWITCH);
3995
#endif
3996
 
3997
  /* Never build an assert comparing against an integer constant with
3998
     TREE_OVERFLOW set.  This confuses our undefined overflow warning
3999
     machinery.  */
4000
  if (TREE_CODE (val) == INTEGER_CST
4001
      && TREE_OVERFLOW (val))
4002
    val = build_int_cst_wide (TREE_TYPE (val),
4003
                              TREE_INT_CST_LOW (val), TREE_INT_CST_HIGH (val));
4004
 
4005
  /* The new assertion A will be inserted at BB or E.  We need to
4006
     determine if the new location is dominated by a previously
4007
     registered location for A.  If we are doing an edge insertion,
4008
     assume that A will be inserted at E->DEST.  Note that this is not
4009
     necessarily true.
4010
 
4011
     If E is a critical edge, it will be split.  But even if E is
4012
     split, the new block will dominate the same set of blocks that
4013
     E->DEST dominates.
4014
 
4015
     The reverse, however, is not true, blocks dominated by E->DEST
4016
     will not be dominated by the new block created to split E.  So,
4017
     if the insertion location is on a critical edge, we will not use
4018
     the new location to move another assertion previously registered
4019
     at a block dominated by E->DEST.  */
4020
  dest_bb = (bb) ? bb : e->dest;
4021
 
4022
  /* If NAME already has an ASSERT_EXPR registered for COMP_CODE and
4023
     VAL at a block dominating DEST_BB, then we don't need to insert a new
4024
     one.  Similarly, if the same assertion already exists at a block
4025
     dominated by DEST_BB and the new location is not on a critical
4026
     edge, then update the existing location for the assertion (i.e.,
4027
     move the assertion up in the dominance tree).
4028
 
4029
     Note, this is implemented as a simple linked list because there
4030
     should not be more than a handful of assertions registered per
4031
     name.  If this becomes a performance problem, a table hashed by
4032
     COMP_CODE and VAL could be implemented.  */
4033
  loc = asserts_for[SSA_NAME_VERSION (name)];
4034
  last_loc = loc;
4035
  while (loc)
4036
    {
4037
      if (loc->comp_code == comp_code
4038
          && (loc->val == val
4039
              || operand_equal_p (loc->val, val, 0))
4040
          && (loc->expr == expr
4041
              || operand_equal_p (loc->expr, expr, 0)))
4042
        {
4043
          /* If the assertion NAME COMP_CODE VAL has already been
4044
             registered at a basic block that dominates DEST_BB, then
4045
             we don't need to insert the same assertion again.  Note
4046
             that we don't check strict dominance here to avoid
4047
             replicating the same assertion inside the same basic
4048
             block more than once (e.g., when a pointer is
4049
             dereferenced several times inside a block).
4050
 
4051
             An exception to this rule are edge insertions.  If the
4052
             new assertion is to be inserted on edge E, then it will
4053
             dominate all the other insertions that we may want to
4054
             insert in DEST_BB.  So, if we are doing an edge
4055
             insertion, don't do this dominance check.  */
4056
          if (e == NULL
4057
              && dominated_by_p (CDI_DOMINATORS, dest_bb, loc->bb))
4058
            return;
4059
 
4060
          /* Otherwise, if E is not a critical edge and DEST_BB
4061
             dominates the existing location for the assertion, move
4062
             the assertion up in the dominance tree by updating its
4063
             location information.  */
4064
          if ((e == NULL || !EDGE_CRITICAL_P (e))
4065
              && dominated_by_p (CDI_DOMINATORS, loc->bb, dest_bb))
4066
            {
4067
              loc->bb = dest_bb;
4068
              loc->e = e;
4069
              loc->si = si;
4070
              return;
4071
            }
4072
        }
4073
 
4074
      /* Update the last node of the list and move to the next one.  */
4075
      last_loc = loc;
4076
      loc = loc->next;
4077
    }
4078
 
4079
  /* If we didn't find an assertion already registered for
4080
     NAME COMP_CODE VAL, add a new one at the end of the list of
4081
     assertions associated with NAME.  */
4082
  n = XNEW (struct assert_locus_d);
4083
  n->bb = dest_bb;
4084
  n->e = e;
4085
  n->si = si;
4086
  n->comp_code = comp_code;
4087
  n->val = val;
4088
  n->expr = expr;
4089
  n->next = NULL;
4090
 
4091
  if (last_loc)
4092
    last_loc->next = n;
4093
  else
4094
    asserts_for[SSA_NAME_VERSION (name)] = n;
4095
 
4096
  bitmap_set_bit (need_assert_for, SSA_NAME_VERSION (name));
4097
}
4098
 
4099
/* (COND_OP0 COND_CODE COND_OP1) is a predicate which uses NAME.
4100
   Extract a suitable test code and value and store them into *CODE_P and
4101
   *VAL_P so the predicate is normalized to NAME *CODE_P *VAL_P.
4102
 
4103
   If no extraction was possible, return FALSE, otherwise return TRUE.
4104
 
4105
   If INVERT is true, then we invert the result stored into *CODE_P.  */
4106
 
4107
static bool
4108
extract_code_and_val_from_cond_with_ops (tree name, enum tree_code cond_code,
4109
                                         tree cond_op0, tree cond_op1,
4110
                                         bool invert, enum tree_code *code_p,
4111
                                         tree *val_p)
4112
{
4113
  enum tree_code comp_code;
4114
  tree val;
4115
 
4116
  /* Otherwise, we have a comparison of the form NAME COMP VAL
4117
     or VAL COMP NAME.  */
4118
  if (name == cond_op1)
4119
    {
4120
      /* If the predicate is of the form VAL COMP NAME, flip
4121
         COMP around because we need to register NAME as the
4122
         first operand in the predicate.  */
4123
      comp_code = swap_tree_comparison (cond_code);
4124
      val = cond_op0;
4125
    }
4126
  else
4127
    {
4128
      /* The comparison is of the form NAME COMP VAL, so the
4129
         comparison code remains unchanged.  */
4130
      comp_code = cond_code;
4131
      val = cond_op1;
4132
    }
4133
 
4134
  /* Invert the comparison code as necessary.  */
4135
  if (invert)
4136
    comp_code = invert_tree_comparison (comp_code, 0);
4137
 
4138
  /* VRP does not handle float types.  */
4139
  if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (val)))
4140
    return false;
4141
 
4142
  /* Do not register always-false predicates.
4143
     FIXME:  this works around a limitation in fold() when dealing with
4144
     enumerations.  Given 'enum { N1, N2 } x;', fold will not
4145
     fold 'if (x > N2)' to 'if (0)'.  */
4146
  if ((comp_code == GT_EXPR || comp_code == LT_EXPR)
4147
      && INTEGRAL_TYPE_P (TREE_TYPE (val)))
4148
    {
4149
      tree min = TYPE_MIN_VALUE (TREE_TYPE (val));
4150
      tree max = TYPE_MAX_VALUE (TREE_TYPE (val));
4151
 
4152
      if (comp_code == GT_EXPR
4153
          && (!max
4154
              || compare_values (val, max) == 0))
4155
        return false;
4156
 
4157
      if (comp_code == LT_EXPR
4158
          && (!min
4159
              || compare_values (val, min) == 0))
4160
        return false;
4161
    }
4162
  *code_p = comp_code;
4163
  *val_p = val;
4164
  return true;
4165
}
4166
 
4167
/* Try to register an edge assertion for SSA name NAME on edge E for
4168
   the condition COND contributing to the conditional jump pointed to by BSI.
4169
   Invert the condition COND if INVERT is true.
4170
   Return true if an assertion for NAME could be registered.  */
4171
 
4172
static bool
4173
register_edge_assert_for_2 (tree name, edge e, gimple_stmt_iterator bsi,
4174
                            enum tree_code cond_code,
4175
                            tree cond_op0, tree cond_op1, bool invert)
4176
{
4177
  tree val;
4178
  enum tree_code comp_code;
4179
  bool retval = false;
4180
 
4181
  if (!extract_code_and_val_from_cond_with_ops (name, cond_code,
4182
                                                cond_op0,
4183
                                                cond_op1,
4184
                                                invert, &comp_code, &val))
4185
    return false;
4186
 
4187
  /* Only register an ASSERT_EXPR if NAME was found in the sub-graph
4188
     reachable from E.  */
4189
  if (live_on_edge (e, name)
4190
      && !has_single_use (name))
4191
    {
4192
      register_new_assert_for (name, name, comp_code, val, NULL, e, bsi);
4193
      retval = true;
4194
    }
4195
 
4196
  /* In the case of NAME <= CST and NAME being defined as
4197
     NAME = (unsigned) NAME2 + CST2 we can assert NAME2 >= -CST2
4198
     and NAME2 <= CST - CST2.  We can do the same for NAME > CST.
4199
     This catches range and anti-range tests.  */
4200
  if ((comp_code == LE_EXPR
4201
       || comp_code == GT_EXPR)
4202
      && TREE_CODE (val) == INTEGER_CST
4203
      && TYPE_UNSIGNED (TREE_TYPE (val)))
4204
    {
4205
      gimple def_stmt = SSA_NAME_DEF_STMT (name);
4206
      tree cst2 = NULL_TREE, name2 = NULL_TREE, name3 = NULL_TREE;
4207
 
4208
      /* Extract CST2 from the (optional) addition.  */
4209
      if (is_gimple_assign (def_stmt)
4210
          && gimple_assign_rhs_code (def_stmt) == PLUS_EXPR)
4211
        {
4212
          name2 = gimple_assign_rhs1 (def_stmt);
4213
          cst2 = gimple_assign_rhs2 (def_stmt);
4214
          if (TREE_CODE (name2) == SSA_NAME
4215
              && TREE_CODE (cst2) == INTEGER_CST)
4216
            def_stmt = SSA_NAME_DEF_STMT (name2);
4217
        }
4218
 
4219
      /* Extract NAME2 from the (optional) sign-changing cast.  */
4220
      if (gimple_assign_cast_p (def_stmt))
4221
        {
4222
          if (CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (def_stmt))
4223
              && ! TYPE_UNSIGNED (TREE_TYPE (gimple_assign_rhs1 (def_stmt)))
4224
              && (TYPE_PRECISION (gimple_expr_type (def_stmt))
4225
                  == TYPE_PRECISION (TREE_TYPE (gimple_assign_rhs1 (def_stmt)))))
4226
            name3 = gimple_assign_rhs1 (def_stmt);
4227
        }
4228
 
4229
      /* If name3 is used later, create an ASSERT_EXPR for it.  */
4230
      if (name3 != NULL_TREE
4231
          && TREE_CODE (name3) == SSA_NAME
4232
          && (cst2 == NULL_TREE
4233
              || TREE_CODE (cst2) == INTEGER_CST)
4234
          && INTEGRAL_TYPE_P (TREE_TYPE (name3))
4235
          && live_on_edge (e, name3)
4236
          && !has_single_use (name3))
4237
        {
4238
          tree tmp;
4239
 
4240
          /* Build an expression for the range test.  */
4241
          tmp = build1 (NOP_EXPR, TREE_TYPE (name), name3);
4242
          if (cst2 != NULL_TREE)
4243
            tmp = build2 (PLUS_EXPR, TREE_TYPE (name), tmp, cst2);
4244
 
4245
          if (dump_file)
4246
            {
4247
              fprintf (dump_file, "Adding assert for ");
4248
              print_generic_expr (dump_file, name3, 0);
4249
              fprintf (dump_file, " from ");
4250
              print_generic_expr (dump_file, tmp, 0);
4251
              fprintf (dump_file, "\n");
4252
            }
4253
 
4254
          register_new_assert_for (name3, tmp, comp_code, val, NULL, e, bsi);
4255
 
4256
          retval = true;
4257
        }
4258
 
4259
      /* If name2 is used later, create an ASSERT_EXPR for it.  */
4260
      if (name2 != NULL_TREE
4261
          && TREE_CODE (name2) == SSA_NAME
4262
          && TREE_CODE (cst2) == INTEGER_CST
4263
          && INTEGRAL_TYPE_P (TREE_TYPE (name2))
4264
          && live_on_edge (e, name2)
4265
          && !has_single_use (name2))
4266
        {
4267
          tree tmp;
4268
 
4269
          /* Build an expression for the range test.  */
4270
          tmp = name2;
4271
          if (TREE_TYPE (name) != TREE_TYPE (name2))
4272
            tmp = build1 (NOP_EXPR, TREE_TYPE (name), tmp);
4273
          if (cst2 != NULL_TREE)
4274
            tmp = build2 (PLUS_EXPR, TREE_TYPE (name), tmp, cst2);
4275
 
4276
          if (dump_file)
4277
            {
4278
              fprintf (dump_file, "Adding assert for ");
4279
              print_generic_expr (dump_file, name2, 0);
4280
              fprintf (dump_file, " from ");
4281
              print_generic_expr (dump_file, tmp, 0);
4282
              fprintf (dump_file, "\n");
4283
            }
4284
 
4285
          register_new_assert_for (name2, tmp, comp_code, val, NULL, e, bsi);
4286
 
4287
          retval = true;
4288
        }
4289
    }
4290
 
4291
  return retval;
4292
}
4293
 
4294
/* OP is an operand of a truth value expression which is known to have
4295
   a particular value.  Register any asserts for OP and for any
4296
   operands in OP's defining statement.
4297
 
4298
   If CODE is EQ_EXPR, then we want to register OP is zero (false),
4299
   if CODE is NE_EXPR, then we want to register OP is nonzero (true).   */
4300
 
4301
static bool
4302
register_edge_assert_for_1 (tree op, enum tree_code code,
4303
                            edge e, gimple_stmt_iterator bsi)
4304
{
4305
  bool retval = false;
4306
  gimple op_def;
4307
  tree val;
4308
  enum tree_code rhs_code;
4309
 
4310
  /* We only care about SSA_NAMEs.  */
4311
  if (TREE_CODE (op) != SSA_NAME)
4312
    return false;
4313
 
4314
  /* We know that OP will have a zero or nonzero value.  If OP is used
4315
     more than once go ahead and register an assert for OP.
4316
 
4317
     The FOUND_IN_SUBGRAPH support is not helpful in this situation as
4318
     it will always be set for OP (because OP is used in a COND_EXPR in
4319
     the subgraph).  */
4320
  if (!has_single_use (op))
4321
    {
4322
      val = build_int_cst (TREE_TYPE (op), 0);
4323
      register_new_assert_for (op, op, code, val, NULL, e, bsi);
4324
      retval = true;
4325
    }
4326
 
4327
  /* Now look at how OP is set.  If it's set from a comparison,
4328
     a truth operation or some bit operations, then we may be able
4329
     to register information about the operands of that assignment.  */
4330
  op_def = SSA_NAME_DEF_STMT (op);
4331
  if (gimple_code (op_def) != GIMPLE_ASSIGN)
4332
    return retval;
4333
 
4334
  rhs_code = gimple_assign_rhs_code (op_def);
4335
 
4336
  if (TREE_CODE_CLASS (rhs_code) == tcc_comparison)
4337
    {
4338
      bool invert = (code == EQ_EXPR ? true : false);
4339
      tree op0 = gimple_assign_rhs1 (op_def);
4340
      tree op1 = gimple_assign_rhs2 (op_def);
4341
 
4342
      if (TREE_CODE (op0) == SSA_NAME)
4343
        retval |= register_edge_assert_for_2 (op0, e, bsi, rhs_code, op0, op1,
4344
                                              invert);
4345
      if (TREE_CODE (op1) == SSA_NAME)
4346
        retval |= register_edge_assert_for_2 (op1, e, bsi, rhs_code, op0, op1,
4347
                                              invert);
4348
    }
4349
  else if ((code == NE_EXPR
4350
            && (gimple_assign_rhs_code (op_def) == TRUTH_AND_EXPR
4351
                || gimple_assign_rhs_code (op_def) == BIT_AND_EXPR))
4352
           || (code == EQ_EXPR
4353
               && (gimple_assign_rhs_code (op_def) == TRUTH_OR_EXPR
4354
                   || gimple_assign_rhs_code (op_def) == BIT_IOR_EXPR)))
4355
    {
4356
      /* Recurse on each operand.  */
4357
      retval |= register_edge_assert_for_1 (gimple_assign_rhs1 (op_def),
4358
                                            code, e, bsi);
4359
      retval |= register_edge_assert_for_1 (gimple_assign_rhs2 (op_def),
4360
                                            code, e, bsi);
4361
    }
4362
  else if (gimple_assign_rhs_code (op_def) == TRUTH_NOT_EXPR)
4363
    {
4364
      /* Recurse, flipping CODE.  */
4365
      code = invert_tree_comparison (code, false);
4366
      retval |= register_edge_assert_for_1 (gimple_assign_rhs1 (op_def),
4367
                                            code, e, bsi);
4368
    }
4369
  else if (gimple_assign_rhs_code (op_def) == SSA_NAME)
4370
    {
4371
      /* Recurse through the copy.  */
4372
      retval |= register_edge_assert_for_1 (gimple_assign_rhs1 (op_def),
4373
                                            code, e, bsi);
4374
    }
4375
  else if (CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (op_def)))
4376
    {
4377
      /* Recurse through the type conversion.  */
4378
      retval |= register_edge_assert_for_1 (gimple_assign_rhs1 (op_def),
4379
                                            code, e, bsi);
4380
    }
4381
 
4382
  return retval;
4383
}
4384
 
4385
/* Try to register an edge assertion for SSA name NAME on edge E for
4386
   the condition COND contributing to the conditional jump pointed to by SI.
4387
   Return true if an assertion for NAME could be registered.  */
4388
 
4389
static bool
4390
register_edge_assert_for (tree name, edge e, gimple_stmt_iterator si,
4391
                          enum tree_code cond_code, tree cond_op0,
4392
                          tree cond_op1)
4393
{
4394
  tree val;
4395
  enum tree_code comp_code;
4396
  bool retval = false;
4397
  bool is_else_edge = (e->flags & EDGE_FALSE_VALUE) != 0;
4398
 
4399
  /* Do not attempt to infer anything in names that flow through
4400
     abnormal edges.  */
4401
  if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name))
4402
    return false;
4403
 
4404
  if (!extract_code_and_val_from_cond_with_ops (name, cond_code,
4405
                                                cond_op0, cond_op1,
4406
                                                is_else_edge,
4407
                                                &comp_code, &val))
4408
    return false;
4409
 
4410
  /* Register ASSERT_EXPRs for name.  */
4411
  retval |= register_edge_assert_for_2 (name, e, si, cond_code, cond_op0,
4412
                                        cond_op1, is_else_edge);
4413
 
4414
 
4415
  /* If COND is effectively an equality test of an SSA_NAME against
4416
     the value zero or one, then we may be able to assert values
4417
     for SSA_NAMEs which flow into COND.  */
4418
 
4419
  /* In the case of NAME == 1 or NAME != 0, for TRUTH_AND_EXPR defining
4420
     statement of NAME we can assert both operands of the TRUTH_AND_EXPR
4421
     have nonzero value.  */
4422
  if (((comp_code == EQ_EXPR && integer_onep (val))
4423
       || (comp_code == NE_EXPR && integer_zerop (val))))
4424
    {
4425
      gimple def_stmt = SSA_NAME_DEF_STMT (name);
4426
 
4427
      if (is_gimple_assign (def_stmt)
4428
          && (gimple_assign_rhs_code (def_stmt) == TRUTH_AND_EXPR
4429
              || gimple_assign_rhs_code (def_stmt) == BIT_AND_EXPR))
4430
        {
4431
          tree op0 = gimple_assign_rhs1 (def_stmt);
4432
          tree op1 = gimple_assign_rhs2 (def_stmt);
4433
          retval |= register_edge_assert_for_1 (op0, NE_EXPR, e, si);
4434
          retval |= register_edge_assert_for_1 (op1, NE_EXPR, e, si);
4435
        }
4436
    }
4437
 
4438
  /* In the case of NAME == 0 or NAME != 1, for TRUTH_OR_EXPR defining
4439
     statement of NAME we can assert both operands of the TRUTH_OR_EXPR
4440
     have zero value.  */
4441
  if (((comp_code == EQ_EXPR && integer_zerop (val))
4442
       || (comp_code == NE_EXPR && integer_onep (val))))
4443
    {
4444
      gimple def_stmt = SSA_NAME_DEF_STMT (name);
4445
 
4446
      if (is_gimple_assign (def_stmt)
4447
          && (gimple_assign_rhs_code (def_stmt) == TRUTH_OR_EXPR
4448
              /* For BIT_IOR_EXPR only if NAME == 0 both operands have
4449
                 necessarily zero value.  */
4450
              || (comp_code == EQ_EXPR
4451
                  && (gimple_assign_rhs_code (def_stmt) == BIT_IOR_EXPR))))
4452
        {
4453
          tree op0 = gimple_assign_rhs1 (def_stmt);
4454
          tree op1 = gimple_assign_rhs2 (def_stmt);
4455
          retval |= register_edge_assert_for_1 (op0, EQ_EXPR, e, si);
4456
          retval |= register_edge_assert_for_1 (op1, EQ_EXPR, e, si);
4457
        }
4458
    }
4459
 
4460
  return retval;
4461
}
4462
 
4463
 
4464
/* Determine whether the outgoing edges of BB should receive an
4465
   ASSERT_EXPR for each of the operands of BB's LAST statement.
4466
   The last statement of BB must be a COND_EXPR.
4467
 
4468
   If any of the sub-graphs rooted at BB have an interesting use of
4469
   the predicate operands, an assert location node is added to the
4470
   list of assertions for the corresponding operands.  */
4471
 
4472
static bool
4473
find_conditional_asserts (basic_block bb, gimple last)
4474
{
4475
  bool need_assert;
4476
  gimple_stmt_iterator bsi;
4477
  tree op;
4478
  edge_iterator ei;
4479
  edge e;
4480
  ssa_op_iter iter;
4481
 
4482
  need_assert = false;
4483
  bsi = gsi_for_stmt (last);
4484
 
4485
  /* Look for uses of the operands in each of the sub-graphs
4486
     rooted at BB.  We need to check each of the outgoing edges
4487
     separately, so that we know what kind of ASSERT_EXPR to
4488
     insert.  */
4489
  FOR_EACH_EDGE (e, ei, bb->succs)
4490
    {
4491
      if (e->dest == bb)
4492
        continue;
4493
 
4494
      /* Register the necessary assertions for each operand in the
4495
         conditional predicate.  */
4496
      FOR_EACH_SSA_TREE_OPERAND (op, last, iter, SSA_OP_USE)
4497
        {
4498
          need_assert |= register_edge_assert_for (op, e, bsi,
4499
                                                   gimple_cond_code (last),
4500
                                                   gimple_cond_lhs (last),
4501
                                                   gimple_cond_rhs (last));
4502
        }
4503
    }
4504
 
4505
  return need_assert;
4506
}
4507
 
4508
/* Compare two case labels sorting first by the destination label uid
4509
   and then by the case value.  */
4510
 
4511
static int
4512
compare_case_labels (const void *p1, const void *p2)
4513
{
4514
  const_tree const case1 = *(const_tree const*)p1;
4515
  const_tree const case2 = *(const_tree const*)p2;
4516
  unsigned int uid1 = DECL_UID (CASE_LABEL (case1));
4517
  unsigned int uid2 = DECL_UID (CASE_LABEL (case2));
4518
 
4519
  if (uid1 < uid2)
4520
    return -1;
4521
  else if (uid1 == uid2)
4522
    {
4523
      /* Make sure the default label is first in a group.  */
4524
      if (!CASE_LOW (case1))
4525
        return -1;
4526
      else if (!CASE_LOW (case2))
4527
        return 1;
4528
      else
4529
        return tree_int_cst_compare (CASE_LOW (case1), CASE_LOW (case2));
4530
    }
4531
  else
4532
    return 1;
4533
}
4534
 
4535
/* Determine whether the outgoing edges of BB should receive an
4536
   ASSERT_EXPR for each of the operands of BB's LAST statement.
4537
   The last statement of BB must be a SWITCH_EXPR.
4538
 
4539
   If any of the sub-graphs rooted at BB have an interesting use of
4540
   the predicate operands, an assert location node is added to the
4541
   list of assertions for the corresponding operands.  */
4542
 
4543
static bool
4544
find_switch_asserts (basic_block bb, gimple last)
4545
{
4546
  bool need_assert;
4547
  gimple_stmt_iterator bsi;
4548
  tree op;
4549
  edge e;
4550
  tree vec2;
4551
  size_t n = gimple_switch_num_labels(last);
4552
#if GCC_VERSION >= 4000
4553
  unsigned int idx;
4554
#else
4555
  /* Work around GCC 3.4 bug (PR 37086).  */
4556
  volatile unsigned int idx;
4557
#endif
4558
 
4559
  need_assert = false;
4560
  bsi = gsi_for_stmt (last);
4561
  op = gimple_switch_index (last);
4562
  if (TREE_CODE (op) != SSA_NAME)
4563
    return false;
4564
 
4565
  /* Build a vector of case labels sorted by destination label.  */
4566
  vec2 = make_tree_vec (n);
4567
  for (idx = 0; idx < n; ++idx)
4568
    TREE_VEC_ELT (vec2, idx) = gimple_switch_label (last, idx);
4569
  qsort (&TREE_VEC_ELT (vec2, 0), n, sizeof (tree), compare_case_labels);
4570
 
4571
  for (idx = 0; idx < n; ++idx)
4572
    {
4573
      tree min, max;
4574
      tree cl = TREE_VEC_ELT (vec2, idx);
4575
 
4576
      min = CASE_LOW (cl);
4577
      max = CASE_HIGH (cl);
4578
 
4579
      /* If there are multiple case labels with the same destination
4580
         we need to combine them to a single value range for the edge.  */
4581
      if (idx + 1 < n
4582
          && CASE_LABEL (cl) == CASE_LABEL (TREE_VEC_ELT (vec2, idx + 1)))
4583
        {
4584
          /* Skip labels until the last of the group.  */
4585
          do {
4586
            ++idx;
4587
          } while (idx < n
4588
                   && CASE_LABEL (cl) == CASE_LABEL (TREE_VEC_ELT (vec2, idx)));
4589
          --idx;
4590
 
4591
          /* Pick up the maximum of the case label range.  */
4592
          if (CASE_HIGH (TREE_VEC_ELT (vec2, idx)))
4593
            max = CASE_HIGH (TREE_VEC_ELT (vec2, idx));
4594
          else
4595
            max = CASE_LOW (TREE_VEC_ELT (vec2, idx));
4596
        }
4597
 
4598
      /* Nothing to do if the range includes the default label until we
4599
         can register anti-ranges.  */
4600
      if (min == NULL_TREE)
4601
        continue;
4602
 
4603
      /* Find the edge to register the assert expr on.  */
4604
      e = find_edge (bb, label_to_block (CASE_LABEL (cl)));
4605
 
4606
      /* Register the necessary assertions for the operand in the
4607
         SWITCH_EXPR.  */
4608
      need_assert |= register_edge_assert_for (op, e, bsi,
4609
                                               max ? GE_EXPR : EQ_EXPR,
4610
                                               op,
4611
                                               fold_convert (TREE_TYPE (op),
4612
                                                             min));
4613
      if (max)
4614
        {
4615
          need_assert |= register_edge_assert_for (op, e, bsi, LE_EXPR,
4616
                                                   op,
4617
                                                   fold_convert (TREE_TYPE (op),
4618
                                                                 max));
4619
        }
4620
    }
4621
 
4622
  return need_assert;
4623
}
4624
 
4625
 
4626
/* Traverse all the statements in block BB looking for statements that
4627
   may generate useful assertions for the SSA names in their operand.
4628
   If a statement produces a useful assertion A for name N_i, then the
4629
   list of assertions already generated for N_i is scanned to
4630
   determine if A is actually needed.
4631
 
4632
   If N_i already had the assertion A at a location dominating the
4633
   current location, then nothing needs to be done.  Otherwise, the
4634
   new location for A is recorded instead.
4635
 
4636
   1- For every statement S in BB, all the variables used by S are
4637
      added to bitmap FOUND_IN_SUBGRAPH.
4638
 
4639
   2- If statement S uses an operand N in a way that exposes a known
4640
      value range for N, then if N was not already generated by an
4641
      ASSERT_EXPR, create a new assert location for N.  For instance,
4642
      if N is a pointer and the statement dereferences it, we can
4643
      assume that N is not NULL.
4644
 
4645
   3- COND_EXPRs are a special case of #2.  We can derive range
4646
      information from the predicate but need to insert different
4647
      ASSERT_EXPRs for each of the sub-graphs rooted at the
4648
      conditional block.  If the last statement of BB is a conditional
4649
      expression of the form 'X op Y', then
4650
 
4651
      a) Remove X and Y from the set FOUND_IN_SUBGRAPH.
4652
 
4653
      b) If the conditional is the only entry point to the sub-graph
4654
         corresponding to the THEN_CLAUSE, recurse into it.  On
4655
         return, if X and/or Y are marked in FOUND_IN_SUBGRAPH, then
4656
         an ASSERT_EXPR is added for the corresponding variable.
4657
 
4658
      c) Repeat step (b) on the ELSE_CLAUSE.
4659
 
4660
      d) Mark X and Y in FOUND_IN_SUBGRAPH.
4661
 
4662
      For instance,
4663
 
4664
            if (a == 9)
4665
              b = a;
4666
            else
4667
              b = c + 1;
4668
 
4669
      In this case, an assertion on the THEN clause is useful to
4670
      determine that 'a' is always 9 on that edge.  However, an assertion
4671
      on the ELSE clause would be unnecessary.
4672
 
4673
   4- If BB does not end in a conditional expression, then we recurse
4674
      into BB's dominator children.
4675
 
4676
   At the end of the recursive traversal, every SSA name will have a
4677
   list of locations where ASSERT_EXPRs should be added.  When a new
4678
   location for name N is found, it is registered by calling
4679
   register_new_assert_for.  That function keeps track of all the
4680
   registered assertions to prevent adding unnecessary assertions.
4681
   For instance, if a pointer P_4 is dereferenced more than once in a
4682
   dominator tree, only the location dominating all the dereference of
4683
   P_4 will receive an ASSERT_EXPR.
4684
 
4685
   If this function returns true, then it means that there are names
4686
   for which we need to generate ASSERT_EXPRs.  Those assertions are
4687
   inserted by process_assert_insertions.  */
4688
 
4689
static bool
4690
find_assert_locations_1 (basic_block bb, sbitmap live)
4691
{
4692
  gimple_stmt_iterator si;
4693
  gimple last;
4694
  gimple phi;
4695
  bool need_assert;
4696
 
4697
  need_assert = false;
4698
  last = last_stmt (bb);
4699
 
4700
  /* If BB's last statement is a conditional statement involving integer
4701
     operands, determine if we need to add ASSERT_EXPRs.  */
4702
  if (last
4703
      && gimple_code (last) == GIMPLE_COND
4704
      && !fp_predicate (last)
4705
      && !ZERO_SSA_OPERANDS (last, SSA_OP_USE))
4706
    need_assert |= find_conditional_asserts (bb, last);
4707
 
4708
  /* If BB's last statement is a switch statement involving integer
4709
     operands, determine if we need to add ASSERT_EXPRs.  */
4710
  if (last
4711
      && gimple_code (last) == GIMPLE_SWITCH
4712
      && !ZERO_SSA_OPERANDS (last, SSA_OP_USE))
4713
    need_assert |= find_switch_asserts (bb, last);
4714
 
4715
  /* Traverse all the statements in BB marking used names and looking
4716
     for statements that may infer assertions for their used operands.  */
4717
  for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
4718
    {
4719
      gimple stmt;
4720
      tree op;
4721
      ssa_op_iter i;
4722
 
4723
      stmt = gsi_stmt (si);
4724
 
4725
      if (is_gimple_debug (stmt))
4726
        continue;
4727
 
4728
      /* See if we can derive an assertion for any of STMT's operands.  */
4729
      FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_USE)
4730
        {
4731
          tree value;
4732
          enum tree_code comp_code;
4733
 
4734
          /* Mark OP in our live bitmap.  */
4735
          SET_BIT (live, SSA_NAME_VERSION (op));
4736
 
4737
          /* If OP is used in such a way that we can infer a value
4738
             range for it, and we don't find a previous assertion for
4739
             it, create a new assertion location node for OP.  */
4740
          if (infer_value_range (stmt, op, &comp_code, &value))
4741
            {
4742
              /* If we are able to infer a nonzero value range for OP,
4743
                 then walk backwards through the use-def chain to see if OP
4744
                 was set via a typecast.
4745
 
4746
                 If so, then we can also infer a nonzero value range
4747
                 for the operand of the NOP_EXPR.  */
4748
              if (comp_code == NE_EXPR && integer_zerop (value))
4749
                {
4750
                  tree t = op;
4751
                  gimple def_stmt = SSA_NAME_DEF_STMT (t);
4752
 
4753
                  while (is_gimple_assign (def_stmt)
4754
                         && gimple_assign_rhs_code (def_stmt)  == NOP_EXPR
4755
                         && TREE_CODE
4756
                             (gimple_assign_rhs1 (def_stmt)) == SSA_NAME
4757
                         && POINTER_TYPE_P
4758
                             (TREE_TYPE (gimple_assign_rhs1 (def_stmt))))
4759
                    {
4760
                      t = gimple_assign_rhs1 (def_stmt);
4761
                      def_stmt = SSA_NAME_DEF_STMT (t);
4762
 
4763
                      /* Note we want to register the assert for the
4764
                         operand of the NOP_EXPR after SI, not after the
4765
                         conversion.  */
4766
                      if (! has_single_use (t))
4767
                        {
4768
                          register_new_assert_for (t, t, comp_code, value,
4769
                                                   bb, NULL, si);
4770
                          need_assert = true;
4771
                        }
4772
                    }
4773
                }
4774
 
4775
              /* If OP is used only once, namely in this STMT, don't
4776
                 bother creating an ASSERT_EXPR for it.  Such an
4777
                 ASSERT_EXPR would do nothing but increase compile time.  */
4778
              if (!has_single_use (op))
4779
                {
4780
                  register_new_assert_for (op, op, comp_code, value,
4781
                                           bb, NULL, si);
4782
                  need_assert = true;
4783
                }
4784
            }
4785
        }
4786
    }
4787
 
4788
  /* Traverse all PHI nodes in BB marking used operands.  */
4789
  for (si = gsi_start_phis (bb); !gsi_end_p(si); gsi_next (&si))
4790
    {
4791
      use_operand_p arg_p;
4792
      ssa_op_iter i;
4793
      phi = gsi_stmt (si);
4794
 
4795
      FOR_EACH_PHI_ARG (arg_p, phi, i, SSA_OP_USE)
4796
        {
4797
          tree arg = USE_FROM_PTR (arg_p);
4798
          if (TREE_CODE (arg) == SSA_NAME)
4799
            SET_BIT (live, SSA_NAME_VERSION (arg));
4800
        }
4801
    }
4802
 
4803
  return need_assert;
4804
}
4805
 
4806
/* Do an RPO walk over the function computing SSA name liveness
4807
   on-the-fly and deciding on assert expressions to insert.
4808
   Returns true if there are assert expressions to be inserted.  */
4809
 
4810
static bool
4811
find_assert_locations (void)
4812
{
4813
  int *rpo = XCNEWVEC (int, last_basic_block + NUM_FIXED_BLOCKS);
4814
  int *bb_rpo = XCNEWVEC (int, last_basic_block + NUM_FIXED_BLOCKS);
4815
  int *last_rpo = XCNEWVEC (int, last_basic_block + NUM_FIXED_BLOCKS);
4816
  int rpo_cnt, i;
4817
  bool need_asserts;
4818
 
4819
  live = XCNEWVEC (sbitmap, last_basic_block + NUM_FIXED_BLOCKS);
4820
  rpo_cnt = pre_and_rev_post_order_compute (NULL, rpo, false);
4821
  for (i = 0; i < rpo_cnt; ++i)
4822
    bb_rpo[rpo[i]] = i;
4823
 
4824
  need_asserts = false;
4825
  for (i = rpo_cnt-1; i >= 0; --i)
4826
    {
4827
      basic_block bb = BASIC_BLOCK (rpo[i]);
4828
      edge e;
4829
      edge_iterator ei;
4830
 
4831
      if (!live[rpo[i]])
4832
        {
4833
          live[rpo[i]] = sbitmap_alloc (num_ssa_names);
4834
          sbitmap_zero (live[rpo[i]]);
4835
        }
4836
 
4837
      /* Process BB and update the live information with uses in
4838
         this block.  */
4839
      need_asserts |= find_assert_locations_1 (bb, live[rpo[i]]);
4840
 
4841
      /* Merge liveness into the predecessor blocks and free it.  */
4842
      if (!sbitmap_empty_p (live[rpo[i]]))
4843
        {
4844
          int pred_rpo = i;
4845
          FOR_EACH_EDGE (e, ei, bb->preds)
4846
            {
4847
              int pred = e->src->index;
4848
              if (e->flags & EDGE_DFS_BACK)
4849
                continue;
4850
 
4851
              if (!live[pred])
4852
                {
4853
                  live[pred] = sbitmap_alloc (num_ssa_names);
4854
                  sbitmap_zero (live[pred]);
4855
                }
4856
              sbitmap_a_or_b (live[pred], live[pred], live[rpo[i]]);
4857
 
4858
              if (bb_rpo[pred] < pred_rpo)
4859
                pred_rpo = bb_rpo[pred];
4860
            }
4861
 
4862
          /* Record the RPO number of the last visited block that needs
4863
             live information from this block.  */
4864
          last_rpo[rpo[i]] = pred_rpo;
4865
        }
4866
      else
4867
        {
4868
          sbitmap_free (live[rpo[i]]);
4869
          live[rpo[i]] = NULL;
4870
        }
4871
 
4872
      /* We can free all successors live bitmaps if all their
4873
         predecessors have been visited already.  */
4874
      FOR_EACH_EDGE (e, ei, bb->succs)
4875
        if (last_rpo[e->dest->index] == i
4876
            && live[e->dest->index])
4877
          {
4878
            sbitmap_free (live[e->dest->index]);
4879
            live[e->dest->index] = NULL;
4880
          }
4881
    }
4882
 
4883
  XDELETEVEC (rpo);
4884
  XDELETEVEC (bb_rpo);
4885
  XDELETEVEC (last_rpo);
4886
  for (i = 0; i < last_basic_block + NUM_FIXED_BLOCKS; ++i)
4887
    if (live[i])
4888
      sbitmap_free (live[i]);
4889
  XDELETEVEC (live);
4890
 
4891
  return need_asserts;
4892
}
4893
 
4894
/* Create an ASSERT_EXPR for NAME and insert it in the location
4895
   indicated by LOC.  Return true if we made any edge insertions.  */
4896
 
4897
static bool
4898
process_assert_insertions_for (tree name, assert_locus_t loc)
4899
{
4900
  /* Build the comparison expression NAME_i COMP_CODE VAL.  */
4901
  gimple stmt;
4902
  tree cond;
4903
  gimple assert_stmt;
4904
  edge_iterator ei;
4905
  edge e;
4906
 
4907
  /* If we have X <=> X do not insert an assert expr for that.  */
4908
  if (loc->expr == loc->val)
4909
    return false;
4910
 
4911
  cond = build2 (loc->comp_code, boolean_type_node, loc->expr, loc->val);
4912
  assert_stmt = build_assert_expr_for (cond, name);
4913
  if (loc->e)
4914
    {
4915
      /* We have been asked to insert the assertion on an edge.  This
4916
         is used only by COND_EXPR and SWITCH_EXPR assertions.  */
4917
#if defined ENABLE_CHECKING
4918
      gcc_assert (gimple_code (gsi_stmt (loc->si)) == GIMPLE_COND
4919
          || gimple_code (gsi_stmt (loc->si)) == GIMPLE_SWITCH);
4920
#endif
4921
 
4922
      gsi_insert_on_edge (loc->e, assert_stmt);
4923
      return true;
4924
    }
4925
 
4926
  /* Otherwise, we can insert right after LOC->SI iff the
4927
     statement must not be the last statement in the block.  */
4928
  stmt = gsi_stmt (loc->si);
4929
  if (!stmt_ends_bb_p (stmt))
4930
    {
4931
      gsi_insert_after (&loc->si, assert_stmt, GSI_SAME_STMT);
4932
      return false;
4933
    }
4934
 
4935
  /* If STMT must be the last statement in BB, we can only insert new
4936
     assertions on the non-abnormal edge out of BB.  Note that since
4937
     STMT is not control flow, there may only be one non-abnormal edge
4938
     out of BB.  */
4939
  FOR_EACH_EDGE (e, ei, loc->bb->succs)
4940
    if (!(e->flags & EDGE_ABNORMAL))
4941
      {
4942
        gsi_insert_on_edge (e, assert_stmt);
4943
        return true;
4944
      }
4945
 
4946
  gcc_unreachable ();
4947
}
4948
 
4949
 
4950
/* Process all the insertions registered for every name N_i registered
4951
   in NEED_ASSERT_FOR.  The list of assertions to be inserted are
4952
   found in ASSERTS_FOR[i].  */
4953
 
4954
static void
4955
process_assert_insertions (void)
4956
{
4957
  unsigned i;
4958
  bitmap_iterator bi;
4959
  bool update_edges_p = false;
4960
  int num_asserts = 0;
4961
 
4962
  if (dump_file && (dump_flags & TDF_DETAILS))
4963
    dump_all_asserts (dump_file);
4964
 
4965
  EXECUTE_IF_SET_IN_BITMAP (need_assert_for, 0, i, bi)
4966
    {
4967
      assert_locus_t loc = asserts_for[i];
4968
      gcc_assert (loc);
4969
 
4970
      while (loc)
4971
        {
4972
          assert_locus_t next = loc->next;
4973
          update_edges_p |= process_assert_insertions_for (ssa_name (i), loc);
4974
          free (loc);
4975
          loc = next;
4976
          num_asserts++;
4977
        }
4978
    }
4979
 
4980
  if (update_edges_p)
4981
    gsi_commit_edge_inserts ();
4982
 
4983
  statistics_counter_event (cfun, "Number of ASSERT_EXPR expressions inserted",
4984
                            num_asserts);
4985
}
4986
 
4987
 
4988
/* Traverse the flowgraph looking for conditional jumps to insert range
4989
   expressions.  These range expressions are meant to provide information
4990
   to optimizations that need to reason in terms of value ranges.  They
4991
   will not be expanded into RTL.  For instance, given:
4992
 
4993
   x = ...
4994
   y = ...
4995
   if (x < y)
4996
     y = x - 2;
4997
   else
4998
     x = y + 3;
4999
 
5000
   this pass will transform the code into:
5001
 
5002
   x = ...
5003
   y = ...
5004
   if (x < y)
5005
    {
5006
      x = ASSERT_EXPR <x, x < y>
5007
      y = x - 2
5008
    }
5009
   else
5010
    {
5011
      y = ASSERT_EXPR <y, x <= y>
5012
      x = y + 3
5013
    }
5014
 
5015
   The idea is that once copy and constant propagation have run, other
5016
   optimizations will be able to determine what ranges of values can 'x'
5017
   take in different paths of the code, simply by checking the reaching
5018
   definition of 'x'.  */
5019
 
5020
static void
5021
insert_range_assertions (void)
5022
{
5023
  need_assert_for = BITMAP_ALLOC (NULL);
5024
  asserts_for = XCNEWVEC (assert_locus_t, num_ssa_names);
5025
 
5026
  calculate_dominance_info (CDI_DOMINATORS);
5027
 
5028
  if (find_assert_locations ())
5029
    {
5030
      process_assert_insertions ();
5031
      update_ssa (TODO_update_ssa_no_phi);
5032
    }
5033
 
5034
  if (dump_file && (dump_flags & TDF_DETAILS))
5035
    {
5036
      fprintf (dump_file, "\nSSA form after inserting ASSERT_EXPRs\n");
5037
      dump_function_to_file (current_function_decl, dump_file, dump_flags);
5038
    }
5039
 
5040
  free (asserts_for);
5041
  BITMAP_FREE (need_assert_for);
5042
}
5043
 
5044
/* Checks one ARRAY_REF in REF, located at LOCUS. Ignores flexible arrays
5045
   and "struct" hacks. If VRP can determine that the
5046
   array subscript is a constant, check if it is outside valid
5047
   range. If the array subscript is a RANGE, warn if it is
5048
   non-overlapping with valid range.
5049
   IGNORE_OFF_BY_ONE is true if the ARRAY_REF is inside a ADDR_EXPR.  */
5050
 
5051
static void
5052
check_array_ref (location_t location, tree ref, bool ignore_off_by_one)
5053
{
5054
  value_range_t* vr = NULL;
5055
  tree low_sub, up_sub;
5056
  tree low_bound, up_bound = array_ref_up_bound (ref);
5057
 
5058
  low_sub = up_sub = TREE_OPERAND (ref, 1);
5059
 
5060
  if (!up_bound || TREE_NO_WARNING (ref)
5061
      || TREE_CODE (up_bound) != INTEGER_CST
5062
      /* Can not check flexible arrays.  */
5063
      || (TYPE_SIZE (TREE_TYPE (ref)) == NULL_TREE
5064
          && TYPE_DOMAIN (TREE_TYPE (ref)) != NULL_TREE
5065
          && TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (ref))) == NULL_TREE)
5066
      /* Accesses after the end of arrays of size 0 (gcc
5067
         extension) and 1 are likely intentional ("struct
5068
         hack").  */
5069
      || compare_tree_int (up_bound, 1) <= 0)
5070
    return;
5071
 
5072
  low_bound = array_ref_low_bound (ref);
5073
 
5074
  if (TREE_CODE (low_sub) == SSA_NAME)
5075
    {
5076
      vr = get_value_range (low_sub);
5077
      if (vr->type == VR_RANGE || vr->type == VR_ANTI_RANGE)
5078
        {
5079
          low_sub = vr->type == VR_RANGE ? vr->max : vr->min;
5080
          up_sub = vr->type == VR_RANGE ? vr->min : vr->max;
5081
        }
5082
    }
5083
 
5084
  if (vr && vr->type == VR_ANTI_RANGE)
5085
    {
5086
      if (TREE_CODE (up_sub) == INTEGER_CST
5087
          && tree_int_cst_lt (up_bound, up_sub)
5088
          && TREE_CODE (low_sub) == INTEGER_CST
5089
          && tree_int_cst_lt (low_sub, low_bound))
5090
        {
5091
          warning_at (location, OPT_Warray_bounds,
5092
                      "array subscript is outside array bounds");
5093
          TREE_NO_WARNING (ref) = 1;
5094
        }
5095
    }
5096
  else if (TREE_CODE (up_sub) == INTEGER_CST
5097
           && tree_int_cst_lt (up_bound, up_sub)
5098
           && !tree_int_cst_equal (up_bound, up_sub)
5099
           && (!ignore_off_by_one
5100
               || !tree_int_cst_equal (int_const_binop (PLUS_EXPR,
5101
                                                        up_bound,
5102
                                                        integer_one_node,
5103
                                                        0),
5104
                                       up_sub)))
5105
    {
5106
      warning_at (location, OPT_Warray_bounds,
5107
                  "array subscript is above array bounds");
5108
      TREE_NO_WARNING (ref) = 1;
5109
    }
5110
  else if (TREE_CODE (low_sub) == INTEGER_CST
5111
           && tree_int_cst_lt (low_sub, low_bound))
5112
    {
5113
      warning_at (location, OPT_Warray_bounds,
5114
                  "array subscript is below array bounds");
5115
      TREE_NO_WARNING (ref) = 1;
5116
    }
5117
}
5118
 
5119
/* Searches if the expr T, located at LOCATION computes
5120
   address of an ARRAY_REF, and call check_array_ref on it.  */
5121
 
5122
static void
5123
search_for_addr_array (tree t, location_t location)
5124
{
5125
  while (TREE_CODE (t) == SSA_NAME)
5126
    {
5127
      gimple g = SSA_NAME_DEF_STMT (t);
5128
 
5129
      if (gimple_code (g) != GIMPLE_ASSIGN)
5130
        return;
5131
 
5132
      if (get_gimple_rhs_class (gimple_assign_rhs_code (g))
5133
          != GIMPLE_SINGLE_RHS)
5134
        return;
5135
 
5136
      t = gimple_assign_rhs1 (g);
5137
    }
5138
 
5139
 
5140
  /* We are only interested in addresses of ARRAY_REF's.  */
5141
  if (TREE_CODE (t) != ADDR_EXPR)
5142
    return;
5143
 
5144
  /* Check each ARRAY_REFs in the reference chain. */
5145
  do
5146
    {
5147
      if (TREE_CODE (t) == ARRAY_REF)
5148
        check_array_ref (location, t, true /*ignore_off_by_one*/);
5149
 
5150
      t = TREE_OPERAND (t, 0);
5151
    }
5152
  while (handled_component_p (t));
5153
}
5154
 
5155
/* walk_tree() callback that checks if *TP is
5156
   an ARRAY_REF inside an ADDR_EXPR (in which an array
5157
   subscript one outside the valid range is allowed). Call
5158
   check_array_ref for each ARRAY_REF found. The location is
5159
   passed in DATA.  */
5160
 
5161
static tree
5162
check_array_bounds (tree *tp, int *walk_subtree, void *data)
5163
{
5164
  tree t = *tp;
5165
  struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
5166
  location_t location;
5167
 
5168
  if (EXPR_HAS_LOCATION (t))
5169
    location = EXPR_LOCATION (t);
5170
  else
5171
    {
5172
      location_t *locp = (location_t *) wi->info;
5173
      location = *locp;
5174
    }
5175
 
5176
  *walk_subtree = TRUE;
5177
 
5178
  if (TREE_CODE (t) == ARRAY_REF)
5179
    check_array_ref (location, t, false /*ignore_off_by_one*/);
5180
 
5181
  if (TREE_CODE (t) == INDIRECT_REF
5182
      || (TREE_CODE (t) == RETURN_EXPR && TREE_OPERAND (t, 0)))
5183
    search_for_addr_array (TREE_OPERAND (t, 0), location);
5184
 
5185
  if (TREE_CODE (t) == ADDR_EXPR)
5186
    *walk_subtree = FALSE;
5187
 
5188
  return NULL_TREE;
5189
}
5190
 
5191
/* Walk over all statements of all reachable BBs and call check_array_bounds
5192
   on them.  */
5193
 
5194
static void
5195
check_all_array_refs (void)
5196
{
5197
  basic_block bb;
5198
  gimple_stmt_iterator si;
5199
 
5200
  FOR_EACH_BB (bb)
5201
    {
5202
      edge_iterator ei;
5203
      edge e;
5204
      bool executable = false;
5205
 
5206
      /* Skip blocks that were found to be unreachable.  */
5207
      FOR_EACH_EDGE (e, ei, bb->preds)
5208
        executable |= !!(e->flags & EDGE_EXECUTABLE);
5209
      if (!executable)
5210
        continue;
5211
 
5212
      for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
5213
        {
5214
          gimple stmt = gsi_stmt (si);
5215
          struct walk_stmt_info wi;
5216
          if (!gimple_has_location (stmt))
5217
            continue;
5218
 
5219
          if (is_gimple_call (stmt))
5220
            {
5221
              size_t i;
5222
              size_t n = gimple_call_num_args (stmt);
5223
              for (i = 0; i < n; i++)
5224
                {
5225
                  tree arg = gimple_call_arg (stmt, i);
5226
                  search_for_addr_array (arg, gimple_location (stmt));
5227
                }
5228
            }
5229
          else
5230
            {
5231
              memset (&wi, 0, sizeof (wi));
5232
              wi.info = CONST_CAST (void *, (const void *)
5233
                                    gimple_location_ptr (stmt));
5234
 
5235
              walk_gimple_op (gsi_stmt (si),
5236
                              check_array_bounds,
5237
                              &wi);
5238
            }
5239
        }
5240
    }
5241
}
5242
 
5243
/* Convert range assertion expressions into the implied copies and
5244
   copy propagate away the copies.  Doing the trivial copy propagation
5245
   here avoids the need to run the full copy propagation pass after
5246
   VRP.
5247
 
5248
   FIXME, this will eventually lead to copy propagation removing the
5249
   names that had useful range information attached to them.  For
5250
   instance, if we had the assertion N_i = ASSERT_EXPR <N_j, N_j > 3>,
5251
   then N_i will have the range [3, +INF].
5252
 
5253
   However, by converting the assertion into the implied copy
5254
   operation N_i = N_j, we will then copy-propagate N_j into the uses
5255
   of N_i and lose the range information.  We may want to hold on to
5256
   ASSERT_EXPRs a little while longer as the ranges could be used in
5257
   things like jump threading.
5258
 
5259
   The problem with keeping ASSERT_EXPRs around is that passes after
5260
   VRP need to handle them appropriately.
5261
 
5262
   Another approach would be to make the range information a first
5263
   class property of the SSA_NAME so that it can be queried from
5264
   any pass.  This is made somewhat more complex by the need for
5265
   multiple ranges to be associated with one SSA_NAME.  */
5266
 
5267
static void
5268
remove_range_assertions (void)
5269
{
5270
  basic_block bb;
5271
  gimple_stmt_iterator si;
5272
 
5273
  /* Note that the BSI iterator bump happens at the bottom of the
5274
     loop and no bump is necessary if we're removing the statement
5275
     referenced by the current BSI.  */
5276
  FOR_EACH_BB (bb)
5277
    for (si = gsi_start_bb (bb); !gsi_end_p (si);)
5278
      {
5279
        gimple stmt = gsi_stmt (si);
5280
        gimple use_stmt;
5281
 
5282
        if (is_gimple_assign (stmt)
5283
            && gimple_assign_rhs_code (stmt) == ASSERT_EXPR)
5284
          {
5285
            tree rhs = gimple_assign_rhs1 (stmt);
5286
            tree var;
5287
            tree cond = fold (ASSERT_EXPR_COND (rhs));
5288
            use_operand_p use_p;
5289
            imm_use_iterator iter;
5290
 
5291
            gcc_assert (cond != boolean_false_node);
5292
 
5293
            /* Propagate the RHS into every use of the LHS.  */
5294
            var = ASSERT_EXPR_VAR (rhs);
5295
            FOR_EACH_IMM_USE_STMT (use_stmt, iter,
5296
                                   gimple_assign_lhs (stmt))
5297
              FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
5298
                {
5299
                  SET_USE (use_p, var);
5300
                  gcc_assert (TREE_CODE (var) == SSA_NAME);
5301
                }
5302
 
5303
            /* And finally, remove the copy, it is not needed.  */
5304
            gsi_remove (&si, true);
5305
            release_defs (stmt);
5306
          }
5307
        else
5308
          gsi_next (&si);
5309
      }
5310
}
5311
 
5312
 
5313
/* Return true if STMT is interesting for VRP.  */
5314
 
5315
static bool
5316
stmt_interesting_for_vrp (gimple stmt)
5317
{
5318
  if (gimple_code (stmt) == GIMPLE_PHI
5319
      && is_gimple_reg (gimple_phi_result (stmt))
5320
      && (INTEGRAL_TYPE_P (TREE_TYPE (gimple_phi_result (stmt)))
5321
          || POINTER_TYPE_P (TREE_TYPE (gimple_phi_result (stmt)))))
5322
    return true;
5323
  else if (is_gimple_assign (stmt) || is_gimple_call (stmt))
5324
    {
5325
      tree lhs = gimple_get_lhs (stmt);
5326
 
5327
      /* In general, assignments with virtual operands are not useful
5328
         for deriving ranges, with the obvious exception of calls to
5329
         builtin functions.  */
5330
      if (lhs && TREE_CODE (lhs) == SSA_NAME
5331
          && (INTEGRAL_TYPE_P (TREE_TYPE (lhs))
5332
              || POINTER_TYPE_P (TREE_TYPE (lhs)))
5333
          && ((is_gimple_call (stmt)
5334
               && gimple_call_fndecl (stmt) != NULL_TREE
5335
               && DECL_IS_BUILTIN (gimple_call_fndecl (stmt)))
5336
              || !gimple_vuse (stmt)))
5337
        return true;
5338
    }
5339
  else if (gimple_code (stmt) == GIMPLE_COND
5340
           || gimple_code (stmt) == GIMPLE_SWITCH)
5341
    return true;
5342
 
5343
  return false;
5344
}
5345
 
5346
 
5347
/* Initialize local data structures for VRP.  */
5348
 
5349
static void
5350
vrp_initialize (void)
5351
{
5352
  basic_block bb;
5353
 
5354
  vr_value = XCNEWVEC (value_range_t *, num_ssa_names);
5355
  vr_phi_edge_counts = XCNEWVEC (int, num_ssa_names);
5356
 
5357
  FOR_EACH_BB (bb)
5358
    {
5359
      gimple_stmt_iterator si;
5360
 
5361
      for (si = gsi_start_phis (bb); !gsi_end_p (si); gsi_next (&si))
5362
        {
5363
          gimple phi = gsi_stmt (si);
5364
          if (!stmt_interesting_for_vrp (phi))
5365
            {
5366
              tree lhs = PHI_RESULT (phi);
5367
              set_value_range_to_varying (get_value_range (lhs));
5368
              prop_set_simulate_again (phi, false);
5369
            }
5370
          else
5371
            prop_set_simulate_again (phi, true);
5372
        }
5373
 
5374
      for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
5375
        {
5376
          gimple stmt = gsi_stmt (si);
5377
 
5378
          /* If the statement is a control insn, then we do not
5379
             want to avoid simulating the statement once.  Failure
5380
             to do so means that those edges will never get added.  */
5381
          if (stmt_ends_bb_p (stmt))
5382
            prop_set_simulate_again (stmt, true);
5383
          else if (!stmt_interesting_for_vrp (stmt))
5384
            {
5385
              ssa_op_iter i;
5386
              tree def;
5387
              FOR_EACH_SSA_TREE_OPERAND (def, stmt, i, SSA_OP_DEF)
5388
                set_value_range_to_varying (get_value_range (def));
5389
              prop_set_simulate_again (stmt, false);
5390
            }
5391
          else
5392
            prop_set_simulate_again (stmt, true);
5393
        }
5394
    }
5395
}
5396
 
5397
 
5398
/* Visit assignment STMT.  If it produces an interesting range, record
5399
   the SSA name in *OUTPUT_P.  */
5400
 
5401
static enum ssa_prop_result
5402
vrp_visit_assignment_or_call (gimple stmt, tree *output_p)
5403
{
5404
  tree def, lhs;
5405
  ssa_op_iter iter;
5406
  enum gimple_code code = gimple_code (stmt);
5407
  lhs = gimple_get_lhs (stmt);
5408
 
5409
  /* We only keep track of ranges in integral and pointer types.  */
5410
  if (TREE_CODE (lhs) == SSA_NAME
5411
      && ((INTEGRAL_TYPE_P (TREE_TYPE (lhs))
5412
           /* It is valid to have NULL MIN/MAX values on a type.  See
5413
              build_range_type.  */
5414
           && TYPE_MIN_VALUE (TREE_TYPE (lhs))
5415
           && TYPE_MAX_VALUE (TREE_TYPE (lhs)))
5416
          || POINTER_TYPE_P (TREE_TYPE (lhs))))
5417
    {
5418
      value_range_t new_vr = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
5419
 
5420
      if (code == GIMPLE_CALL)
5421
        extract_range_basic (&new_vr, stmt);
5422
      else
5423
        extract_range_from_assignment (&new_vr, stmt);
5424
 
5425
      if (update_value_range (lhs, &new_vr))
5426
        {
5427
          *output_p = lhs;
5428
 
5429
          if (dump_file && (dump_flags & TDF_DETAILS))
5430
            {
5431
              fprintf (dump_file, "Found new range for ");
5432
              print_generic_expr (dump_file, lhs, 0);
5433
              fprintf (dump_file, ": ");
5434
              dump_value_range (dump_file, &new_vr);
5435
              fprintf (dump_file, "\n\n");
5436
            }
5437
 
5438
          if (new_vr.type == VR_VARYING)
5439
            return SSA_PROP_VARYING;
5440
 
5441
          return SSA_PROP_INTERESTING;
5442
        }
5443
 
5444
      return SSA_PROP_NOT_INTERESTING;
5445
    }
5446
 
5447
  /* Every other statement produces no useful ranges.  */
5448
  FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF)
5449
    set_value_range_to_varying (get_value_range (def));
5450
 
5451
  return SSA_PROP_VARYING;
5452
}
5453
 
5454
/* Helper that gets the value range of the SSA_NAME with version I
5455
   or a symbolic range containing the SSA_NAME only if the value range
5456
   is varying or undefined.  */
5457
 
5458
static inline value_range_t
5459
get_vr_for_comparison (int i)
5460
{
5461
  value_range_t vr = *(vr_value[i]);
5462
 
5463
  /* If name N_i does not have a valid range, use N_i as its own
5464
     range.  This allows us to compare against names that may
5465
     have N_i in their ranges.  */
5466
  if (vr.type == VR_VARYING || vr.type == VR_UNDEFINED)
5467
    {
5468
      vr.type = VR_RANGE;
5469
      vr.min = ssa_name (i);
5470
      vr.max = ssa_name (i);
5471
    }
5472
 
5473
  return vr;
5474
}
5475
 
5476
/* Compare all the value ranges for names equivalent to VAR with VAL
5477
   using comparison code COMP.  Return the same value returned by
5478
   compare_range_with_value, including the setting of
5479
   *STRICT_OVERFLOW_P.  */
5480
 
5481
static tree
5482
compare_name_with_value (enum tree_code comp, tree var, tree val,
5483
                         bool *strict_overflow_p)
5484
{
5485
  bitmap_iterator bi;
5486
  unsigned i;
5487
  bitmap e;
5488
  tree retval, t;
5489
  int used_strict_overflow;
5490
  bool sop;
5491
  value_range_t equiv_vr;
5492
 
5493
  /* Get the set of equivalences for VAR.  */
5494
  e = get_value_range (var)->equiv;
5495
 
5496
  /* Start at -1.  Set it to 0 if we do a comparison without relying
5497
     on overflow, or 1 if all comparisons rely on overflow.  */
5498
  used_strict_overflow = -1;
5499
 
5500
  /* Compare vars' value range with val.  */
5501
  equiv_vr = get_vr_for_comparison (SSA_NAME_VERSION (var));
5502
  sop = false;
5503
  retval = compare_range_with_value (comp, &equiv_vr, val, &sop);
5504
  if (retval)
5505
    used_strict_overflow = sop ? 1 : 0;
5506
 
5507
  /* If the equiv set is empty we have done all work we need to do.  */
5508
  if (e == NULL)
5509
    {
5510
      if (retval
5511
          && used_strict_overflow > 0)
5512
        *strict_overflow_p = true;
5513
      return retval;
5514
    }
5515
 
5516
  EXECUTE_IF_SET_IN_BITMAP (e, 0, i, bi)
5517
    {
5518
      equiv_vr = get_vr_for_comparison (i);
5519
      sop = false;
5520
      t = compare_range_with_value (comp, &equiv_vr, val, &sop);
5521
      if (t)
5522
        {
5523
          /* If we get different answers from different members
5524
             of the equivalence set this check must be in a dead
5525
             code region.  Folding it to a trap representation
5526
             would be correct here.  For now just return don't-know.  */
5527
          if (retval != NULL
5528
              && t != retval)
5529
            {
5530
              retval = NULL_TREE;
5531
              break;
5532
            }
5533
          retval = t;
5534
 
5535
          if (!sop)
5536
            used_strict_overflow = 0;
5537
          else if (used_strict_overflow < 0)
5538
            used_strict_overflow = 1;
5539
        }
5540
    }
5541
 
5542
  if (retval
5543
      && used_strict_overflow > 0)
5544
    *strict_overflow_p = true;
5545
 
5546
  return retval;
5547
}
5548
 
5549
 
5550
/* Given a comparison code COMP and names N1 and N2, compare all the
5551
   ranges equivalent to N1 against all the ranges equivalent to N2
5552
   to determine the value of N1 COMP N2.  Return the same value
5553
   returned by compare_ranges.  Set *STRICT_OVERFLOW_P to indicate
5554
   whether we relied on an overflow infinity in the comparison.  */
5555
 
5556
 
5557
static tree
5558
compare_names (enum tree_code comp, tree n1, tree n2,
5559
               bool *strict_overflow_p)
5560
{
5561
  tree t, retval;
5562
  bitmap e1, e2;
5563
  bitmap_iterator bi1, bi2;
5564
  unsigned i1, i2;
5565
  int used_strict_overflow;
5566
  static bitmap_obstack *s_obstack = NULL;
5567
  static bitmap s_e1 = NULL, s_e2 = NULL;
5568
 
5569
  /* Compare the ranges of every name equivalent to N1 against the
5570
     ranges of every name equivalent to N2.  */
5571
  e1 = get_value_range (n1)->equiv;
5572
  e2 = get_value_range (n2)->equiv;
5573
 
5574
  /* Use the fake bitmaps if e1 or e2 are not available.  */
5575
  if (s_obstack == NULL)
5576
    {
5577
      s_obstack = XNEW (bitmap_obstack);
5578
      bitmap_obstack_initialize (s_obstack);
5579
      s_e1 = BITMAP_ALLOC (s_obstack);
5580
      s_e2 = BITMAP_ALLOC (s_obstack);
5581
    }
5582
  if (e1 == NULL)
5583
    e1 = s_e1;
5584
  if (e2 == NULL)
5585
    e2 = s_e2;
5586
 
5587
  /* Add N1 and N2 to their own set of equivalences to avoid
5588
     duplicating the body of the loop just to check N1 and N2
5589
     ranges.  */
5590
  bitmap_set_bit (e1, SSA_NAME_VERSION (n1));
5591
  bitmap_set_bit (e2, SSA_NAME_VERSION (n2));
5592
 
5593
  /* If the equivalence sets have a common intersection, then the two
5594
     names can be compared without checking their ranges.  */
5595
  if (bitmap_intersect_p (e1, e2))
5596
    {
5597
      bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
5598
      bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
5599
 
5600
      return (comp == EQ_EXPR || comp == GE_EXPR || comp == LE_EXPR)
5601
             ? boolean_true_node
5602
             : boolean_false_node;
5603
    }
5604
 
5605
  /* Start at -1.  Set it to 0 if we do a comparison without relying
5606
     on overflow, or 1 if all comparisons rely on overflow.  */
5607
  used_strict_overflow = -1;
5608
 
5609
  /* Otherwise, compare all the equivalent ranges.  First, add N1 and
5610
     N2 to their own set of equivalences to avoid duplicating the body
5611
     of the loop just to check N1 and N2 ranges.  */
5612
  EXECUTE_IF_SET_IN_BITMAP (e1, 0, i1, bi1)
5613
    {
5614
      value_range_t vr1 = get_vr_for_comparison (i1);
5615
 
5616
      t = retval = NULL_TREE;
5617
      EXECUTE_IF_SET_IN_BITMAP (e2, 0, i2, bi2)
5618
        {
5619
          bool sop = false;
5620
 
5621
          value_range_t vr2 = get_vr_for_comparison (i2);
5622
 
5623
          t = compare_ranges (comp, &vr1, &vr2, &sop);
5624
          if (t)
5625
            {
5626
              /* If we get different answers from different members
5627
                 of the equivalence set this check must be in a dead
5628
                 code region.  Folding it to a trap representation
5629
                 would be correct here.  For now just return don't-know.  */
5630
              if (retval != NULL
5631
                  && t != retval)
5632
                {
5633
                  bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
5634
                  bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
5635
                  return NULL_TREE;
5636
                }
5637
              retval = t;
5638
 
5639
              if (!sop)
5640
                used_strict_overflow = 0;
5641
              else if (used_strict_overflow < 0)
5642
                used_strict_overflow = 1;
5643
            }
5644
        }
5645
 
5646
      if (retval)
5647
        {
5648
          bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
5649
          bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
5650
          if (used_strict_overflow > 0)
5651
            *strict_overflow_p = true;
5652
          return retval;
5653
        }
5654
    }
5655
 
5656
  /* None of the equivalent ranges are useful in computing this
5657
     comparison.  */
5658
  bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
5659
  bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
5660
  return NULL_TREE;
5661
}
5662
 
5663
/* Helper function for vrp_evaluate_conditional_warnv.  */
5664
 
5665
static tree
5666
vrp_evaluate_conditional_warnv_with_ops_using_ranges (enum tree_code code,
5667
                                                      tree op0, tree op1,
5668
                                                      bool * strict_overflow_p)
5669
{
5670
  value_range_t *vr0, *vr1;
5671
 
5672
  vr0 = (TREE_CODE (op0) == SSA_NAME) ? get_value_range (op0) : NULL;
5673
  vr1 = (TREE_CODE (op1) == SSA_NAME) ? get_value_range (op1) : NULL;
5674
 
5675
  if (vr0 && vr1)
5676
    return compare_ranges (code, vr0, vr1, strict_overflow_p);
5677
  else if (vr0 && vr1 == NULL)
5678
    return compare_range_with_value (code, vr0, op1, strict_overflow_p);
5679
  else if (vr0 == NULL && vr1)
5680
    return (compare_range_with_value
5681
            (swap_tree_comparison (code), vr1, op0, strict_overflow_p));
5682
  return NULL;
5683
}
5684
 
5685
/* Helper function for vrp_evaluate_conditional_warnv. */
5686
 
5687
static tree
5688
vrp_evaluate_conditional_warnv_with_ops (enum tree_code code, tree op0,
5689
                                         tree op1, bool use_equiv_p,
5690
                                         bool *strict_overflow_p, bool *only_ranges)
5691
{
5692
  tree ret;
5693
  if (only_ranges)
5694
    *only_ranges = true;
5695
 
5696
  /* We only deal with integral and pointer types.  */
5697
  if (!INTEGRAL_TYPE_P (TREE_TYPE (op0))
5698
      && !POINTER_TYPE_P (TREE_TYPE (op0)))
5699
    return NULL_TREE;
5700
 
5701
  if (use_equiv_p)
5702
    {
5703
      if (only_ranges
5704
          && (ret = vrp_evaluate_conditional_warnv_with_ops_using_ranges
5705
                      (code, op0, op1, strict_overflow_p)))
5706
        return ret;
5707
      *only_ranges = false;
5708
      if (TREE_CODE (op0) == SSA_NAME && TREE_CODE (op1) == SSA_NAME)
5709
        return compare_names (code, op0, op1, strict_overflow_p);
5710
      else if (TREE_CODE (op0) == SSA_NAME)
5711
        return compare_name_with_value (code, op0, op1, strict_overflow_p);
5712
      else if (TREE_CODE (op1) == SSA_NAME)
5713
        return (compare_name_with_value
5714
                (swap_tree_comparison (code), op1, op0, strict_overflow_p));
5715
    }
5716
  else
5717
    return vrp_evaluate_conditional_warnv_with_ops_using_ranges (code, op0, op1,
5718
                                                                 strict_overflow_p);
5719
  return NULL_TREE;
5720
}
5721
 
5722
/* Given (CODE OP0 OP1) within STMT, try to simplify it based on value range
5723
   information.  Return NULL if the conditional can not be evaluated.
5724
   The ranges of all the names equivalent with the operands in COND
5725
   will be used when trying to compute the value.  If the result is
5726
   based on undefined signed overflow, issue a warning if
5727
   appropriate.  */
5728
 
5729
static tree
5730
vrp_evaluate_conditional (enum tree_code code, tree op0, tree op1, gimple stmt)
5731
{
5732
  bool sop;
5733
  tree ret;
5734
  bool only_ranges;
5735
 
5736
  /* Some passes and foldings leak constants with overflow flag set
5737
     into the IL.  Avoid doing wrong things with these and bail out.  */
5738
  if ((TREE_CODE (op0) == INTEGER_CST
5739
       && TREE_OVERFLOW (op0))
5740
      || (TREE_CODE (op1) == INTEGER_CST
5741
          && TREE_OVERFLOW (op1)))
5742
    return NULL_TREE;
5743
 
5744
  sop = false;
5745
  ret = vrp_evaluate_conditional_warnv_with_ops (code, op0, op1, true, &sop,
5746
                                                 &only_ranges);
5747
 
5748
  if (ret && sop)
5749
    {
5750
      enum warn_strict_overflow_code wc;
5751
      const char* warnmsg;
5752
 
5753
      if (is_gimple_min_invariant (ret))
5754
        {
5755
          wc = WARN_STRICT_OVERFLOW_CONDITIONAL;
5756
          warnmsg = G_("assuming signed overflow does not occur when "
5757
                       "simplifying conditional to constant");
5758
        }
5759
      else
5760
        {
5761
          wc = WARN_STRICT_OVERFLOW_COMPARISON;
5762
          warnmsg = G_("assuming signed overflow does not occur when "
5763
                       "simplifying conditional");
5764
        }
5765
 
5766
      if (issue_strict_overflow_warning (wc))
5767
        {
5768
          location_t location;
5769
 
5770
          if (!gimple_has_location (stmt))
5771
            location = input_location;
5772
          else
5773
            location = gimple_location (stmt);
5774
          warning_at (location, OPT_Wstrict_overflow, "%s", warnmsg);
5775
        }
5776
    }
5777
 
5778
  if (warn_type_limits
5779
      && ret && only_ranges
5780
      && TREE_CODE_CLASS (code) == tcc_comparison
5781
      && TREE_CODE (op0) == SSA_NAME)
5782
    {
5783
      /* If the comparison is being folded and the operand on the LHS
5784
         is being compared against a constant value that is outside of
5785
         the natural range of OP0's type, then the predicate will
5786
         always fold regardless of the value of OP0.  If -Wtype-limits
5787
         was specified, emit a warning.  */
5788
      tree type = TREE_TYPE (op0);
5789
      value_range_t *vr0 = get_value_range (op0);
5790
 
5791
      if (vr0->type != VR_VARYING
5792
          && INTEGRAL_TYPE_P (type)
5793
          && vrp_val_is_min (vr0->min)
5794
          && vrp_val_is_max (vr0->max)
5795
          && is_gimple_min_invariant (op1))
5796
        {
5797
          location_t location;
5798
 
5799
          if (!gimple_has_location (stmt))
5800
            location = input_location;
5801
          else
5802
            location = gimple_location (stmt);
5803
 
5804
          warning_at (location, OPT_Wtype_limits,
5805
                      integer_zerop (ret)
5806
                      ? G_("comparison always false "
5807
                           "due to limited range of data type")
5808
                      : G_("comparison always true "
5809
                           "due to limited range of data type"));
5810
        }
5811
    }
5812
 
5813
  return ret;
5814
}
5815
 
5816
 
5817
/* Visit conditional statement STMT.  If we can determine which edge
5818
   will be taken out of STMT's basic block, record it in
5819
   *TAKEN_EDGE_P and return SSA_PROP_INTERESTING.  Otherwise, return
5820
   SSA_PROP_VARYING.  */
5821
 
5822
static enum ssa_prop_result
5823
vrp_visit_cond_stmt (gimple stmt, edge *taken_edge_p)
5824
{
5825
  tree val;
5826
  bool sop;
5827
 
5828
  *taken_edge_p = NULL;
5829
 
5830
  if (dump_file && (dump_flags & TDF_DETAILS))
5831
    {
5832
      tree use;
5833
      ssa_op_iter i;
5834
 
5835
      fprintf (dump_file, "\nVisiting conditional with predicate: ");
5836
      print_gimple_stmt (dump_file, stmt, 0, 0);
5837
      fprintf (dump_file, "\nWith known ranges\n");
5838
 
5839
      FOR_EACH_SSA_TREE_OPERAND (use, stmt, i, SSA_OP_USE)
5840
        {
5841
          fprintf (dump_file, "\t");
5842
          print_generic_expr (dump_file, use, 0);
5843
          fprintf (dump_file, ": ");
5844
          dump_value_range (dump_file, vr_value[SSA_NAME_VERSION (use)]);
5845
        }
5846
 
5847
      fprintf (dump_file, "\n");
5848
    }
5849
 
5850
  /* Compute the value of the predicate COND by checking the known
5851
     ranges of each of its operands.
5852
 
5853
     Note that we cannot evaluate all the equivalent ranges here
5854
     because those ranges may not yet be final and with the current
5855
     propagation strategy, we cannot determine when the value ranges
5856
     of the names in the equivalence set have changed.
5857
 
5858
     For instance, given the following code fragment
5859
 
5860
        i_5 = PHI <8, i_13>
5861
        ...
5862
        i_14 = ASSERT_EXPR <i_5, i_5 != 0>
5863
        if (i_14 == 1)
5864
          ...
5865
 
5866
     Assume that on the first visit to i_14, i_5 has the temporary
5867
     range [8, 8] because the second argument to the PHI function is
5868
     not yet executable.  We derive the range ~[0, 0] for i_14 and the
5869
     equivalence set { i_5 }.  So, when we visit 'if (i_14 == 1)' for
5870
     the first time, since i_14 is equivalent to the range [8, 8], we
5871
     determine that the predicate is always false.
5872
 
5873
     On the next round of propagation, i_13 is determined to be
5874
     VARYING, which causes i_5 to drop down to VARYING.  So, another
5875
     visit to i_14 is scheduled.  In this second visit, we compute the
5876
     exact same range and equivalence set for i_14, namely ~[0, 0] and
5877
     { i_5 }.  But we did not have the previous range for i_5
5878
     registered, so vrp_visit_assignment thinks that the range for
5879
     i_14 has not changed.  Therefore, the predicate 'if (i_14 == 1)'
5880
     is not visited again, which stops propagation from visiting
5881
     statements in the THEN clause of that if().
5882
 
5883
     To properly fix this we would need to keep the previous range
5884
     value for the names in the equivalence set.  This way we would've
5885
     discovered that from one visit to the other i_5 changed from
5886
     range [8, 8] to VR_VARYING.
5887
 
5888
     However, fixing this apparent limitation may not be worth the
5889
     additional checking.  Testing on several code bases (GCC, DLV,
5890
     MICO, TRAMP3D and SPEC2000) showed that doing this results in
5891
     4 more predicates folded in SPEC.  */
5892
  sop = false;
5893
 
5894
  val = vrp_evaluate_conditional_warnv_with_ops (gimple_cond_code (stmt),
5895
                                                 gimple_cond_lhs (stmt),
5896
                                                 gimple_cond_rhs (stmt),
5897
                                                 false, &sop, NULL);
5898
  if (val)
5899
    {
5900
      if (!sop)
5901
        *taken_edge_p = find_taken_edge (gimple_bb (stmt), val);
5902
      else
5903
        {
5904
          if (dump_file && (dump_flags & TDF_DETAILS))
5905
            fprintf (dump_file,
5906
                     "\nIgnoring predicate evaluation because "
5907
                     "it assumes that signed overflow is undefined");
5908
          val = NULL_TREE;
5909
        }
5910
    }
5911
 
5912
  if (dump_file && (dump_flags & TDF_DETAILS))
5913
    {
5914
      fprintf (dump_file, "\nPredicate evaluates to: ");
5915
      if (val == NULL_TREE)
5916
        fprintf (dump_file, "DON'T KNOW\n");
5917
      else
5918
        print_generic_stmt (dump_file, val, 0);
5919
    }
5920
 
5921
  return (*taken_edge_p) ? SSA_PROP_INTERESTING : SSA_PROP_VARYING;
5922
}
5923
 
5924
/* Searches the case label vector VEC for the index *IDX of the CASE_LABEL
5925
   that includes the value VAL.  The search is restricted to the range
5926
   [START_IDX, n - 1] where n is the size of VEC.
5927
 
5928
   If there is a CASE_LABEL for VAL, its index is placed in IDX and true is
5929
   returned.
5930
 
5931
   If there is no CASE_LABEL for VAL and there is one that is larger than VAL,
5932
   it is placed in IDX and false is returned.
5933
 
5934
   If VAL is larger than any CASE_LABEL, n is placed on IDX and false is
5935
   returned. */
5936
 
5937
static bool
5938
find_case_label_index (gimple stmt, size_t start_idx, tree val, size_t *idx)
5939
{
5940
  size_t n = gimple_switch_num_labels (stmt);
5941
  size_t low, high;
5942
 
5943
  /* Find case label for minimum of the value range or the next one.
5944
     At each iteration we are searching in [low, high - 1]. */
5945
 
5946
  for (low = start_idx, high = n; high != low; )
5947
    {
5948
      tree t;
5949
      int cmp;
5950
      /* Note that i != high, so we never ask for n. */
5951
      size_t i = (high + low) / 2;
5952
      t = gimple_switch_label (stmt, i);
5953
 
5954
      /* Cache the result of comparing CASE_LOW and val.  */
5955
      cmp = tree_int_cst_compare (CASE_LOW (t), val);
5956
 
5957
      if (cmp == 0)
5958
        {
5959
          /* Ranges cannot be empty. */
5960
          *idx = i;
5961
          return true;
5962
        }
5963
      else if (cmp > 0)
5964
        high = i;
5965
      else
5966
        {
5967
          low = i + 1;
5968
          if (CASE_HIGH (t) != NULL
5969
              && tree_int_cst_compare (CASE_HIGH (t), val) >= 0)
5970
            {
5971
              *idx = i;
5972
              return true;
5973
            }
5974
        }
5975
    }
5976
 
5977
  *idx = high;
5978
  return false;
5979
}
5980
 
5981
/* Searches the case label vector VEC for the range of CASE_LABELs that is used
5982
   for values between MIN and MAX. The first index is placed in MIN_IDX. The
5983
   last index is placed in MAX_IDX. If the range of CASE_LABELs is empty
5984
   then MAX_IDX < MIN_IDX.
5985
   Returns true if the default label is not needed. */
5986
 
5987
static bool
5988
find_case_label_range (gimple stmt, tree min, tree max, size_t *min_idx,
5989
                       size_t *max_idx)
5990
{
5991
  size_t i, j;
5992
  bool min_take_default = !find_case_label_index (stmt, 1, min, &i);
5993
  bool max_take_default = !find_case_label_index (stmt, i, max, &j);
5994
 
5995
  if (i == j
5996
      && min_take_default
5997
      && max_take_default)
5998
    {
5999
      /* Only the default case label reached.
6000
         Return an empty range. */
6001
      *min_idx = 1;
6002
      *max_idx = 0;
6003
      return false;
6004
    }
6005
  else
6006
    {
6007
      bool take_default = min_take_default || max_take_default;
6008
      tree low, high;
6009
      size_t k;
6010
 
6011
      if (max_take_default)
6012
        j--;
6013
 
6014
      /* If the case label range is continuous, we do not need
6015
         the default case label.  Verify that.  */
6016
      high = CASE_LOW (gimple_switch_label (stmt, i));
6017
      if (CASE_HIGH (gimple_switch_label (stmt, i)))
6018
        high = CASE_HIGH (gimple_switch_label (stmt, i));
6019
      for (k = i + 1; k <= j; ++k)
6020
        {
6021
          low = CASE_LOW (gimple_switch_label (stmt, k));
6022
          if (!integer_onep (int_const_binop (MINUS_EXPR, low, high, 0)))
6023
            {
6024
              take_default = true;
6025
              break;
6026
            }
6027
          high = low;
6028
          if (CASE_HIGH (gimple_switch_label (stmt, k)))
6029
            high = CASE_HIGH (gimple_switch_label (stmt, k));
6030
        }
6031
 
6032
      *min_idx = i;
6033
      *max_idx = j;
6034
      return !take_default;
6035
    }
6036
}
6037
 
6038
/* Visit switch statement STMT.  If we can determine which edge
6039
   will be taken out of STMT's basic block, record it in
6040
   *TAKEN_EDGE_P and return SSA_PROP_INTERESTING.  Otherwise, return
6041
   SSA_PROP_VARYING.  */
6042
 
6043
static enum ssa_prop_result
6044
vrp_visit_switch_stmt (gimple stmt, edge *taken_edge_p)
6045
{
6046
  tree op, val;
6047
  value_range_t *vr;
6048
  size_t i = 0, j = 0;
6049
  bool take_default;
6050
 
6051
  *taken_edge_p = NULL;
6052
  op = gimple_switch_index (stmt);
6053
  if (TREE_CODE (op) != SSA_NAME)
6054
    return SSA_PROP_VARYING;
6055
 
6056
  vr = get_value_range (op);
6057
  if (dump_file && (dump_flags & TDF_DETAILS))
6058
    {
6059
      fprintf (dump_file, "\nVisiting switch expression with operand ");
6060
      print_generic_expr (dump_file, op, 0);
6061
      fprintf (dump_file, " with known range ");
6062
      dump_value_range (dump_file, vr);
6063
      fprintf (dump_file, "\n");
6064
    }
6065
 
6066
  if (vr->type != VR_RANGE
6067
      || symbolic_range_p (vr))
6068
    return SSA_PROP_VARYING;
6069
 
6070
  /* Find the single edge that is taken from the switch expression.  */
6071
  take_default = !find_case_label_range (stmt, vr->min, vr->max, &i, &j);
6072
 
6073
  /* Check if the range spans no CASE_LABEL. If so, we only reach the default
6074
     label */
6075
  if (j < i)
6076
    {
6077
      gcc_assert (take_default);
6078
      val = gimple_switch_default_label (stmt);
6079
    }
6080
  else
6081
    {
6082
      /* Check if labels with index i to j and maybe the default label
6083
         are all reaching the same label.  */
6084
 
6085
      val = gimple_switch_label (stmt, i);
6086
      if (take_default
6087
          && CASE_LABEL (gimple_switch_default_label (stmt))
6088
          != CASE_LABEL (val))
6089
        {
6090
          if (dump_file && (dump_flags & TDF_DETAILS))
6091
            fprintf (dump_file, "  not a single destination for this "
6092
                     "range\n");
6093
          return SSA_PROP_VARYING;
6094
        }
6095
      for (++i; i <= j; ++i)
6096
        {
6097
          if (CASE_LABEL (gimple_switch_label (stmt, i)) != CASE_LABEL (val))
6098
            {
6099
              if (dump_file && (dump_flags & TDF_DETAILS))
6100
                fprintf (dump_file, "  not a single destination for this "
6101
                         "range\n");
6102
              return SSA_PROP_VARYING;
6103
            }
6104
        }
6105
    }
6106
 
6107
  *taken_edge_p = find_edge (gimple_bb (stmt),
6108
                             label_to_block (CASE_LABEL (val)));
6109
 
6110
  if (dump_file && (dump_flags & TDF_DETAILS))
6111
    {
6112
      fprintf (dump_file, "  will take edge to ");
6113
      print_generic_stmt (dump_file, CASE_LABEL (val), 0);
6114
    }
6115
 
6116
  return SSA_PROP_INTERESTING;
6117
}
6118
 
6119
 
6120
/* Evaluate statement STMT.  If the statement produces a useful range,
6121
   return SSA_PROP_INTERESTING and record the SSA name with the
6122
   interesting range into *OUTPUT_P.
6123
 
6124
   If STMT is a conditional branch and we can determine its truth
6125
   value, the taken edge is recorded in *TAKEN_EDGE_P.
6126
 
6127
   If STMT produces a varying value, return SSA_PROP_VARYING.  */
6128
 
6129
static enum ssa_prop_result
6130
vrp_visit_stmt (gimple stmt, edge *taken_edge_p, tree *output_p)
6131
{
6132
  tree def;
6133
  ssa_op_iter iter;
6134
 
6135
  if (dump_file && (dump_flags & TDF_DETAILS))
6136
    {
6137
      fprintf (dump_file, "\nVisiting statement:\n");
6138
      print_gimple_stmt (dump_file, stmt, 0, dump_flags);
6139
      fprintf (dump_file, "\n");
6140
    }
6141
 
6142
  if (!stmt_interesting_for_vrp (stmt))
6143
    gcc_assert (stmt_ends_bb_p (stmt));
6144
  else if (is_gimple_assign (stmt) || is_gimple_call (stmt))
6145
    {
6146
      /* In general, assignments with virtual operands are not useful
6147
         for deriving ranges, with the obvious exception of calls to
6148
         builtin functions.  */
6149
 
6150
      if ((is_gimple_call (stmt)
6151
           && gimple_call_fndecl (stmt) != NULL_TREE
6152
           && DECL_IS_BUILTIN (gimple_call_fndecl (stmt)))
6153
          || !gimple_vuse (stmt))
6154
        return vrp_visit_assignment_or_call (stmt, output_p);
6155
    }
6156
  else if (gimple_code (stmt) == GIMPLE_COND)
6157
    return vrp_visit_cond_stmt (stmt, taken_edge_p);
6158
  else if (gimple_code (stmt) == GIMPLE_SWITCH)
6159
    return vrp_visit_switch_stmt (stmt, taken_edge_p);
6160
 
6161
  /* All other statements produce nothing of interest for VRP, so mark
6162
     their outputs varying and prevent further simulation.  */
6163
  FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF)
6164
    set_value_range_to_varying (get_value_range (def));
6165
 
6166
  return SSA_PROP_VARYING;
6167
}
6168
 
6169
 
6170
/* Meet operation for value ranges.  Given two value ranges VR0 and
6171
   VR1, store in VR0 a range that contains both VR0 and VR1.  This
6172
   may not be the smallest possible such range.  */
6173
 
6174
static void
6175
vrp_meet (value_range_t *vr0, value_range_t *vr1)
6176
{
6177
  if (vr0->type == VR_UNDEFINED)
6178
    {
6179
      copy_value_range (vr0, vr1);
6180
      return;
6181
    }
6182
 
6183
  if (vr1->type == VR_UNDEFINED)
6184
    {
6185
      /* Nothing to do.  VR0 already has the resulting range.  */
6186
      return;
6187
    }
6188
 
6189
  if (vr0->type == VR_VARYING)
6190
    {
6191
      /* Nothing to do.  VR0 already has the resulting range.  */
6192
      return;
6193
    }
6194
 
6195
  if (vr1->type == VR_VARYING)
6196
    {
6197
      set_value_range_to_varying (vr0);
6198
      return;
6199
    }
6200
 
6201
  if (vr0->type == VR_RANGE && vr1->type == VR_RANGE)
6202
    {
6203
      int cmp;
6204
      tree min, max;
6205
 
6206
      /* Compute the convex hull of the ranges.  The lower limit of
6207
         the new range is the minimum of the two ranges.  If they
6208
         cannot be compared, then give up.  */
6209
      cmp = compare_values (vr0->min, vr1->min);
6210
      if (cmp == 0 || cmp == 1)
6211
        min = vr1->min;
6212
      else if (cmp == -1)
6213
        min = vr0->min;
6214
      else
6215
        goto give_up;
6216
 
6217
      /* Similarly, the upper limit of the new range is the maximum
6218
         of the two ranges.  If they cannot be compared, then
6219
         give up.  */
6220
      cmp = compare_values (vr0->max, vr1->max);
6221
      if (cmp == 0 || cmp == -1)
6222
        max = vr1->max;
6223
      else if (cmp == 1)
6224
        max = vr0->max;
6225
      else
6226
        goto give_up;
6227
 
6228
      /* Check for useless ranges.  */
6229
      if (INTEGRAL_TYPE_P (TREE_TYPE (min))
6230
          && ((vrp_val_is_min (min) || is_overflow_infinity (min))
6231
              && (vrp_val_is_max (max) || is_overflow_infinity (max))))
6232
        goto give_up;
6233
 
6234
      /* The resulting set of equivalences is the intersection of
6235
         the two sets.  */
6236
      if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
6237
        bitmap_and_into (vr0->equiv, vr1->equiv);
6238
      else if (vr0->equiv && !vr1->equiv)
6239
        bitmap_clear (vr0->equiv);
6240
 
6241
      set_value_range (vr0, vr0->type, min, max, vr0->equiv);
6242
    }
6243
  else if (vr0->type == VR_ANTI_RANGE && vr1->type == VR_ANTI_RANGE)
6244
    {
6245
      /* Two anti-ranges meet only if their complements intersect.
6246
         Only handle the case of identical ranges.  */
6247
      if (compare_values (vr0->min, vr1->min) == 0
6248
          && compare_values (vr0->max, vr1->max) == 0
6249
          && compare_values (vr0->min, vr0->max) == 0)
6250
        {
6251
          /* The resulting set of equivalences is the intersection of
6252
             the two sets.  */
6253
          if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
6254
            bitmap_and_into (vr0->equiv, vr1->equiv);
6255
          else if (vr0->equiv && !vr1->equiv)
6256
            bitmap_clear (vr0->equiv);
6257
        }
6258
      else
6259
        goto give_up;
6260
    }
6261
  else if (vr0->type == VR_ANTI_RANGE || vr1->type == VR_ANTI_RANGE)
6262
    {
6263
      /* For a numeric range [VAL1, VAL2] and an anti-range ~[VAL3, VAL4],
6264
         only handle the case where the ranges have an empty intersection.
6265
         The result of the meet operation is the anti-range.  */
6266
      if (!symbolic_range_p (vr0)
6267
          && !symbolic_range_p (vr1)
6268
          && !value_ranges_intersect_p (vr0, vr1))
6269
        {
6270
          /* Copy most of VR1 into VR0.  Don't copy VR1's equivalence
6271
             set.  We need to compute the intersection of the two
6272
             equivalence sets.  */
6273
          if (vr1->type == VR_ANTI_RANGE)
6274
            set_value_range (vr0, vr1->type, vr1->min, vr1->max, vr0->equiv);
6275
 
6276
          /* The resulting set of equivalences is the intersection of
6277
             the two sets.  */
6278
          if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
6279
            bitmap_and_into (vr0->equiv, vr1->equiv);
6280
          else if (vr0->equiv && !vr1->equiv)
6281
            bitmap_clear (vr0->equiv);
6282
        }
6283
      else
6284
        goto give_up;
6285
    }
6286
  else
6287
    gcc_unreachable ();
6288
 
6289
  return;
6290
 
6291
give_up:
6292
  /* Failed to find an efficient meet.  Before giving up and setting
6293
     the result to VARYING, see if we can at least derive a useful
6294
     anti-range.  FIXME, all this nonsense about distinguishing
6295
     anti-ranges from ranges is necessary because of the odd
6296
     semantics of range_includes_zero_p and friends.  */
6297
  if (!symbolic_range_p (vr0)
6298
      && ((vr0->type == VR_RANGE && !range_includes_zero_p (vr0))
6299
          || (vr0->type == VR_ANTI_RANGE && range_includes_zero_p (vr0)))
6300
      && !symbolic_range_p (vr1)
6301
      && ((vr1->type == VR_RANGE && !range_includes_zero_p (vr1))
6302
          || (vr1->type == VR_ANTI_RANGE && range_includes_zero_p (vr1))))
6303
    {
6304
      set_value_range_to_nonnull (vr0, TREE_TYPE (vr0->min));
6305
 
6306
      /* Since this meet operation did not result from the meeting of
6307
         two equivalent names, VR0 cannot have any equivalences.  */
6308
      if (vr0->equiv)
6309
        bitmap_clear (vr0->equiv);
6310
    }
6311
  else
6312
    set_value_range_to_varying (vr0);
6313
}
6314
 
6315
 
6316
/* Visit all arguments for PHI node PHI that flow through executable
6317
   edges.  If a valid value range can be derived from all the incoming
6318
   value ranges, set a new range for the LHS of PHI.  */
6319
 
6320
static enum ssa_prop_result
6321
vrp_visit_phi_node (gimple phi)
6322
{
6323
  size_t i;
6324
  tree lhs = PHI_RESULT (phi);
6325
  value_range_t *lhs_vr = get_value_range (lhs);
6326
  value_range_t vr_result = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
6327
  int edges, old_edges;
6328
  struct loop *l;
6329
 
6330
  copy_value_range (&vr_result, lhs_vr);
6331
 
6332
  if (dump_file && (dump_flags & TDF_DETAILS))
6333
    {
6334
      fprintf (dump_file, "\nVisiting PHI node: ");
6335
      print_gimple_stmt (dump_file, phi, 0, dump_flags);
6336
    }
6337
 
6338
  edges = 0;
6339
  for (i = 0; i < gimple_phi_num_args (phi); i++)
6340
    {
6341
      edge e = gimple_phi_arg_edge (phi, i);
6342
 
6343
      if (dump_file && (dump_flags & TDF_DETAILS))
6344
        {
6345
          fprintf (dump_file,
6346
              "\n    Argument #%d (%d -> %d %sexecutable)\n",
6347
              (int) i, e->src->index, e->dest->index,
6348
              (e->flags & EDGE_EXECUTABLE) ? "" : "not ");
6349
        }
6350
 
6351
      if (e->flags & EDGE_EXECUTABLE)
6352
        {
6353
          tree arg = PHI_ARG_DEF (phi, i);
6354
          value_range_t vr_arg;
6355
 
6356
          ++edges;
6357
 
6358
          if (TREE_CODE (arg) == SSA_NAME)
6359
            {
6360
              vr_arg = *(get_value_range (arg));
6361
            }
6362
          else
6363
            {
6364
              if (is_overflow_infinity (arg))
6365
                {
6366
                  arg = copy_node (arg);
6367
                  TREE_OVERFLOW (arg) = 0;
6368
                }
6369
 
6370
              vr_arg.type = VR_RANGE;
6371
              vr_arg.min = arg;
6372
              vr_arg.max = arg;
6373
              vr_arg.equiv = NULL;
6374
            }
6375
 
6376
          if (dump_file && (dump_flags & TDF_DETAILS))
6377
            {
6378
              fprintf (dump_file, "\t");
6379
              print_generic_expr (dump_file, arg, dump_flags);
6380
              fprintf (dump_file, "\n\tValue: ");
6381
              dump_value_range (dump_file, &vr_arg);
6382
              fprintf (dump_file, "\n");
6383
            }
6384
 
6385
          vrp_meet (&vr_result, &vr_arg);
6386
 
6387
          if (vr_result.type == VR_VARYING)
6388
            break;
6389
        }
6390
    }
6391
 
6392
  /* If this is a loop PHI node SCEV may known more about its
6393
     value-range.  */
6394
  if (current_loops
6395
      && (l = loop_containing_stmt (phi))
6396
      && l->header == gimple_bb (phi))
6397
    adjust_range_with_scev (&vr_result, l, phi, lhs);
6398
 
6399
  if (vr_result.type == VR_VARYING)
6400
    goto varying;
6401
 
6402
  old_edges = vr_phi_edge_counts[SSA_NAME_VERSION (lhs)];
6403
  vr_phi_edge_counts[SSA_NAME_VERSION (lhs)] = edges;
6404
 
6405
  /* To prevent infinite iterations in the algorithm, derive ranges
6406
     when the new value is slightly bigger or smaller than the
6407
     previous one.  We don't do this if we have seen a new executable
6408
     edge; this helps us avoid an overflow infinity for conditionals
6409
     which are not in a loop.  */
6410
  if (lhs_vr->type == VR_RANGE && vr_result.type == VR_RANGE
6411
      && edges <= old_edges)
6412
    {
6413
      if (!POINTER_TYPE_P (TREE_TYPE (lhs)))
6414
        {
6415
          int cmp_min = compare_values (lhs_vr->min, vr_result.min);
6416
          int cmp_max = compare_values (lhs_vr->max, vr_result.max);
6417
 
6418
          /* If the new minimum is smaller or larger than the previous
6419
             one, go all the way to -INF.  In the first case, to avoid
6420
             iterating millions of times to reach -INF, and in the
6421
             other case to avoid infinite bouncing between different
6422
             minimums.  */
6423
          if (cmp_min > 0 || cmp_min < 0)
6424
            {
6425
              /* If we will end up with a (-INF, +INF) range, set it to
6426
                 VARYING.  Same if the previous max value was invalid for
6427
                 the type and we'd end up with vr_result.min > vr_result.max.  */
6428
              if (vrp_val_is_max (vr_result.max)
6429
                  || compare_values (TYPE_MIN_VALUE (TREE_TYPE (vr_result.min)),
6430
                                     vr_result.max) > 0)
6431
                goto varying;
6432
 
6433
              if (!needs_overflow_infinity (TREE_TYPE (vr_result.min))
6434
                  || !vrp_var_may_overflow (lhs, phi))
6435
                vr_result.min = TYPE_MIN_VALUE (TREE_TYPE (vr_result.min));
6436
              else if (supports_overflow_infinity (TREE_TYPE (vr_result.min)))
6437
                vr_result.min =
6438
                  negative_overflow_infinity (TREE_TYPE (vr_result.min));
6439
              else
6440
                goto varying;
6441
            }
6442
 
6443
          /* Similarly, if the new maximum is smaller or larger than
6444
             the previous one, go all the way to +INF.  */
6445
          if (cmp_max < 0 || cmp_max > 0)
6446
            {
6447
              /* If we will end up with a (-INF, +INF) range, set it to
6448
                 VARYING.  Same if the previous min value was invalid for
6449
                 the type and we'd end up with vr_result.max < vr_result.min.  */
6450
              if (vrp_val_is_min (vr_result.min)
6451
                  || compare_values (TYPE_MAX_VALUE (TREE_TYPE (vr_result.max)),
6452
                                     vr_result.min) < 0)
6453
                goto varying;
6454
 
6455
              if (!needs_overflow_infinity (TREE_TYPE (vr_result.max))
6456
                  || !vrp_var_may_overflow (lhs, phi))
6457
                vr_result.max = TYPE_MAX_VALUE (TREE_TYPE (vr_result.max));
6458
              else if (supports_overflow_infinity (TREE_TYPE (vr_result.max)))
6459
                vr_result.max =
6460
                  positive_overflow_infinity (TREE_TYPE (vr_result.max));
6461
              else
6462
                goto varying;
6463
            }
6464
        }
6465
    }
6466
 
6467
  /* If the new range is different than the previous value, keep
6468
     iterating.  */
6469
  if (update_value_range (lhs, &vr_result))
6470
    {
6471
      if (dump_file && (dump_flags & TDF_DETAILS))
6472
        {
6473
          fprintf (dump_file, "Found new range for ");
6474
          print_generic_expr (dump_file, lhs, 0);
6475
          fprintf (dump_file, ": ");
6476
          dump_value_range (dump_file, &vr_result);
6477
          fprintf (dump_file, "\n\n");
6478
        }
6479
 
6480
      return SSA_PROP_INTERESTING;
6481
    }
6482
 
6483
  /* Nothing changed, don't add outgoing edges.  */
6484
  return SSA_PROP_NOT_INTERESTING;
6485
 
6486
  /* No match found.  Set the LHS to VARYING.  */
6487
varying:
6488
  set_value_range_to_varying (lhs_vr);
6489
  return SSA_PROP_VARYING;
6490
}
6491
 
6492
/* Simplify boolean operations if the source is known
6493
   to be already a boolean.  */
6494
static bool
6495
simplify_truth_ops_using_ranges (gimple_stmt_iterator *gsi, gimple stmt)
6496
{
6497
  enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
6498
  tree val = NULL;
6499
  tree op0, op1;
6500
  value_range_t *vr;
6501
  bool sop = false;
6502
  bool need_conversion;
6503
 
6504
  op0 = gimple_assign_rhs1 (stmt);
6505
  if (TYPE_PRECISION (TREE_TYPE (op0)) != 1)
6506
    {
6507
      if (TREE_CODE (op0) != SSA_NAME)
6508
        return false;
6509
      vr = get_value_range (op0);
6510
 
6511
      val = compare_range_with_value (GE_EXPR, vr, integer_zero_node, &sop);
6512
      if (!val || !integer_onep (val))
6513
        return false;
6514
 
6515
      val = compare_range_with_value (LE_EXPR, vr, integer_one_node, &sop);
6516
      if (!val || !integer_onep (val))
6517
        return false;
6518
    }
6519
 
6520
  if (rhs_code == TRUTH_NOT_EXPR)
6521
    {
6522
      rhs_code = NE_EXPR;
6523
      op1 = build_int_cst (TREE_TYPE (op0), 1);
6524
    }
6525
  else
6526
    {
6527
      op1 = gimple_assign_rhs2 (stmt);
6528
 
6529
      /* Reduce number of cases to handle.  */
6530
      if (is_gimple_min_invariant (op1))
6531
        {
6532
          /* Exclude anything that should have been already folded.  */
6533
          if (rhs_code != EQ_EXPR
6534
              && rhs_code != NE_EXPR
6535
              && rhs_code != TRUTH_XOR_EXPR)
6536
            return false;
6537
 
6538
          if (!integer_zerop (op1)
6539
              && !integer_onep (op1)
6540
              && !integer_all_onesp (op1))
6541
            return false;
6542
 
6543
          /* Limit the number of cases we have to consider.  */
6544
          if (rhs_code == EQ_EXPR)
6545
            {
6546
              rhs_code = NE_EXPR;
6547
              op1 = fold_unary (TRUTH_NOT_EXPR, TREE_TYPE (op1), op1);
6548
            }
6549
        }
6550
      else
6551
        {
6552
          /* Punt on A == B as there is no BIT_XNOR_EXPR.  */
6553
          if (rhs_code == EQ_EXPR)
6554
            return false;
6555
 
6556
          if (TYPE_PRECISION (TREE_TYPE (op1)) != 1)
6557
            {
6558
              vr = get_value_range (op1);
6559
              val = compare_range_with_value (GE_EXPR, vr, integer_zero_node, &sop);
6560
              if (!val || !integer_onep (val))
6561
                return false;
6562
 
6563
              val = compare_range_with_value (LE_EXPR, vr, integer_one_node, &sop);
6564
              if (!val || !integer_onep (val))
6565
                return false;
6566
            }
6567
        }
6568
    }
6569
 
6570
  if (sop && issue_strict_overflow_warning (WARN_STRICT_OVERFLOW_MISC))
6571
    {
6572
      location_t location;
6573
 
6574
      if (!gimple_has_location (stmt))
6575
        location = input_location;
6576
      else
6577
        location = gimple_location (stmt);
6578
 
6579
      if (rhs_code == TRUTH_AND_EXPR || rhs_code == TRUTH_OR_EXPR)
6580
        warning_at (location, OPT_Wstrict_overflow,
6581
                    _("assuming signed overflow does not occur when "
6582
                      "simplifying && or || to & or |"));
6583
      else
6584
        warning_at (location, OPT_Wstrict_overflow,
6585
                    _("assuming signed overflow does not occur when "
6586
                      "simplifying ==, != or ! to identity or ^"));
6587
    }
6588
 
6589
  need_conversion =
6590
    !useless_type_conversion_p (TREE_TYPE (gimple_assign_lhs (stmt)),
6591
                                TREE_TYPE (op0));
6592
 
6593
  /* Make sure to not sign-extend -1 as a boolean value.  */
6594
  if (need_conversion
6595
      && !TYPE_UNSIGNED (TREE_TYPE (op0))
6596
      && TYPE_PRECISION (TREE_TYPE (op0)) == 1)
6597
    return false;
6598
 
6599
  switch (rhs_code)
6600
    {
6601
    case TRUTH_AND_EXPR:
6602
      rhs_code = BIT_AND_EXPR;
6603
      break;
6604
    case TRUTH_OR_EXPR:
6605
      rhs_code = BIT_IOR_EXPR;
6606
      break;
6607
    case TRUTH_XOR_EXPR:
6608
    case NE_EXPR:
6609
      if (integer_zerop (op1))
6610
        {
6611
          gimple_assign_set_rhs_with_ops (gsi,
6612
                                          need_conversion ? NOP_EXPR : SSA_NAME,
6613
                                          op0, NULL);
6614
          update_stmt (gsi_stmt (*gsi));
6615
          return true;
6616
        }
6617
 
6618
      rhs_code = BIT_XOR_EXPR;
6619
      break;
6620
    default:
6621
      gcc_unreachable ();
6622
    }
6623
 
6624
  if (need_conversion)
6625
    return false;
6626
 
6627
  gimple_assign_set_rhs_with_ops (gsi, rhs_code, op0, op1);
6628
  update_stmt (gsi_stmt (*gsi));
6629
  return true;
6630
}
6631
 
6632
/* Simplify a division or modulo operator to a right shift or
6633
   bitwise and if the first operand is unsigned or is greater
6634
   than zero and the second operand is an exact power of two.  */
6635
 
6636
static bool
6637
simplify_div_or_mod_using_ranges (gimple stmt)
6638
{
6639
  enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
6640
  tree val = NULL;
6641
  tree op0 = gimple_assign_rhs1 (stmt);
6642
  tree op1 = gimple_assign_rhs2 (stmt);
6643
  value_range_t *vr = get_value_range (gimple_assign_rhs1 (stmt));
6644
 
6645
  if (TYPE_UNSIGNED (TREE_TYPE (op0)))
6646
    {
6647
      val = integer_one_node;
6648
    }
6649
  else
6650
    {
6651
      bool sop = false;
6652
 
6653
      val = compare_range_with_value (GE_EXPR, vr, integer_zero_node, &sop);
6654
 
6655
      if (val
6656
          && sop
6657
          && integer_onep (val)
6658
          && issue_strict_overflow_warning (WARN_STRICT_OVERFLOW_MISC))
6659
        {
6660
          location_t location;
6661
 
6662
          if (!gimple_has_location (stmt))
6663
            location = input_location;
6664
          else
6665
            location = gimple_location (stmt);
6666
          warning_at (location, OPT_Wstrict_overflow,
6667
                      "assuming signed overflow does not occur when "
6668
                      "simplifying %</%> or %<%%%> to %<>>%> or %<&%>");
6669
        }
6670
    }
6671
 
6672
  if (val && integer_onep (val))
6673
    {
6674
      tree t;
6675
 
6676
      if (rhs_code == TRUNC_DIV_EXPR)
6677
        {
6678
          t = build_int_cst (NULL_TREE, tree_log2 (op1));
6679
          gimple_assign_set_rhs_code (stmt, RSHIFT_EXPR);
6680
          gimple_assign_set_rhs1 (stmt, op0);
6681
          gimple_assign_set_rhs2 (stmt, t);
6682
        }
6683
      else
6684
        {
6685
          t = build_int_cst (TREE_TYPE (op1), 1);
6686
          t = int_const_binop (MINUS_EXPR, op1, t, 0);
6687
          t = fold_convert (TREE_TYPE (op0), t);
6688
 
6689
          gimple_assign_set_rhs_code (stmt, BIT_AND_EXPR);
6690
          gimple_assign_set_rhs1 (stmt, op0);
6691
          gimple_assign_set_rhs2 (stmt, t);
6692
        }
6693
 
6694
      update_stmt (stmt);
6695
      return true;
6696
    }
6697
 
6698
  return false;
6699
}
6700
 
6701
/* If the operand to an ABS_EXPR is >= 0, then eliminate the
6702
   ABS_EXPR.  If the operand is <= 0, then simplify the
6703
   ABS_EXPR into a NEGATE_EXPR.  */
6704
 
6705
static bool
6706
simplify_abs_using_ranges (gimple stmt)
6707
{
6708
  tree val = NULL;
6709
  tree op = gimple_assign_rhs1 (stmt);
6710
  tree type = TREE_TYPE (op);
6711
  value_range_t *vr = get_value_range (op);
6712
 
6713
  if (TYPE_UNSIGNED (type))
6714
    {
6715
      val = integer_zero_node;
6716
    }
6717
  else if (vr)
6718
    {
6719
      bool sop = false;
6720
 
6721
      val = compare_range_with_value (LE_EXPR, vr, integer_zero_node, &sop);
6722
      if (!val)
6723
        {
6724
          sop = false;
6725
          val = compare_range_with_value (GE_EXPR, vr, integer_zero_node,
6726
                                          &sop);
6727
 
6728
          if (val)
6729
            {
6730
              if (integer_zerop (val))
6731
                val = integer_one_node;
6732
              else if (integer_onep (val))
6733
                val = integer_zero_node;
6734
            }
6735
        }
6736
 
6737
      if (val
6738
          && (integer_onep (val) || integer_zerop (val)))
6739
        {
6740
          if (sop && issue_strict_overflow_warning (WARN_STRICT_OVERFLOW_MISC))
6741
            {
6742
              location_t location;
6743
 
6744
              if (!gimple_has_location (stmt))
6745
                location = input_location;
6746
              else
6747
                location = gimple_location (stmt);
6748
              warning_at (location, OPT_Wstrict_overflow,
6749
                          "assuming signed overflow does not occur when "
6750
                          "simplifying %<abs (X)%> to %<X%> or %<-X%>");
6751
            }
6752
 
6753
          gimple_assign_set_rhs1 (stmt, op);
6754
          if (integer_onep (val))
6755
            gimple_assign_set_rhs_code (stmt, NEGATE_EXPR);
6756
          else
6757
            gimple_assign_set_rhs_code (stmt, SSA_NAME);
6758
          update_stmt (stmt);
6759
          return true;
6760
        }
6761
    }
6762
 
6763
  return false;
6764
}
6765
 
6766
/* We are comparing trees OP0 and OP1 using COND_CODE.  OP0 has
6767
   a known value range VR.
6768
 
6769
   If there is one and only one value which will satisfy the
6770
   conditional, then return that value.  Else return NULL.  */
6771
 
6772
static tree
6773
test_for_singularity (enum tree_code cond_code, tree op0,
6774
                      tree op1, value_range_t *vr)
6775
{
6776
  tree min = NULL;
6777
  tree max = NULL;
6778
 
6779
  /* Extract minimum/maximum values which satisfy the
6780
     the conditional as it was written.  */
6781
  if (cond_code == LE_EXPR || cond_code == LT_EXPR)
6782
    {
6783
      /* This should not be negative infinity; there is no overflow
6784
         here.  */
6785
      min = TYPE_MIN_VALUE (TREE_TYPE (op0));
6786
 
6787
      max = op1;
6788
      if (cond_code == LT_EXPR && !is_overflow_infinity (max))
6789
        {
6790
          tree one = build_int_cst (TREE_TYPE (op0), 1);
6791
          max = fold_build2 (MINUS_EXPR, TREE_TYPE (op0), max, one);
6792
          if (EXPR_P (max))
6793
            TREE_NO_WARNING (max) = 1;
6794
        }
6795
    }
6796
  else if (cond_code == GE_EXPR || cond_code == GT_EXPR)
6797
    {
6798
      /* This should not be positive infinity; there is no overflow
6799
         here.  */
6800
      max = TYPE_MAX_VALUE (TREE_TYPE (op0));
6801
 
6802
      min = op1;
6803
      if (cond_code == GT_EXPR && !is_overflow_infinity (min))
6804
        {
6805
          tree one = build_int_cst (TREE_TYPE (op0), 1);
6806
          min = fold_build2 (PLUS_EXPR, TREE_TYPE (op0), min, one);
6807
          if (EXPR_P (min))
6808
            TREE_NO_WARNING (min) = 1;
6809
        }
6810
    }
6811
 
6812
  /* Now refine the minimum and maximum values using any
6813
     value range information we have for op0.  */
6814
  if (min && max)
6815
    {
6816
      if (compare_values (vr->min, min) == 1)
6817
        min = vr->min;
6818
      if (compare_values (vr->max, max) == -1)
6819
        max = vr->max;
6820
 
6821
      /* If the new min/max values have converged to a single value,
6822
         then there is only one value which can satisfy the condition,
6823
         return that value.  */
6824
      if (operand_equal_p (min, max, 0) && is_gimple_min_invariant (min))
6825
        return min;
6826
    }
6827
  return NULL;
6828
}
6829
 
6830
/* Simplify a conditional using a relational operator to an equality
6831
   test if the range information indicates only one value can satisfy
6832
   the original conditional.  */
6833
 
6834
static bool
6835
simplify_cond_using_ranges (gimple stmt)
6836
{
6837
  tree op0 = gimple_cond_lhs (stmt);
6838
  tree op1 = gimple_cond_rhs (stmt);
6839
  enum tree_code cond_code = gimple_cond_code (stmt);
6840
 
6841
  if (cond_code != NE_EXPR
6842
      && cond_code != EQ_EXPR
6843
      && TREE_CODE (op0) == SSA_NAME
6844
      && INTEGRAL_TYPE_P (TREE_TYPE (op0))
6845
      && is_gimple_min_invariant (op1))
6846
    {
6847
      value_range_t *vr = get_value_range (op0);
6848
 
6849
      /* If we have range information for OP0, then we might be
6850
         able to simplify this conditional. */
6851
      if (vr->type == VR_RANGE)
6852
        {
6853
          tree new_tree = test_for_singularity (cond_code, op0, op1, vr);
6854
 
6855
          if (new_tree)
6856
            {
6857
              if (dump_file)
6858
                {
6859
                  fprintf (dump_file, "Simplified relational ");
6860
                  print_gimple_stmt (dump_file, stmt, 0, 0);
6861
                  fprintf (dump_file, " into ");
6862
                }
6863
 
6864
              gimple_cond_set_code (stmt, EQ_EXPR);
6865
              gimple_cond_set_lhs (stmt, op0);
6866
              gimple_cond_set_rhs (stmt, new_tree);
6867
 
6868
              update_stmt (stmt);
6869
 
6870
              if (dump_file)
6871
                {
6872
                  print_gimple_stmt (dump_file, stmt, 0, 0);
6873
                  fprintf (dump_file, "\n");
6874
                }
6875
 
6876
              return true;
6877
            }
6878
 
6879
          /* Try again after inverting the condition.  We only deal
6880
             with integral types here, so no need to worry about
6881
             issues with inverting FP comparisons.  */
6882
          cond_code = invert_tree_comparison (cond_code, false);
6883
          new_tree = test_for_singularity (cond_code, op0, op1, vr);
6884
 
6885
          if (new_tree)
6886
            {
6887
              if (dump_file)
6888
                {
6889
                  fprintf (dump_file, "Simplified relational ");
6890
                  print_gimple_stmt (dump_file, stmt, 0, 0);
6891
                  fprintf (dump_file, " into ");
6892
                }
6893
 
6894
              gimple_cond_set_code (stmt, NE_EXPR);
6895
              gimple_cond_set_lhs (stmt, op0);
6896
              gimple_cond_set_rhs (stmt, new_tree);
6897
 
6898
              update_stmt (stmt);
6899
 
6900
              if (dump_file)
6901
                {
6902
                  print_gimple_stmt (dump_file, stmt, 0, 0);
6903
                  fprintf (dump_file, "\n");
6904
                }
6905
 
6906
              return true;
6907
            }
6908
        }
6909
    }
6910
 
6911
  return false;
6912
}
6913
 
6914
/* Simplify a switch statement using the value range of the switch
6915
   argument.  */
6916
 
6917
static bool
6918
simplify_switch_using_ranges (gimple stmt)
6919
{
6920
  tree op = gimple_switch_index (stmt);
6921
  value_range_t *vr;
6922
  bool take_default;
6923
  edge e;
6924
  edge_iterator ei;
6925
  size_t i = 0, j = 0, n, n2;
6926
  tree vec2;
6927
  switch_update su;
6928
 
6929
  if (TREE_CODE (op) == SSA_NAME)
6930
    {
6931
      vr = get_value_range (op);
6932
 
6933
      /* We can only handle integer ranges.  */
6934
      if (vr->type != VR_RANGE
6935
          || symbolic_range_p (vr))
6936
        return false;
6937
 
6938
      /* Find case label for min/max of the value range.  */
6939
      take_default = !find_case_label_range (stmt, vr->min, vr->max, &i, &j);
6940
    }
6941
  else if (TREE_CODE (op) == INTEGER_CST)
6942
    {
6943
      take_default = !find_case_label_index (stmt, 1, op, &i);
6944
      if (take_default)
6945
        {
6946
          i = 1;
6947
          j = 0;
6948
        }
6949
      else
6950
        {
6951
          j = i;
6952
        }
6953
    }
6954
  else
6955
    return false;
6956
 
6957
  n = gimple_switch_num_labels (stmt);
6958
 
6959
  /* Bail out if this is just all edges taken.  */
6960
  if (i == 1
6961
      && j == n - 1
6962
      && take_default)
6963
    return false;
6964
 
6965
  /* Build a new vector of taken case labels.  */
6966
  vec2 = make_tree_vec (j - i + 1 + (int)take_default);
6967
  n2 = 0;
6968
 
6969
  /* Add the default edge, if necessary.  */
6970
  if (take_default)
6971
    TREE_VEC_ELT (vec2, n2++) = gimple_switch_default_label (stmt);
6972
 
6973
  for (; i <= j; ++i, ++n2)
6974
    TREE_VEC_ELT (vec2, n2) = gimple_switch_label (stmt, i);
6975
 
6976
  /* Mark needed edges.  */
6977
  for (i = 0; i < n2; ++i)
6978
    {
6979
      e = find_edge (gimple_bb (stmt),
6980
                     label_to_block (CASE_LABEL (TREE_VEC_ELT (vec2, i))));
6981
      e->aux = (void *)-1;
6982
    }
6983
 
6984
  /* Queue not needed edges for later removal.  */
6985
  FOR_EACH_EDGE (e, ei, gimple_bb (stmt)->succs)
6986
    {
6987
      if (e->aux == (void *)-1)
6988
        {
6989
          e->aux = NULL;
6990
          continue;
6991
        }
6992
 
6993
      if (dump_file && (dump_flags & TDF_DETAILS))
6994
        {
6995
          fprintf (dump_file, "removing unreachable case label\n");
6996
        }
6997
      VEC_safe_push (edge, heap, to_remove_edges, e);
6998
      e->flags &= ~EDGE_EXECUTABLE;
6999
    }
7000
 
7001
  /* And queue an update for the stmt.  */
7002
  su.stmt = stmt;
7003
  su.vec = vec2;
7004
  VEC_safe_push (switch_update, heap, to_update_switch_stmts, &su);
7005
  return false;
7006
}
7007
 
7008
/* Simplify STMT using ranges if possible.  */
7009
 
7010
static bool
7011
simplify_stmt_using_ranges (gimple_stmt_iterator *gsi)
7012
{
7013
  gimple stmt = gsi_stmt (*gsi);
7014
  if (is_gimple_assign (stmt))
7015
    {
7016
      enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
7017
 
7018
      switch (rhs_code)
7019
        {
7020
        case EQ_EXPR:
7021
        case NE_EXPR:
7022
        case TRUTH_NOT_EXPR:
7023
        case TRUTH_AND_EXPR:
7024
        case TRUTH_OR_EXPR:
7025
        case TRUTH_XOR_EXPR:
7026
          /* Transform EQ_EXPR, NE_EXPR, TRUTH_NOT_EXPR into BIT_XOR_EXPR
7027
             or identity if the RHS is zero or one, and the LHS are known
7028
             to be boolean values.  Transform all TRUTH_*_EXPR into
7029
             BIT_*_EXPR if both arguments are known to be boolean values.  */
7030
          if (INTEGRAL_TYPE_P (TREE_TYPE (gimple_assign_rhs1 (stmt))))
7031
            return simplify_truth_ops_using_ranges (gsi, stmt);
7032
          break;
7033
 
7034
      /* Transform TRUNC_DIV_EXPR and TRUNC_MOD_EXPR into RSHIFT_EXPR
7035
         and BIT_AND_EXPR respectively if the first operand is greater
7036
         than zero and the second operand is an exact power of two.  */
7037
        case TRUNC_DIV_EXPR:
7038
        case TRUNC_MOD_EXPR:
7039
          if (INTEGRAL_TYPE_P (TREE_TYPE (gimple_assign_rhs1 (stmt)))
7040
              && integer_pow2p (gimple_assign_rhs2 (stmt)))
7041
            return simplify_div_or_mod_using_ranges (stmt);
7042
          break;
7043
 
7044
      /* Transform ABS (X) into X or -X as appropriate.  */
7045
        case ABS_EXPR:
7046
          if (TREE_CODE (gimple_assign_rhs1 (stmt)) == SSA_NAME
7047
              && INTEGRAL_TYPE_P (TREE_TYPE (gimple_assign_rhs1 (stmt))))
7048
            return simplify_abs_using_ranges (stmt);
7049
          break;
7050
 
7051
        default:
7052
          break;
7053
        }
7054
    }
7055
  else if (gimple_code (stmt) == GIMPLE_COND)
7056
    return simplify_cond_using_ranges (stmt);
7057
  else if (gimple_code (stmt) == GIMPLE_SWITCH)
7058
    return simplify_switch_using_ranges (stmt);
7059
 
7060
  return false;
7061
}
7062
 
7063
/* If the statement pointed by SI has a predicate whose value can be
7064
   computed using the value range information computed by VRP, compute
7065
   its value and return true.  Otherwise, return false.  */
7066
 
7067
static bool
7068
fold_predicate_in (gimple_stmt_iterator *si)
7069
{
7070
  bool assignment_p = false;
7071
  tree val;
7072
  gimple stmt = gsi_stmt (*si);
7073
 
7074
  if (is_gimple_assign (stmt)
7075
      && TREE_CODE_CLASS (gimple_assign_rhs_code (stmt)) == tcc_comparison)
7076
    {
7077
      assignment_p = true;
7078
      val = vrp_evaluate_conditional (gimple_assign_rhs_code (stmt),
7079
                                      gimple_assign_rhs1 (stmt),
7080
                                      gimple_assign_rhs2 (stmt),
7081
                                      stmt);
7082
    }
7083
  else if (gimple_code (stmt) == GIMPLE_COND)
7084
    val = vrp_evaluate_conditional (gimple_cond_code (stmt),
7085
                                    gimple_cond_lhs (stmt),
7086
                                    gimple_cond_rhs (stmt),
7087
                                    stmt);
7088
  else
7089
    return false;
7090
 
7091
  if (val)
7092
    {
7093
      if (assignment_p)
7094
        val = fold_convert (gimple_expr_type (stmt), val);
7095
 
7096
      if (dump_file)
7097
        {
7098
          fprintf (dump_file, "Folding predicate ");
7099
          print_gimple_expr (dump_file, stmt, 0, 0);
7100
          fprintf (dump_file, " to ");
7101
          print_generic_expr (dump_file, val, 0);
7102
          fprintf (dump_file, "\n");
7103
        }
7104
 
7105
      if (is_gimple_assign (stmt))
7106
        gimple_assign_set_rhs_from_tree (si, val);
7107
      else
7108
        {
7109
          gcc_assert (gimple_code (stmt) == GIMPLE_COND);
7110
          if (integer_zerop (val))
7111
            gimple_cond_make_false (stmt);
7112
          else if (integer_onep (val))
7113
            gimple_cond_make_true (stmt);
7114
          else
7115
            gcc_unreachable ();
7116
        }
7117
 
7118
      return true;
7119
    }
7120
 
7121
  return false;
7122
}
7123
 
7124
/* Callback for substitute_and_fold folding the stmt at *SI.  */
7125
 
7126
static bool
7127
vrp_fold_stmt (gimple_stmt_iterator *si)
7128
{
7129
  if (fold_predicate_in (si))
7130
    return true;
7131
 
7132
  return simplify_stmt_using_ranges (si);
7133
}
7134
 
7135
/* Stack of dest,src equivalency pairs that need to be restored after
7136
   each attempt to thread a block's incoming edge to an outgoing edge.
7137
 
7138
   A NULL entry is used to mark the end of pairs which need to be
7139
   restored.  */
7140
static VEC(tree,heap) *stack;
7141
 
7142
/* A trivial wrapper so that we can present the generic jump threading
7143
   code with a simple API for simplifying statements.  STMT is the
7144
   statement we want to simplify, WITHIN_STMT provides the location
7145
   for any overflow warnings.  */
7146
 
7147
static tree
7148
simplify_stmt_for_jump_threading (gimple stmt, gimple within_stmt)
7149
{
7150
  /* We only use VRP information to simplify conditionals.  This is
7151
     overly conservative, but it's unclear if doing more would be
7152
     worth the compile time cost.  */
7153
  if (gimple_code (stmt) != GIMPLE_COND)
7154
    return NULL;
7155
 
7156
  return vrp_evaluate_conditional (gimple_cond_code (stmt),
7157
                                   gimple_cond_lhs (stmt),
7158
                                   gimple_cond_rhs (stmt), within_stmt);
7159
}
7160
 
7161
/* Blocks which have more than one predecessor and more than
7162
   one successor present jump threading opportunities, i.e.,
7163
   when the block is reached from a specific predecessor, we
7164
   may be able to determine which of the outgoing edges will
7165
   be traversed.  When this optimization applies, we are able
7166
   to avoid conditionals at runtime and we may expose secondary
7167
   optimization opportunities.
7168
 
7169
   This routine is effectively a driver for the generic jump
7170
   threading code.  It basically just presents the generic code
7171
   with edges that may be suitable for jump threading.
7172
 
7173
   Unlike DOM, we do not iterate VRP if jump threading was successful.
7174
   While iterating may expose new opportunities for VRP, it is expected
7175
   those opportunities would be very limited and the compile time cost
7176
   to expose those opportunities would be significant.
7177
 
7178
   As jump threading opportunities are discovered, they are registered
7179
   for later realization.  */
7180
 
7181
static void
7182
identify_jump_threads (void)
7183
{
7184
  basic_block bb;
7185
  gimple dummy;
7186
  int i;
7187
  edge e;
7188
 
7189
  /* Ugh.  When substituting values earlier in this pass we can
7190
     wipe the dominance information.  So rebuild the dominator
7191
     information as we need it within the jump threading code.  */
7192
  calculate_dominance_info (CDI_DOMINATORS);
7193
 
7194
  /* We do not allow VRP information to be used for jump threading
7195
     across a back edge in the CFG.  Otherwise it becomes too
7196
     difficult to avoid eliminating loop exit tests.  Of course
7197
     EDGE_DFS_BACK is not accurate at this time so we have to
7198
     recompute it.  */
7199
  mark_dfs_back_edges ();
7200
 
7201
  /* Do not thread across edges we are about to remove.  Just marking
7202
     them as EDGE_DFS_BACK will do.  */
7203
  for (i = 0; VEC_iterate (edge, to_remove_edges, i, e); ++i)
7204
    e->flags |= EDGE_DFS_BACK;
7205
 
7206
  /* Allocate our unwinder stack to unwind any temporary equivalences
7207
     that might be recorded.  */
7208
  stack = VEC_alloc (tree, heap, 20);
7209
 
7210
  /* To avoid lots of silly node creation, we create a single
7211
     conditional and just modify it in-place when attempting to
7212
     thread jumps.  */
7213
  dummy = gimple_build_cond (EQ_EXPR,
7214
                             integer_zero_node, integer_zero_node,
7215
                             NULL, NULL);
7216
 
7217
  /* Walk through all the blocks finding those which present a
7218
     potential jump threading opportunity.  We could set this up
7219
     as a dominator walker and record data during the walk, but
7220
     I doubt it's worth the effort for the classes of jump
7221
     threading opportunities we are trying to identify at this
7222
     point in compilation.  */
7223
  FOR_EACH_BB (bb)
7224
    {
7225
      gimple last;
7226
 
7227
      /* If the generic jump threading code does not find this block
7228
         interesting, then there is nothing to do.  */
7229
      if (! potentially_threadable_block (bb))
7230
        continue;
7231
 
7232
      /* We only care about blocks ending in a COND_EXPR.  While there
7233
         may be some value in handling SWITCH_EXPR here, I doubt it's
7234
         terribly important.  */
7235
      last = gsi_stmt (gsi_last_bb (bb));
7236
      if (gimple_code (last) != GIMPLE_COND)
7237
        continue;
7238
 
7239
      /* We're basically looking for any kind of conditional with
7240
         integral type arguments.  */
7241
      if (TREE_CODE (gimple_cond_lhs (last)) == SSA_NAME
7242
          && INTEGRAL_TYPE_P (TREE_TYPE (gimple_cond_lhs (last)))
7243
          && (TREE_CODE (gimple_cond_rhs (last)) == SSA_NAME
7244
              || is_gimple_min_invariant (gimple_cond_rhs (last)))
7245
          && INTEGRAL_TYPE_P (TREE_TYPE (gimple_cond_rhs (last))))
7246
        {
7247
          edge_iterator ei;
7248
 
7249
          /* We've got a block with multiple predecessors and multiple
7250
             successors which also ends in a suitable conditional.  For
7251
             each predecessor, see if we can thread it to a specific
7252
             successor.  */
7253
          FOR_EACH_EDGE (e, ei, bb->preds)
7254
            {
7255
              /* Do not thread across back edges or abnormal edges
7256
                 in the CFG.  */
7257
              if (e->flags & (EDGE_DFS_BACK | EDGE_COMPLEX))
7258
                continue;
7259
 
7260
              thread_across_edge (dummy, e, true, &stack,
7261
                                  simplify_stmt_for_jump_threading);
7262
            }
7263
        }
7264
    }
7265
 
7266
  /* We do not actually update the CFG or SSA graphs at this point as
7267
     ASSERT_EXPRs are still in the IL and cfg cleanup code does not yet
7268
     handle ASSERT_EXPRs gracefully.  */
7269
}
7270
 
7271
/* We identified all the jump threading opportunities earlier, but could
7272
   not transform the CFG at that time.  This routine transforms the
7273
   CFG and arranges for the dominator tree to be rebuilt if necessary.
7274
 
7275
   Note the SSA graph update will occur during the normal TODO
7276
   processing by the pass manager.  */
7277
static void
7278
finalize_jump_threads (void)
7279
{
7280
  thread_through_all_blocks (false);
7281
  VEC_free (tree, heap, stack);
7282
}
7283
 
7284
 
7285
/* Traverse all the blocks folding conditionals with known ranges.  */
7286
 
7287
static void
7288
vrp_finalize (void)
7289
{
7290
  size_t i;
7291
  prop_value_t *single_val_range;
7292
  bool do_value_subst_p;
7293
 
7294
  if (dump_file)
7295
    {
7296
      fprintf (dump_file, "\nValue ranges after VRP:\n\n");
7297
      dump_all_value_ranges (dump_file);
7298
      fprintf (dump_file, "\n");
7299
    }
7300
 
7301
  /* We may have ended with ranges that have exactly one value.  Those
7302
     values can be substituted as any other const propagated
7303
     value using substitute_and_fold.  */
7304
  single_val_range = XCNEWVEC (prop_value_t, num_ssa_names);
7305
 
7306
  do_value_subst_p = false;
7307
  for (i = 0; i < num_ssa_names; i++)
7308
    if (vr_value[i]
7309
        && vr_value[i]->type == VR_RANGE
7310
        && vr_value[i]->min == vr_value[i]->max
7311
        && is_gimple_min_invariant (vr_value[i]->min))
7312
      {
7313
        single_val_range[i].value = vr_value[i]->min;
7314
        do_value_subst_p = true;
7315
      }
7316
 
7317
  if (!do_value_subst_p)
7318
    {
7319
      /* We found no single-valued ranges, don't waste time trying to
7320
         do single value substitution in substitute_and_fold.  */
7321
      free (single_val_range);
7322
      single_val_range = NULL;
7323
    }
7324
 
7325
  substitute_and_fold (single_val_range, vrp_fold_stmt, false);
7326
 
7327
  if (warn_array_bounds)
7328
    check_all_array_refs ();
7329
 
7330
  /* We must identify jump threading opportunities before we release
7331
     the datastructures built by VRP.  */
7332
  identify_jump_threads ();
7333
 
7334
  /* Free allocated memory.  */
7335
  for (i = 0; i < num_ssa_names; i++)
7336
    if (vr_value[i])
7337
      {
7338
        BITMAP_FREE (vr_value[i]->equiv);
7339
        free (vr_value[i]);
7340
      }
7341
 
7342
  free (single_val_range);
7343
  free (vr_value);
7344
  free (vr_phi_edge_counts);
7345
 
7346
  /* So that we can distinguish between VRP data being available
7347
     and not available.  */
7348
  vr_value = NULL;
7349
  vr_phi_edge_counts = NULL;
7350
}
7351
 
7352
 
7353
/* Main entry point to VRP (Value Range Propagation).  This pass is
7354
   loosely based on J. R. C. Patterson, ``Accurate Static Branch
7355
   Prediction by Value Range Propagation,'' in SIGPLAN Conference on
7356
   Programming Language Design and Implementation, pp. 67-78, 1995.
7357
   Also available at http://citeseer.ist.psu.edu/patterson95accurate.html
7358
 
7359
   This is essentially an SSA-CCP pass modified to deal with ranges
7360
   instead of constants.
7361
 
7362
   While propagating ranges, we may find that two or more SSA name
7363
   have equivalent, though distinct ranges.  For instance,
7364
 
7365
     1  x_9 = p_3->a;
7366
     2  p_4 = ASSERT_EXPR <p_3, p_3 != 0>
7367
     3  if (p_4 == q_2)
7368
     4    p_5 = ASSERT_EXPR <p_4, p_4 == q_2>;
7369
     5  endif
7370
     6  if (q_2)
7371
 
7372
   In the code above, pointer p_5 has range [q_2, q_2], but from the
7373
   code we can also determine that p_5 cannot be NULL and, if q_2 had
7374
   a non-varying range, p_5's range should also be compatible with it.
7375
 
7376
   These equivalences are created by two expressions: ASSERT_EXPR and
7377
   copy operations.  Since p_5 is an assertion on p_4, and p_4 was the
7378
   result of another assertion, then we can use the fact that p_5 and
7379
   p_4 are equivalent when evaluating p_5's range.
7380
 
7381
   Together with value ranges, we also propagate these equivalences
7382
   between names so that we can take advantage of information from
7383
   multiple ranges when doing final replacement.  Note that this
7384
   equivalency relation is transitive but not symmetric.
7385
 
7386
   In the example above, p_5 is equivalent to p_4, q_2 and p_3, but we
7387
   cannot assert that q_2 is equivalent to p_5 because q_2 may be used
7388
   in contexts where that assertion does not hold (e.g., in line 6).
7389
 
7390
   TODO, the main difference between this pass and Patterson's is that
7391
   we do not propagate edge probabilities.  We only compute whether
7392
   edges can be taken or not.  That is, instead of having a spectrum
7393
   of jump probabilities between 0 and 1, we only deal with 0, 1 and
7394
   DON'T KNOW.  In the future, it may be worthwhile to propagate
7395
   probabilities to aid branch prediction.  */
7396
 
7397
static unsigned int
7398
execute_vrp (void)
7399
{
7400
  int i;
7401
  edge e;
7402
  switch_update *su;
7403
 
7404
  loop_optimizer_init (LOOPS_NORMAL | LOOPS_HAVE_RECORDED_EXITS);
7405
  rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa);
7406
  scev_initialize ();
7407
 
7408
  insert_range_assertions ();
7409
 
7410
  to_remove_edges = VEC_alloc (edge, heap, 10);
7411
  to_update_switch_stmts = VEC_alloc (switch_update, heap, 5);
7412
  threadedge_initialize_values ();
7413
 
7414
  vrp_initialize ();
7415
  ssa_propagate (vrp_visit_stmt, vrp_visit_phi_node);
7416
  vrp_finalize ();
7417
 
7418
  /* ASSERT_EXPRs must be removed before finalizing jump threads
7419
     as finalizing jump threads calls the CFG cleanup code which
7420
     does not properly handle ASSERT_EXPRs.  */
7421
  remove_range_assertions ();
7422
 
7423
  /* If we exposed any new variables, go ahead and put them into
7424
     SSA form now, before we handle jump threading.  This simplifies
7425
     interactions between rewriting of _DECL nodes into SSA form
7426
     and rewriting SSA_NAME nodes into SSA form after block
7427
     duplication and CFG manipulation.  */
7428
  update_ssa (TODO_update_ssa);
7429
 
7430
  finalize_jump_threads ();
7431
 
7432
  /* Remove dead edges from SWITCH_EXPR optimization.  This leaves the
7433
     CFG in a broken state and requires a cfg_cleanup run.  */
7434
  for (i = 0; VEC_iterate (edge, to_remove_edges, i, e); ++i)
7435
    remove_edge (e);
7436
  /* Update SWITCH_EXPR case label vector.  */
7437
  for (i = 0; VEC_iterate (switch_update, to_update_switch_stmts, i, su); ++i)
7438
    {
7439
      size_t j;
7440
      size_t n = TREE_VEC_LENGTH (su->vec);
7441
      tree label;
7442
      gimple_switch_set_num_labels (su->stmt, n);
7443
      for (j = 0; j < n; j++)
7444
        gimple_switch_set_label (su->stmt, j, TREE_VEC_ELT (su->vec, j));
7445
      /* As we may have replaced the default label with a regular one
7446
         make sure to make it a real default label again.  This ensures
7447
         optimal expansion.  */
7448
      label = gimple_switch_default_label (su->stmt);
7449
      CASE_LOW (label) = NULL_TREE;
7450
      CASE_HIGH (label) = NULL_TREE;
7451
    }
7452
 
7453
  if (VEC_length (edge, to_remove_edges) > 0)
7454
    free_dominance_info (CDI_DOMINATORS);
7455
 
7456
  VEC_free (edge, heap, to_remove_edges);
7457
  VEC_free (switch_update, heap, to_update_switch_stmts);
7458
  threadedge_finalize_values ();
7459
 
7460
  scev_finalize ();
7461
  loop_optimizer_finalize ();
7462
  return 0;
7463
}
7464
 
7465
static bool
7466
gate_vrp (void)
7467
{
7468
  return flag_tree_vrp != 0;
7469
}
7470
 
7471
struct gimple_opt_pass pass_vrp =
7472
{
7473
 {
7474
  GIMPLE_PASS,
7475
  "vrp",                                /* name */
7476
  gate_vrp,                             /* gate */
7477
  execute_vrp,                          /* execute */
7478
  NULL,                                 /* sub */
7479
  NULL,                                 /* next */
7480
  0,                                     /* static_pass_number */
7481
  TV_TREE_VRP,                          /* tv_id */
7482
  PROP_ssa,                             /* properties_required */
7483
  0,                                     /* properties_provided */
7484
  0,                                     /* properties_destroyed */
7485
  0,                                     /* todo_flags_start */
7486
  TODO_cleanup_cfg
7487
    | TODO_ggc_collect
7488
    | TODO_verify_ssa
7489
    | TODO_dump_func
7490
    | TODO_update_ssa                   /* todo_flags_finish */
7491
 }
7492
};

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.