ada: Fix wrong resolution for hidden discriminant in predicate
[official-gcc.git] / gcc / vr-values.cc
blobac4a83c6097b4245b34ef9849da980d3d1e2f196
1 /* Support routines for Value Range Propagation (VRP).
2 Copyright (C) 2005-2023 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
11 GCC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "backend.h"
24 #include "insn-codes.h"
25 #include "tree.h"
26 #include "gimple.h"
27 #include "ssa.h"
28 #include "optabs-tree.h"
29 #include "gimple-pretty-print.h"
30 #include "diagnostic-core.h"
31 #include "flags.h"
32 #include "fold-const.h"
33 #include "calls.h"
34 #include "cfganal.h"
35 #include "gimple-iterator.h"
36 #include "gimple-fold.h"
37 #include "tree-cfg.h"
38 #include "tree-ssa-loop-niter.h"
39 #include "tree-ssa-loop.h"
40 #include "intl.h"
41 #include "cfgloop.h"
42 #include "tree-scalar-evolution.h"
43 #include "tree-ssa-propagate.h"
44 #include "tree-chrec.h"
45 #include "omp-general.h"
46 #include "case-cfn-macros.h"
47 #include "alloc-pool.h"
48 #include "attribs.h"
49 #include "range.h"
50 #include "vr-values.h"
51 #include "cfghooks.h"
52 #include "range-op.h"
53 #include "gimple-range.h"
55 /* Return true if op is in a boolean [0, 1] value-range. */
57 bool
58 simplify_using_ranges::op_with_boolean_value_range_p (tree op, gimple *s)
60 if (TYPE_PRECISION (TREE_TYPE (op)) == 1)
61 return true;
63 if (integer_zerop (op)
64 || integer_onep (op))
65 return true;
67 if (TREE_CODE (op) != SSA_NAME)
68 return false;
70 /* ?? Errr, this should probably check for [0,0] and [1,1] as well
71 as [0,1]. */
72 value_range vr;
73 return (query->range_of_expr (vr, op, s)
74 && vr == range_true_and_false (TREE_TYPE (op)));
77 /* Helper function for simplify_internal_call_using_ranges and
78 extract_range_basic. Return true if OP0 SUBCODE OP1 for
79 SUBCODE {PLUS,MINUS,MULT}_EXPR is known to never overflow or
80 always overflow. Set *OVF to true if it is known to always
81 overflow. */
83 static bool
84 check_for_binary_op_overflow (range_query *query,
85 enum tree_code subcode, tree type,
86 tree op0, tree op1, bool *ovf, gimple *s = NULL)
88 value_range vr0, vr1;
89 if (!query->range_of_expr (vr0, op0, s) || vr0.undefined_p ())
90 vr0.set_varying (TREE_TYPE (op0));
91 if (!query->range_of_expr (vr1, op1, s) || vr1.undefined_p ())
92 vr1.set_varying (TREE_TYPE (op1));
94 tree vr0min = wide_int_to_tree (TREE_TYPE (op0), vr0.lower_bound ());
95 tree vr0max = wide_int_to_tree (TREE_TYPE (op0), vr0.upper_bound ());
96 tree vr1min = wide_int_to_tree (TREE_TYPE (op1), vr1.lower_bound ());
97 tree vr1max = wide_int_to_tree (TREE_TYPE (op1), vr1.upper_bound ());
99 *ovf = arith_overflowed_p (subcode, type, vr0min,
100 subcode == MINUS_EXPR ? vr1max : vr1min);
101 if (arith_overflowed_p (subcode, type, vr0max,
102 subcode == MINUS_EXPR ? vr1min : vr1max) != *ovf)
103 return false;
104 if (subcode == MULT_EXPR)
106 if (arith_overflowed_p (subcode, type, vr0min, vr1max) != *ovf
107 || arith_overflowed_p (subcode, type, vr0max, vr1min) != *ovf)
108 return false;
110 if (*ovf)
112 /* So far we found that there is an overflow on the boundaries.
113 That doesn't prove that there is an overflow even for all values
114 in between the boundaries. For that compute widest_int range
115 of the result and see if it doesn't overlap the range of
116 type. */
117 widest_int wmin, wmax;
118 widest_int w[4];
119 int i;
120 signop sign0 = TYPE_SIGN (TREE_TYPE (op0));
121 signop sign1 = TYPE_SIGN (TREE_TYPE (op1));
122 w[0] = widest_int::from (vr0.lower_bound (), sign0);
123 w[1] = widest_int::from (vr0.upper_bound (), sign0);
124 w[2] = widest_int::from (vr1.lower_bound (), sign1);
125 w[3] = widest_int::from (vr1.upper_bound (), sign1);
126 for (i = 0; i < 4; i++)
128 widest_int wt;
129 switch (subcode)
131 case PLUS_EXPR:
132 wt = wi::add (w[i & 1], w[2 + (i & 2) / 2]);
133 break;
134 case MINUS_EXPR:
135 wt = wi::sub (w[i & 1], w[2 + (i & 2) / 2]);
136 break;
137 case MULT_EXPR:
138 wt = wi::mul (w[i & 1], w[2 + (i & 2) / 2]);
139 break;
140 default:
141 gcc_unreachable ();
143 if (i == 0)
145 wmin = wt;
146 wmax = wt;
148 else
150 wmin = wi::smin (wmin, wt);
151 wmax = wi::smax (wmax, wt);
154 /* The result of op0 CODE op1 is known to be in range
155 [wmin, wmax]. */
156 widest_int wtmin
157 = widest_int::from (irange_val_min (type), TYPE_SIGN (type));
158 widest_int wtmax
159 = widest_int::from (irange_val_max (type), TYPE_SIGN (type));
160 /* If all values in [wmin, wmax] are smaller than
161 [wtmin, wtmax] or all are larger than [wtmin, wtmax],
162 the arithmetic operation will always overflow. */
163 if (wmax < wtmin || wmin > wtmax)
164 return true;
165 return false;
167 return true;
170 /* Set INIT, STEP, and DIRECTION the the corresponding values of NAME
171 within LOOP, and return TRUE. Otherwise return FALSE, and set R to
172 the conservative range of NAME within the loop. */
174 static bool
175 get_scev_info (vrange &r, tree name, gimple *stmt, class loop *l,
176 tree &init, tree &step, enum ev_direction &dir)
178 tree ev = analyze_scalar_evolution (l, name);
179 tree chrec = instantiate_parameters (l, ev);
180 tree type = TREE_TYPE (name);
181 if (TREE_CODE (chrec) != POLYNOMIAL_CHREC)
183 r.set_varying (type);
184 return false;
186 if (is_gimple_min_invariant (chrec))
188 if (is_gimple_constant (chrec))
189 r.set (chrec, chrec);
190 else
191 r.set_varying (type);
192 return false;
195 init = initial_condition_in_loop_num (chrec, l->num);
196 step = evolution_part_in_loop_num (chrec, l->num);
197 if (!init || !step)
199 r.set_varying (type);
200 return false;
202 dir = scev_direction (chrec);
203 if (dir == EV_DIR_UNKNOWN
204 || scev_probably_wraps_p (NULL, init, step, stmt,
205 get_chrec_loop (chrec), true))
207 r.set_varying (type);
208 return false;
210 return true;
213 /* Return TRUE if STEP * NIT may overflow when calculated in TYPE. */
215 static bool
216 induction_variable_may_overflow_p (tree type,
217 const wide_int &step, const widest_int &nit)
219 wi::overflow_type ovf;
220 signop sign = TYPE_SIGN (type);
221 widest_int max_step = wi::mul (widest_int::from (step, sign),
222 nit, sign, &ovf);
224 if (ovf || !wi::fits_to_tree_p (max_step, type))
225 return true;
227 /* For a signed type we have to check whether the result has the
228 expected signedness which is that of the step as number of
229 iterations is unsigned. */
230 return (sign == SIGNED
231 && wi::gts_p (max_step, 0) != wi::gts_p (step, 0));
234 /* Set R to the range from BEGIN to END, assuming the direction of the
235 loop is DIR. */
237 static void
238 range_from_loop_direction (irange &r, tree type,
239 const irange &begin, const irange &end,
240 ev_direction dir)
242 signop sign = TYPE_SIGN (type);
244 if (begin.undefined_p () || end.undefined_p ())
245 r.set_varying (type);
246 else if (dir == EV_DIR_GROWS)
248 if (wi::gt_p (begin.lower_bound (), end.upper_bound (), sign))
249 r.set_varying (type);
250 else
251 r = int_range<1> (type, begin.lower_bound (), end.upper_bound ());
253 else
255 if (wi::gt_p (end.lower_bound (), begin.upper_bound (), sign))
256 r.set_varying (type);
257 else
258 r = int_range<1> (type, end.lower_bound (), begin.upper_bound ());
262 /* Set V to the range of NAME in STMT within LOOP. Return TRUE if a
263 range was found. */
265 bool
266 range_of_var_in_loop (vrange &v, tree name, class loop *l, gimple *stmt,
267 range_query *query)
269 tree init, step;
270 enum ev_direction dir;
271 if (!get_scev_info (v, name, stmt, l, init, step, dir))
272 return true;
274 // Calculate ranges for the values from SCEV.
275 irange &r = as_a <irange> (v);
276 tree type = TREE_TYPE (init);
277 int_range<2> rinit (type), rstep (type), max_init (type);
278 if (!query->range_of_expr (rinit, init, stmt)
279 || !query->range_of_expr (rstep, step, stmt))
280 return false;
282 // Calculate the final range of NAME if possible.
283 if (rinit.singleton_p () && rstep.singleton_p ())
285 widest_int nit;
286 if (!max_loop_iterations (l, &nit))
287 return false;
289 if (!induction_variable_may_overflow_p (type, rstep.lower_bound (), nit))
291 // Calculate the max bounds for init (init + niter * step).
292 wide_int w = wide_int::from (nit, TYPE_PRECISION (type), TYPE_SIGN (type));
293 int_range<1> niter (type, w, w);
294 int_range_max max_step;
295 range_op_handler mult_handler (MULT_EXPR);
296 range_op_handler plus_handler (PLUS_EXPR);
297 if (!mult_handler.fold_range (max_step, type, niter, rstep)
298 || !plus_handler.fold_range (max_init, type, rinit, max_step))
299 return false;
302 range_from_loop_direction (r, type, rinit, max_init, dir);
303 return true;
306 /* Helper function for vrp_evaluate_conditional_warnv & other
307 optimizers. */
309 tree
310 simplify_using_ranges::fold_cond_with_ops (enum tree_code code,
311 tree op0, tree op1, gimple *s)
313 int_range_max r0, r1;
314 if (!query->range_of_expr (r0, op0, s)
315 || !query->range_of_expr (r1, op1, s))
316 return NULL_TREE;
318 tree type = TREE_TYPE (op0);
319 int_range<1> res;
320 range_op_handler handler (code);
321 if (handler && handler.fold_range (res, type, r0, r1))
323 if (res == range_true (type))
324 return boolean_true_node;
325 if (res == range_false (type))
326 return boolean_false_node;
328 return NULL;
331 /* Helper function for legacy_fold_cond. */
333 tree
334 simplify_using_ranges::legacy_fold_cond_overflow (gimple *stmt)
336 tree ret;
337 tree_code code = gimple_cond_code (stmt);
338 tree op0 = gimple_cond_lhs (stmt);
339 tree op1 = gimple_cond_rhs (stmt);
341 /* We only deal with integral and pointer types. */
342 if (!INTEGRAL_TYPE_P (TREE_TYPE (op0))
343 && !POINTER_TYPE_P (TREE_TYPE (op0)))
344 return NULL_TREE;
346 /* If OP0 CODE OP1 is an overflow comparison, if it can be expressed
347 as a simple equality test, then prefer that over its current form
348 for evaluation.
350 An overflow test which collapses to an equality test can always be
351 expressed as a comparison of one argument against zero. Overflow
352 occurs when the chosen argument is zero and does not occur if the
353 chosen argument is not zero. */
354 tree x;
355 if (overflow_comparison_p (code, op0, op1, &x))
357 wide_int max = wi::max_value (TYPE_PRECISION (TREE_TYPE (op0)), UNSIGNED);
358 /* B = A - 1; if (A < B) -> B = A - 1; if (A == 0)
359 B = A - 1; if (A > B) -> B = A - 1; if (A != 0)
360 B = A + 1; if (B < A) -> B = A + 1; if (B == 0)
361 B = A + 1; if (B > A) -> B = A + 1; if (B != 0) */
362 if (integer_zerop (x))
364 op1 = x;
365 code = (code == LT_EXPR || code == LE_EXPR) ? EQ_EXPR : NE_EXPR;
367 /* B = A + 1; if (A > B) -> B = A + 1; if (B == 0)
368 B = A + 1; if (A < B) -> B = A + 1; if (B != 0)
369 B = A - 1; if (B > A) -> B = A - 1; if (A == 0)
370 B = A - 1; if (B < A) -> B = A - 1; if (A != 0) */
371 else if (wi::to_wide (x) == max - 1)
373 op0 = op1;
374 op1 = wide_int_to_tree (TREE_TYPE (op0), 0);
375 code = (code == GT_EXPR || code == GE_EXPR) ? EQ_EXPR : NE_EXPR;
377 else
379 value_range vro, vri;
380 tree type = TREE_TYPE (op0);
381 if (code == GT_EXPR || code == GE_EXPR)
383 vro.set (type,
384 wi::to_wide (TYPE_MIN_VALUE (type)),
385 wi::to_wide (x), VR_ANTI_RANGE);
386 vri.set (type,
387 wi::to_wide (TYPE_MIN_VALUE (type)),
388 wi::to_wide (x));
390 else if (code == LT_EXPR || code == LE_EXPR)
392 vro.set (type,
393 wi::to_wide (TYPE_MIN_VALUE (type)),
394 wi::to_wide (x));
395 vri.set (type,
396 wi::to_wide (TYPE_MIN_VALUE (type)),
397 wi::to_wide (x),
398 VR_ANTI_RANGE);
400 else
401 gcc_unreachable ();
402 value_range vr0;
403 if (!query->range_of_expr (vr0, op0, stmt))
404 vr0.set_varying (TREE_TYPE (op0));
405 /* If vro, the range for OP0 to pass the overflow test, has
406 no intersection with *vr0, OP0's known range, then the
407 overflow test can't pass, so return the node for false.
408 If it is the inverted range, vri, that has no
409 intersection, then the overflow test must pass, so return
410 the node for true. In other cases, we could proceed with
411 a simplified condition comparing OP0 and X, with LE_EXPR
412 for previously LE_ or LT_EXPR and GT_EXPR otherwise, but
413 the comments next to the enclosing if suggest it's not
414 generally profitable to do so. */
415 vro.intersect (vr0);
416 if (vro.undefined_p ())
417 return boolean_false_node;
418 vri.intersect (vr0);
419 if (vri.undefined_p ())
420 return boolean_true_node;
424 if ((ret = fold_cond_with_ops (code, op0, op1, stmt)))
425 return ret;
426 return NULL_TREE;
429 /* Visit conditional statement STMT. If we can determine which edge
430 will be taken out of STMT's basic block, record it in
431 *TAKEN_EDGE_P. Otherwise, set *TAKEN_EDGE_P to NULL. */
433 void
434 simplify_using_ranges::legacy_fold_cond (gcond *stmt, edge *taken_edge_p)
436 tree val;
438 *taken_edge_p = NULL;
440 if (dump_file && (dump_flags & TDF_DETAILS))
442 tree use;
443 ssa_op_iter i;
445 fprintf (dump_file, "\nVisiting conditional with predicate: ");
446 print_gimple_stmt (dump_file, stmt, 0);
447 fprintf (dump_file, "\nWith known ranges\n");
449 FOR_EACH_SSA_TREE_OPERAND (use, stmt, i, SSA_OP_USE)
451 fprintf (dump_file, "\t");
452 print_generic_expr (dump_file, use);
453 fprintf (dump_file, ": ");
454 Value_Range r (TREE_TYPE (use));
455 query->range_of_expr (r, use, stmt);
456 r.dump (dump_file);
459 fprintf (dump_file, "\n");
462 val = legacy_fold_cond_overflow (stmt);
463 if (val)
464 *taken_edge_p = find_taken_edge (gimple_bb (stmt), val);
466 if (dump_file && (dump_flags & TDF_DETAILS))
468 fprintf (dump_file, "\nPredicate evaluates to: ");
469 if (val == NULL_TREE)
470 fprintf (dump_file, "DON'T KNOW\n");
471 else
472 print_generic_stmt (dump_file, val);
476 /* Searches the case label vector VEC for the ranges of CASE_LABELs that are
477 used in range VR. The indices are placed in MIN_IDX1, MAX_IDX, MIN_IDX2 and
478 MAX_IDX2. If the ranges of CASE_LABELs are empty then MAX_IDX1 < MIN_IDX1.
479 Returns true if the default label is not needed. */
481 static bool
482 find_case_label_ranges (gswitch *stmt, const value_range *vr,
483 size_t *min_idx1, size_t *max_idx1,
484 size_t *min_idx2, size_t *max_idx2)
486 size_t i, j, k, l;
487 unsigned int n = gimple_switch_num_labels (stmt);
488 bool take_default;
489 tree case_low, case_high;
490 tree min, max;
491 value_range_kind kind = get_legacy_range (*vr, min, max);
493 gcc_checking_assert (!vr->varying_p () && !vr->undefined_p ());
495 take_default = !find_case_label_range (stmt, min, max, &i, &j);
497 /* Set second range to empty. */
498 *min_idx2 = 1;
499 *max_idx2 = 0;
501 if (kind == VR_RANGE)
503 *min_idx1 = i;
504 *max_idx1 = j;
505 return !take_default;
508 /* Set first range to all case labels. */
509 *min_idx1 = 1;
510 *max_idx1 = n - 1;
512 if (i > j)
513 return false;
515 /* Make sure all the values of case labels [i , j] are contained in
516 range [MIN, MAX]. */
517 case_low = CASE_LOW (gimple_switch_label (stmt, i));
518 case_high = CASE_HIGH (gimple_switch_label (stmt, j));
519 if (tree_int_cst_compare (case_low, min) < 0)
520 i += 1;
521 if (case_high != NULL_TREE
522 && tree_int_cst_compare (max, case_high) < 0)
523 j -= 1;
525 if (i > j)
526 return false;
528 /* If the range spans case labels [i, j], the corresponding anti-range spans
529 the labels [1, i - 1] and [j + 1, n - 1]. */
530 k = j + 1;
531 l = n - 1;
532 if (k > l)
534 k = 1;
535 l = 0;
538 j = i - 1;
539 i = 1;
540 if (i > j)
542 i = k;
543 j = l;
544 k = 1;
545 l = 0;
548 *min_idx1 = i;
549 *max_idx1 = j;
550 *min_idx2 = k;
551 *max_idx2 = l;
552 return false;
555 /* Simplify boolean operations if the source is known
556 to be already a boolean. */
557 bool
558 simplify_using_ranges::simplify_truth_ops_using_ranges
559 (gimple_stmt_iterator *gsi,
560 gimple *stmt)
562 enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
563 tree lhs, op0, op1;
564 bool need_conversion;
566 /* We handle only !=/== case here. */
567 gcc_assert (rhs_code == EQ_EXPR || rhs_code == NE_EXPR);
569 op0 = gimple_assign_rhs1 (stmt);
570 if (!op_with_boolean_value_range_p (op0, stmt))
571 return false;
573 op1 = gimple_assign_rhs2 (stmt);
574 if (!op_with_boolean_value_range_p (op1, stmt))
575 return false;
577 /* Reduce number of cases to handle to NE_EXPR. As there is no
578 BIT_XNOR_EXPR we cannot replace A == B with a single statement. */
579 if (rhs_code == EQ_EXPR)
581 if (TREE_CODE (op1) == INTEGER_CST)
582 op1 = int_const_binop (BIT_XOR_EXPR, op1,
583 build_int_cst (TREE_TYPE (op1), 1));
584 else
585 return false;
588 lhs = gimple_assign_lhs (stmt);
589 need_conversion
590 = !useless_type_conversion_p (TREE_TYPE (lhs), TREE_TYPE (op0));
592 /* Make sure to not sign-extend a 1-bit 1 when converting the result. */
593 if (need_conversion
594 && !TYPE_UNSIGNED (TREE_TYPE (op0))
595 && TYPE_PRECISION (TREE_TYPE (op0)) == 1
596 && TYPE_PRECISION (TREE_TYPE (lhs)) > 1)
597 return false;
599 /* For A != 0 we can substitute A itself. */
600 if (integer_zerop (op1))
601 gimple_assign_set_rhs_with_ops (gsi,
602 need_conversion
603 ? NOP_EXPR : TREE_CODE (op0), op0);
604 /* For A != B we substitute A ^ B. Either with conversion. */
605 else if (need_conversion)
607 tree tem = make_ssa_name (TREE_TYPE (op0));
608 gassign *newop
609 = gimple_build_assign (tem, BIT_XOR_EXPR, op0, op1);
610 gsi_insert_before (gsi, newop, GSI_SAME_STMT);
611 if (INTEGRAL_TYPE_P (TREE_TYPE (tem))
612 && TYPE_PRECISION (TREE_TYPE (tem)) > 1)
614 value_range vr (TREE_TYPE (tem),
615 wi::zero (TYPE_PRECISION (TREE_TYPE (tem))),
616 wi::one (TYPE_PRECISION (TREE_TYPE (tem))));
617 set_range_info (tem, vr);
619 gimple_assign_set_rhs_with_ops (gsi, NOP_EXPR, tem);
621 /* Or without. */
622 else
623 gimple_assign_set_rhs_with_ops (gsi, BIT_XOR_EXPR, op0, op1);
624 update_stmt (gsi_stmt (*gsi));
625 fold_stmt (gsi, follow_single_use_edges);
627 return true;
630 /* Simplify a division or modulo operator to a right shift or bitwise and
631 if the first operand is unsigned or is greater than zero and the second
632 operand is an exact power of two. For TRUNC_MOD_EXPR op0 % op1 with
633 constant op1 (op1min = op1) or with op1 in [op1min, op1max] range,
634 optimize it into just op0 if op0's range is known to be a subset of
635 [-op1min + 1, op1min - 1] for signed and [0, op1min - 1] for unsigned
636 modulo. */
638 bool
639 simplify_using_ranges::simplify_div_or_mod_using_ranges
640 (gimple_stmt_iterator *gsi,
641 gimple *stmt)
643 enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
644 tree val = NULL;
645 tree op0 = gimple_assign_rhs1 (stmt);
646 tree op1 = gimple_assign_rhs2 (stmt);
647 tree op0min = NULL_TREE, op0max = NULL_TREE;
648 tree op1min = op1;
649 value_range vr;
651 if (TREE_CODE (op0) == INTEGER_CST)
653 op0min = op0;
654 op0max = op0;
656 else
658 if (!query->range_of_expr (vr, op0, stmt))
659 vr.set_varying (TREE_TYPE (op0));
660 if (!vr.varying_p () && !vr.undefined_p ())
662 tree type = vr.type ();
663 op0min = wide_int_to_tree (type, vr.lower_bound ());
664 op0max = wide_int_to_tree (type, vr.upper_bound ());
668 if (rhs_code == TRUNC_MOD_EXPR
669 && TREE_CODE (op1) == SSA_NAME)
671 value_range vr1;
672 if (!query->range_of_expr (vr1, op1, stmt))
673 vr1.set_varying (TREE_TYPE (op1));
674 if (!vr1.varying_p () && !vr1.undefined_p ())
675 op1min = wide_int_to_tree (vr1.type (), vr1.lower_bound ());
677 if (rhs_code == TRUNC_MOD_EXPR
678 && TREE_CODE (op1min) == INTEGER_CST
679 && tree_int_cst_sgn (op1min) == 1
680 && op0max
681 && tree_int_cst_lt (op0max, op1min))
683 if (TYPE_UNSIGNED (TREE_TYPE (op0))
684 || tree_int_cst_sgn (op0min) >= 0
685 || tree_int_cst_lt (fold_unary (NEGATE_EXPR, TREE_TYPE (op1min), op1min),
686 op0min))
688 /* If op0 already has the range op0 % op1 has,
689 then TRUNC_MOD_EXPR won't change anything. */
690 gimple_assign_set_rhs_from_tree (gsi, op0);
691 return true;
695 if (TREE_CODE (op0) != SSA_NAME)
696 return false;
698 if (!integer_pow2p (op1))
700 /* X % -Y can be only optimized into X % Y either if
701 X is not INT_MIN, or Y is not -1. Fold it now, as after
702 remove_range_assertions the range info might be not available
703 anymore. */
704 if (rhs_code == TRUNC_MOD_EXPR
705 && fold_stmt (gsi, follow_single_use_edges))
706 return true;
707 return false;
710 if (TYPE_UNSIGNED (TREE_TYPE (op0)))
711 val = integer_one_node;
712 else
714 tree zero = build_zero_cst (TREE_TYPE (op0));
715 val = fold_cond_with_ops (GE_EXPR, op0, zero, stmt);
718 if (val && integer_onep (val))
720 tree t;
722 if (rhs_code == TRUNC_DIV_EXPR)
724 t = build_int_cst (integer_type_node, tree_log2 (op1));
725 gimple_assign_set_rhs_code (stmt, RSHIFT_EXPR);
726 gimple_assign_set_rhs1 (stmt, op0);
727 gimple_assign_set_rhs2 (stmt, t);
729 else
731 t = build_int_cst (TREE_TYPE (op1), 1);
732 t = int_const_binop (MINUS_EXPR, op1, t);
733 t = fold_convert (TREE_TYPE (op0), t);
735 gimple_assign_set_rhs_code (stmt, BIT_AND_EXPR);
736 gimple_assign_set_rhs1 (stmt, op0);
737 gimple_assign_set_rhs2 (stmt, t);
740 update_stmt (stmt);
741 fold_stmt (gsi, follow_single_use_edges);
742 return true;
745 return false;
748 /* Simplify a min or max if the ranges of the two operands are
749 disjoint. Return true if we do simplify. */
751 bool
752 simplify_using_ranges::simplify_min_or_max_using_ranges
753 (gimple_stmt_iterator *gsi,
754 gimple *stmt)
756 tree op0 = gimple_assign_rhs1 (stmt);
757 tree op1 = gimple_assign_rhs2 (stmt);
758 tree val;
760 val = fold_cond_with_ops (LE_EXPR, op0, op1, stmt);
761 if (!val)
762 val = fold_cond_with_ops (LT_EXPR, op0, op1, stmt);
764 if (val)
766 /* VAL == TRUE -> OP0 < or <= op1
767 VAL == FALSE -> OP0 > or >= op1. */
768 tree res = ((gimple_assign_rhs_code (stmt) == MAX_EXPR)
769 == integer_zerop (val)) ? op0 : op1;
770 gimple_assign_set_rhs_from_tree (gsi, res);
771 return true;
774 return false;
777 /* If the operand to an ABS_EXPR is >= 0, then eliminate the
778 ABS_EXPR. If the operand is <= 0, then simplify the
779 ABS_EXPR into a NEGATE_EXPR. */
781 bool
782 simplify_using_ranges::simplify_abs_using_ranges (gimple_stmt_iterator *gsi,
783 gimple *stmt)
785 tree op = gimple_assign_rhs1 (stmt);
786 tree zero = build_zero_cst (TREE_TYPE (op));
787 tree val = fold_cond_with_ops (LE_EXPR, op, zero, stmt);
789 if (!val)
791 /* The range is neither <= 0 nor > 0. Now see if it is
792 either < 0 or >= 0. */
793 val = fold_cond_with_ops (LT_EXPR, op, zero, stmt);
795 if (val)
797 gimple_assign_set_rhs1 (stmt, op);
798 if (integer_zerop (val))
799 gimple_assign_set_rhs_code (stmt, SSA_NAME);
800 else
801 gimple_assign_set_rhs_code (stmt, NEGATE_EXPR);
802 update_stmt (stmt);
803 fold_stmt (gsi, follow_single_use_edges);
804 return true;
806 return false;
809 /* value_range wrapper for wi_set_zero_nonzero_bits.
811 Return TRUE if VR was a constant range and we were able to compute
812 the bit masks. */
814 static bool
815 vr_set_zero_nonzero_bits (const tree expr_type,
816 const irange *vr,
817 wide_int *may_be_nonzero,
818 wide_int *must_be_nonzero)
820 if (vr->varying_p () || vr->undefined_p ())
822 *may_be_nonzero = wi::minus_one (TYPE_PRECISION (expr_type));
823 *must_be_nonzero = wi::zero (TYPE_PRECISION (expr_type));
824 return false;
826 wi_set_zero_nonzero_bits (expr_type, vr->lower_bound (), vr->upper_bound (),
827 *may_be_nonzero, *must_be_nonzero);
828 return true;
831 /* Optimize away redundant BIT_AND_EXPR and BIT_IOR_EXPR.
832 If all the bits that are being cleared by & are already
833 known to be zero from VR, or all the bits that are being
834 set by | are already known to be one from VR, the bit
835 operation is redundant. */
837 bool
838 simplify_using_ranges::simplify_bit_ops_using_ranges
839 (gimple_stmt_iterator *gsi,
840 gimple *stmt)
842 tree op0 = gimple_assign_rhs1 (stmt);
843 tree op1 = gimple_assign_rhs2 (stmt);
844 tree op = NULL_TREE;
845 value_range vr0, vr1;
846 wide_int may_be_nonzero0, may_be_nonzero1;
847 wide_int must_be_nonzero0, must_be_nonzero1;
848 wide_int mask;
850 if (!query->range_of_expr (vr0, op0, stmt)
851 || vr0.undefined_p ())
852 return false;
853 if (!query->range_of_expr (vr1, op1, stmt)
854 || vr1.undefined_p ())
855 return false;
857 if (!vr_set_zero_nonzero_bits (TREE_TYPE (op0), &vr0, &may_be_nonzero0,
858 &must_be_nonzero0))
859 return false;
860 if (!vr_set_zero_nonzero_bits (TREE_TYPE (op1), &vr1, &may_be_nonzero1,
861 &must_be_nonzero1))
862 return false;
864 switch (gimple_assign_rhs_code (stmt))
866 case BIT_AND_EXPR:
867 mask = wi::bit_and_not (may_be_nonzero0, must_be_nonzero1);
868 if (mask == 0)
870 op = op0;
871 break;
873 mask = wi::bit_and_not (may_be_nonzero1, must_be_nonzero0);
874 if (mask == 0)
876 op = op1;
877 break;
879 break;
880 case BIT_IOR_EXPR:
881 mask = wi::bit_and_not (may_be_nonzero0, must_be_nonzero1);
882 if (mask == 0)
884 op = op1;
885 break;
887 mask = wi::bit_and_not (may_be_nonzero1, must_be_nonzero0);
888 if (mask == 0)
890 op = op0;
891 break;
893 break;
894 default:
895 gcc_unreachable ();
898 if (op == NULL_TREE)
899 return false;
901 gimple_assign_set_rhs_with_ops (gsi, TREE_CODE (op), op);
902 update_stmt (gsi_stmt (*gsi));
903 return true;
906 /* We are comparing trees OP0 and OP1 using COND_CODE. OP0 has
907 a known value range VR.
909 If there is one and only one value which will satisfy the
910 conditional, then return that value. Else return NULL.
912 If signed overflow must be undefined for the value to satisfy
913 the conditional, then set *STRICT_OVERFLOW_P to true. */
915 static tree
916 test_for_singularity (enum tree_code cond_code, tree op0,
917 tree op1, const value_range *vr)
919 tree min = NULL;
920 tree max = NULL;
922 /* Extract minimum/maximum values which satisfy the conditional as it was
923 written. */
924 if (cond_code == LE_EXPR || cond_code == LT_EXPR)
926 min = TYPE_MIN_VALUE (TREE_TYPE (op0));
928 max = op1;
929 if (cond_code == LT_EXPR)
931 tree one = build_int_cst (TREE_TYPE (op0), 1);
932 max = fold_build2 (MINUS_EXPR, TREE_TYPE (op0), max, one);
933 /* Signal to compare_values_warnv this expr doesn't overflow. */
934 if (EXPR_P (max))
935 suppress_warning (max, OPT_Woverflow);
938 else if (cond_code == GE_EXPR || cond_code == GT_EXPR)
940 max = TYPE_MAX_VALUE (TREE_TYPE (op0));
942 min = op1;
943 if (cond_code == GT_EXPR)
945 tree one = build_int_cst (TREE_TYPE (op0), 1);
946 min = fold_build2 (PLUS_EXPR, TREE_TYPE (op0), min, one);
947 /* Signal to compare_values_warnv this expr doesn't overflow. */
948 if (EXPR_P (min))
949 suppress_warning (min, OPT_Woverflow);
953 /* Now refine the minimum and maximum values using any
954 value range information we have for op0. */
955 if (min && max)
957 tree type = TREE_TYPE (op0);
958 tree tmin = wide_int_to_tree (type, vr->lower_bound ());
959 tree tmax = wide_int_to_tree (type, vr->upper_bound ());
960 if (compare_values (tmin, min) == 1)
961 min = tmin;
962 if (compare_values (tmax, max) == -1)
963 max = tmax;
965 /* If the new min/max values have converged to a single value,
966 then there is only one value which can satisfy the condition,
967 return that value. */
968 if (operand_equal_p (min, max, 0) && is_gimple_min_invariant (min))
969 return min;
971 return NULL;
974 /* Return whether the value range *VR fits in an integer type specified
975 by PRECISION and UNSIGNED_P. */
977 bool
978 range_fits_type_p (const irange *vr,
979 unsigned dest_precision, signop dest_sgn)
981 tree src_type;
982 unsigned src_precision;
983 widest_int tem;
984 signop src_sgn;
986 /* We can only handle integral and pointer types. */
987 src_type = vr->type ();
988 if (!INTEGRAL_TYPE_P (src_type)
989 && !POINTER_TYPE_P (src_type))
990 return false;
992 /* An extension is fine unless VR is SIGNED and dest_sgn is UNSIGNED,
993 and so is an identity transform. */
994 src_precision = TYPE_PRECISION (vr->type ());
995 src_sgn = TYPE_SIGN (src_type);
996 if ((src_precision < dest_precision
997 && !(dest_sgn == UNSIGNED && src_sgn == SIGNED))
998 || (src_precision == dest_precision && src_sgn == dest_sgn))
999 return true;
1001 /* Now we can only handle ranges with constant bounds. */
1002 if (vr->undefined_p () || vr->varying_p ())
1003 return false;
1005 wide_int vrmin = vr->lower_bound ();
1006 wide_int vrmax = vr->upper_bound ();
1008 /* For sign changes, the MSB of the wide_int has to be clear.
1009 An unsigned value with its MSB set cannot be represented by
1010 a signed wide_int, while a negative value cannot be represented
1011 by an unsigned wide_int. */
1012 if (src_sgn != dest_sgn
1013 && (wi::lts_p (vrmin, 0) || wi::lts_p (vrmax, 0)))
1014 return false;
1016 /* Then we can perform the conversion on both ends and compare
1017 the result for equality. */
1018 signop sign = TYPE_SIGN (vr->type ());
1019 tem = wi::ext (widest_int::from (vrmin, sign), dest_precision, dest_sgn);
1020 if (tem != widest_int::from (vrmin, sign))
1021 return false;
1022 tem = wi::ext (widest_int::from (vrmax, sign), dest_precision, dest_sgn);
1023 if (tem != widest_int::from (vrmax, sign))
1024 return false;
1026 return true;
1029 // Clear edge E of EDGE_EXECUTABLE (it is unexecutable). If it wasn't
1030 // previously clear, propagate to successor blocks if appropriate.
1032 void
1033 simplify_using_ranges::set_and_propagate_unexecutable (edge e)
1035 // If not_executable is already set, we're done.
1036 // This works in the absence of a flag as well.
1037 if ((e->flags & m_not_executable_flag) == m_not_executable_flag)
1038 return;
1040 e->flags |= m_not_executable_flag;
1041 m_flag_set_edges.safe_push (e);
1043 // Check if the destination block needs to propagate the property.
1044 basic_block bb = e->dest;
1046 // If any incoming edge is executable, we are done.
1047 edge_iterator ei;
1048 FOR_EACH_EDGE (e, ei, bb->preds)
1049 if ((e->flags & m_not_executable_flag) == 0)
1050 return;
1052 // This block is also unexecutable, propagate to all exit edges as well.
1053 FOR_EACH_EDGE (e, ei, bb->succs)
1054 set_and_propagate_unexecutable (e);
1057 /* If COND can be folded entirely as TRUE or FALSE, rewrite the
1058 conditional as such, and return TRUE. */
1060 bool
1061 simplify_using_ranges::fold_cond (gcond *cond)
1063 int_range_max r;
1064 if (query->range_of_stmt (r, cond) && r.singleton_p ())
1066 // COND has already been folded if arguments are constant.
1067 if (TREE_CODE (gimple_cond_lhs (cond)) != SSA_NAME
1068 && TREE_CODE (gimple_cond_rhs (cond)) != SSA_NAME)
1069 return false;
1070 if (dump_file)
1072 fprintf (dump_file, "Folding predicate ");
1073 print_gimple_expr (dump_file, cond, 0);
1074 fprintf (dump_file, " to ");
1076 edge e0 = EDGE_SUCC (gimple_bb (cond), 0);
1077 edge e1 = EDGE_SUCC (gimple_bb (cond), 1);
1078 if (r.zero_p ())
1080 if (dump_file)
1081 fprintf (dump_file, "0\n");
1082 gimple_cond_make_false (cond);
1083 if (e0->flags & EDGE_TRUE_VALUE)
1084 set_and_propagate_unexecutable (e0);
1085 else
1086 set_and_propagate_unexecutable (e1);
1088 else
1090 if (dump_file)
1091 fprintf (dump_file, "1\n");
1092 gimple_cond_make_true (cond);
1093 if (e0->flags & EDGE_FALSE_VALUE)
1094 set_and_propagate_unexecutable (e0);
1095 else
1096 set_and_propagate_unexecutable (e1);
1098 update_stmt (cond);
1099 return true;
1102 // FIXME: Audit the code below and make sure it never finds anything.
1103 edge taken_edge;
1104 legacy_fold_cond (cond, &taken_edge);
1106 if (taken_edge)
1108 if (taken_edge->flags & EDGE_TRUE_VALUE)
1110 if (dump_file && (dump_flags & TDF_DETAILS))
1111 fprintf (dump_file, "\nVRP Predicate evaluates to: 1\n");
1112 gimple_cond_make_true (cond);
1114 else if (taken_edge->flags & EDGE_FALSE_VALUE)
1116 if (dump_file && (dump_flags & TDF_DETAILS))
1117 fprintf (dump_file, "\nVRP Predicate evaluates to: 0\n");
1118 gimple_cond_make_false (cond);
1120 else
1121 gcc_unreachable ();
1122 update_stmt (cond);
1123 return true;
1125 return false;
1128 /* Simplify a conditional using a relational operator to an equality
1129 test if the range information indicates only one value can satisfy
1130 the original conditional. */
1132 bool
1133 simplify_using_ranges::simplify_cond_using_ranges_1 (gcond *stmt)
1135 tree op0 = gimple_cond_lhs (stmt);
1136 tree op1 = gimple_cond_rhs (stmt);
1137 enum tree_code cond_code = gimple_cond_code (stmt);
1139 if (fold_cond (stmt))
1140 return true;
1142 if (cond_code != NE_EXPR
1143 && cond_code != EQ_EXPR
1144 && TREE_CODE (op0) == SSA_NAME
1145 && INTEGRAL_TYPE_P (TREE_TYPE (op0))
1146 && is_gimple_min_invariant (op1))
1148 value_range vr;
1150 if (!query->range_of_expr (vr, op0, stmt))
1151 vr.set_undefined ();
1153 /* If we have range information for OP0, then we might be
1154 able to simplify this conditional. */
1155 if (!vr.undefined_p () && !vr.varying_p ())
1157 tree new_tree = test_for_singularity (cond_code, op0, op1, &vr);
1158 if (new_tree)
1160 if (dump_file)
1162 fprintf (dump_file, "Simplified relational ");
1163 print_gimple_stmt (dump_file, stmt, 0);
1164 fprintf (dump_file, " into ");
1167 gimple_cond_set_code (stmt, EQ_EXPR);
1168 gimple_cond_set_lhs (stmt, op0);
1169 gimple_cond_set_rhs (stmt, new_tree);
1171 update_stmt (stmt);
1173 if (dump_file)
1175 print_gimple_stmt (dump_file, stmt, 0);
1176 fprintf (dump_file, "\n");
1179 return true;
1182 /* Try again after inverting the condition. We only deal
1183 with integral types here, so no need to worry about
1184 issues with inverting FP comparisons. */
1185 new_tree = test_for_singularity
1186 (invert_tree_comparison (cond_code, false),
1187 op0, op1, &vr);
1188 if (new_tree)
1190 if (dump_file)
1192 fprintf (dump_file, "Simplified relational ");
1193 print_gimple_stmt (dump_file, stmt, 0);
1194 fprintf (dump_file, " into ");
1197 gimple_cond_set_code (stmt, NE_EXPR);
1198 gimple_cond_set_lhs (stmt, op0);
1199 gimple_cond_set_rhs (stmt, new_tree);
1201 update_stmt (stmt);
1203 if (dump_file)
1205 print_gimple_stmt (dump_file, stmt, 0);
1206 fprintf (dump_file, "\n");
1209 return true;
1213 // Try to simplify casted conditions.
1214 return simplify_casted_cond (stmt);
1217 /* STMT is a conditional at the end of a basic block.
1219 If the conditional is of the form SSA_NAME op constant and the SSA_NAME
1220 was set via a type conversion, try to replace the SSA_NAME with the RHS
1221 of the type conversion. Doing so makes the conversion dead which helps
1222 subsequent passes. */
1224 bool
1225 simplify_using_ranges::simplify_casted_cond (gcond *stmt)
1227 tree op0 = gimple_cond_lhs (stmt);
1228 tree op1 = gimple_cond_rhs (stmt);
1230 /* If we have a comparison of an SSA_NAME (OP0) against a constant,
1231 see if OP0 was set by a type conversion where the source of
1232 the conversion is another SSA_NAME with a range that fits
1233 into the range of OP0's type.
1235 If so, the conversion is redundant as the earlier SSA_NAME can be
1236 used for the comparison directly if we just massage the constant in the
1237 comparison. */
1238 if (TREE_CODE (op0) == SSA_NAME
1239 && TREE_CODE (op1) == INTEGER_CST)
1241 gimple *def_stmt = SSA_NAME_DEF_STMT (op0);
1242 tree innerop;
1244 if (!is_gimple_assign (def_stmt))
1245 return false;
1247 switch (gimple_assign_rhs_code (def_stmt))
1249 CASE_CONVERT:
1250 innerop = gimple_assign_rhs1 (def_stmt);
1251 break;
1252 case VIEW_CONVERT_EXPR:
1253 innerop = TREE_OPERAND (gimple_assign_rhs1 (def_stmt), 0);
1254 if (!INTEGRAL_TYPE_P (TREE_TYPE (innerop)))
1255 return false;
1256 break;
1257 default:
1258 return false;
1261 if (TREE_CODE (innerop) == SSA_NAME
1262 && !POINTER_TYPE_P (TREE_TYPE (innerop))
1263 && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (innerop)
1264 && desired_pro_or_demotion_p (TREE_TYPE (innerop), TREE_TYPE (op0)))
1266 value_range vr;
1268 if (query->range_of_expr (vr, innerop)
1269 && !vr.varying_p ()
1270 && !vr.undefined_p ()
1271 && range_fits_type_p (&vr,
1272 TYPE_PRECISION (TREE_TYPE (op0)),
1273 TYPE_SIGN (TREE_TYPE (op0)))
1274 && int_fits_type_p (op1, TREE_TYPE (innerop)))
1276 tree newconst = fold_convert (TREE_TYPE (innerop), op1);
1277 gimple_cond_set_lhs (stmt, innerop);
1278 gimple_cond_set_rhs (stmt, newconst);
1279 update_stmt (stmt);
1280 return true;
1284 return false;
1287 /* Simplify a switch statement using the value range of the switch
1288 argument. */
1290 bool
1291 simplify_using_ranges::simplify_switch_using_ranges (gswitch *stmt)
1293 tree op = gimple_switch_index (stmt);
1294 value_range vr;
1295 bool take_default;
1296 edge e;
1297 edge_iterator ei;
1298 size_t i = 0, j = 0, n, n2;
1299 tree vec2;
1300 switch_update su;
1301 size_t k = 1, l = 0;
1303 if (TREE_CODE (op) == SSA_NAME)
1305 if (!query->range_of_expr (vr, op, stmt)
1306 || vr.varying_p () || vr.undefined_p ())
1307 return false;
1309 /* Find case label for min/max of the value range. */
1310 take_default = !find_case_label_ranges (stmt, &vr, &i, &j, &k, &l);
1312 else if (TREE_CODE (op) == INTEGER_CST)
1314 take_default = !find_case_label_index (stmt, 1, op, &i);
1315 if (take_default)
1317 i = 1;
1318 j = 0;
1320 else
1322 j = i;
1325 else
1326 return false;
1328 n = gimple_switch_num_labels (stmt);
1330 /* We can truncate the case label ranges that partially overlap with OP's
1331 value range. */
1332 size_t min_idx = 1, max_idx = 0;
1333 tree min, max;
1334 value_range_kind kind = get_legacy_range (vr, min, max);
1335 if (!vr.undefined_p ())
1336 find_case_label_range (stmt, min, max, &min_idx, &max_idx);
1337 if (min_idx <= max_idx)
1339 tree min_label = gimple_switch_label (stmt, min_idx);
1340 tree max_label = gimple_switch_label (stmt, max_idx);
1342 /* Avoid changing the type of the case labels when truncating. */
1343 tree case_label_type = TREE_TYPE (CASE_LOW (min_label));
1344 tree vr_min = fold_convert (case_label_type, min);
1345 tree vr_max = fold_convert (case_label_type, max);
1347 if (kind == VR_RANGE)
1349 /* If OP's value range is [2,8] and the low label range is
1350 0 ... 3, truncate the label's range to 2 .. 3. */
1351 if (tree_int_cst_compare (CASE_LOW (min_label), vr_min) < 0
1352 && CASE_HIGH (min_label) != NULL_TREE
1353 && tree_int_cst_compare (CASE_HIGH (min_label), vr_min) >= 0)
1354 CASE_LOW (min_label) = vr_min;
1356 /* If OP's value range is [2,8] and the high label range is
1357 7 ... 10, truncate the label's range to 7 .. 8. */
1358 if (tree_int_cst_compare (CASE_LOW (max_label), vr_max) <= 0
1359 && CASE_HIGH (max_label) != NULL_TREE
1360 && tree_int_cst_compare (CASE_HIGH (max_label), vr_max) > 0)
1361 CASE_HIGH (max_label) = vr_max;
1363 else if (kind == VR_ANTI_RANGE)
1365 tree one_cst = build_one_cst (case_label_type);
1367 if (min_label == max_label)
1369 /* If OP's value range is ~[7,8] and the label's range is
1370 7 ... 10, truncate the label's range to 9 ... 10. */
1371 if (tree_int_cst_compare (CASE_LOW (min_label), vr_min) == 0
1372 && CASE_HIGH (min_label) != NULL_TREE
1373 && tree_int_cst_compare (CASE_HIGH (min_label), vr_max) > 0)
1374 CASE_LOW (min_label)
1375 = int_const_binop (PLUS_EXPR, vr_max, one_cst);
1377 /* If OP's value range is ~[7,8] and the label's range is
1378 5 ... 8, truncate the label's range to 5 ... 6. */
1379 if (tree_int_cst_compare (CASE_LOW (min_label), vr_min) < 0
1380 && CASE_HIGH (min_label) != NULL_TREE
1381 && tree_int_cst_compare (CASE_HIGH (min_label), vr_max) == 0)
1382 CASE_HIGH (min_label)
1383 = int_const_binop (MINUS_EXPR, vr_min, one_cst);
1385 else
1387 /* If OP's value range is ~[2,8] and the low label range is
1388 0 ... 3, truncate the label's range to 0 ... 1. */
1389 if (tree_int_cst_compare (CASE_LOW (min_label), vr_min) < 0
1390 && CASE_HIGH (min_label) != NULL_TREE
1391 && tree_int_cst_compare (CASE_HIGH (min_label), vr_min) >= 0)
1392 CASE_HIGH (min_label)
1393 = int_const_binop (MINUS_EXPR, vr_min, one_cst);
1395 /* If OP's value range is ~[2,8] and the high label range is
1396 7 ... 10, truncate the label's range to 9 ... 10. */
1397 if (tree_int_cst_compare (CASE_LOW (max_label), vr_max) <= 0
1398 && CASE_HIGH (max_label) != NULL_TREE
1399 && tree_int_cst_compare (CASE_HIGH (max_label), vr_max) > 0)
1400 CASE_LOW (max_label)
1401 = int_const_binop (PLUS_EXPR, vr_max, one_cst);
1405 /* Canonicalize singleton case ranges. */
1406 if (tree_int_cst_equal (CASE_LOW (min_label), CASE_HIGH (min_label)))
1407 CASE_HIGH (min_label) = NULL_TREE;
1408 if (tree_int_cst_equal (CASE_LOW (max_label), CASE_HIGH (max_label)))
1409 CASE_HIGH (max_label) = NULL_TREE;
1412 /* We can also eliminate case labels that lie completely outside OP's value
1413 range. */
1415 /* Bail out if this is just all edges taken. */
1416 if (i == 1
1417 && j == n - 1
1418 && take_default)
1419 return false;
1421 /* Build a new vector of taken case labels. */
1422 vec2 = make_tree_vec (j - i + 1 + l - k + 1 + (int)take_default);
1423 n2 = 0;
1425 /* Add the default edge, if necessary. */
1426 if (take_default)
1427 TREE_VEC_ELT (vec2, n2++) = gimple_switch_default_label (stmt);
1429 for (; i <= j; ++i, ++n2)
1430 TREE_VEC_ELT (vec2, n2) = gimple_switch_label (stmt, i);
1432 for (; k <= l; ++k, ++n2)
1433 TREE_VEC_ELT (vec2, n2) = gimple_switch_label (stmt, k);
1435 /* Mark needed edges. */
1436 for (i = 0; i < n2; ++i)
1438 e = find_edge (gimple_bb (stmt),
1439 label_to_block (cfun,
1440 CASE_LABEL (TREE_VEC_ELT (vec2, i))));
1441 e->aux = (void *)-1;
1444 /* Queue not needed edges for later removal. */
1445 FOR_EACH_EDGE (e, ei, gimple_bb (stmt)->succs)
1447 if (e->aux == (void *)-1)
1449 e->aux = NULL;
1450 continue;
1453 if (dump_file && (dump_flags & TDF_DETAILS))
1455 fprintf (dump_file, "removing unreachable case label\n");
1457 to_remove_edges.safe_push (e);
1458 set_and_propagate_unexecutable (e);
1459 e->flags &= ~EDGE_EXECUTABLE;
1460 e->flags |= EDGE_IGNORE;
1463 /* And queue an update for the stmt. */
1464 su.stmt = stmt;
1465 su.vec = vec2;
1466 to_update_switch_stmts.safe_push (su);
1467 return true;
1470 void
1471 simplify_using_ranges::cleanup_edges_and_switches (void)
1473 int i;
1474 edge e;
1475 switch_update *su;
1477 /* Clear any edges marked as not executable. */
1478 if (m_not_executable_flag)
1480 FOR_EACH_VEC_ELT (m_flag_set_edges, i, e)
1481 e->flags &= ~m_not_executable_flag;
1483 /* Remove dead edges from SWITCH_EXPR optimization. This leaves the
1484 CFG in a broken state and requires a cfg_cleanup run. */
1485 FOR_EACH_VEC_ELT (to_remove_edges, i, e)
1486 remove_edge (e);
1488 /* Update SWITCH_EXPR case label vector. */
1489 FOR_EACH_VEC_ELT (to_update_switch_stmts, i, su)
1491 size_t j;
1492 size_t n = TREE_VEC_LENGTH (su->vec);
1493 tree label;
1494 gimple_switch_set_num_labels (su->stmt, n);
1495 for (j = 0; j < n; j++)
1496 gimple_switch_set_label (su->stmt, j, TREE_VEC_ELT (su->vec, j));
1497 /* As we may have replaced the default label with a regular one
1498 make sure to make it a real default label again. This ensures
1499 optimal expansion. */
1500 label = gimple_switch_label (su->stmt, 0);
1501 CASE_LOW (label) = NULL_TREE;
1502 CASE_HIGH (label) = NULL_TREE;
1505 if (!to_remove_edges.is_empty ())
1507 free_dominance_info (CDI_DOMINATORS);
1508 loops_state_set (LOOPS_NEED_FIXUP);
1511 to_remove_edges.release ();
1512 to_update_switch_stmts.release ();
1515 /* Simplify an integral conversion from an SSA name in STMT. */
1517 static bool
1518 simplify_conversion_using_ranges (gimple_stmt_iterator *gsi, gimple *stmt)
1520 tree innerop, middleop, finaltype;
1521 gimple *def_stmt;
1522 signop inner_sgn, middle_sgn, final_sgn;
1523 unsigned inner_prec, middle_prec, final_prec;
1524 widest_int innermin, innermed, innermax, middlemin, middlemed, middlemax;
1526 finaltype = TREE_TYPE (gimple_assign_lhs (stmt));
1527 if (!INTEGRAL_TYPE_P (finaltype))
1528 return false;
1529 middleop = gimple_assign_rhs1 (stmt);
1530 def_stmt = SSA_NAME_DEF_STMT (middleop);
1531 if (!is_gimple_assign (def_stmt)
1532 || !CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (def_stmt)))
1533 return false;
1534 innerop = gimple_assign_rhs1 (def_stmt);
1535 if (TREE_CODE (innerop) != SSA_NAME
1536 || SSA_NAME_OCCURS_IN_ABNORMAL_PHI (innerop))
1537 return false;
1539 /* Get the value-range of the inner operand. Use global ranges in
1540 case innerop was created during substitute-and-fold. */
1541 wide_int imin, imax;
1542 value_range vr;
1543 if (!INTEGRAL_TYPE_P (TREE_TYPE (innerop)))
1544 return false;
1545 get_range_query (cfun)->range_of_expr (vr, innerop, stmt);
1546 if (vr.undefined_p () || vr.varying_p ())
1547 return false;
1548 innermin = widest_int::from (vr.lower_bound (), TYPE_SIGN (TREE_TYPE (innerop)));
1549 innermax = widest_int::from (vr.upper_bound (), TYPE_SIGN (TREE_TYPE (innerop)));
1551 /* Simulate the conversion chain to check if the result is equal if
1552 the middle conversion is removed. */
1553 inner_prec = TYPE_PRECISION (TREE_TYPE (innerop));
1554 middle_prec = TYPE_PRECISION (TREE_TYPE (middleop));
1555 final_prec = TYPE_PRECISION (finaltype);
1557 /* If the first conversion is not injective, the second must not
1558 be widening. */
1559 if (wi::gtu_p (innermax - innermin,
1560 wi::mask <widest_int> (middle_prec, false))
1561 && middle_prec < final_prec)
1562 return false;
1563 /* We also want a medium value so that we can track the effect that
1564 narrowing conversions with sign change have. */
1565 inner_sgn = TYPE_SIGN (TREE_TYPE (innerop));
1566 if (inner_sgn == UNSIGNED)
1567 innermed = wi::shifted_mask <widest_int> (1, inner_prec - 1, false);
1568 else
1569 innermed = 0;
1570 if (wi::cmp (innermin, innermed, inner_sgn) >= 0
1571 || wi::cmp (innermed, innermax, inner_sgn) >= 0)
1572 innermed = innermin;
1574 middle_sgn = TYPE_SIGN (TREE_TYPE (middleop));
1575 middlemin = wi::ext (innermin, middle_prec, middle_sgn);
1576 middlemed = wi::ext (innermed, middle_prec, middle_sgn);
1577 middlemax = wi::ext (innermax, middle_prec, middle_sgn);
1579 /* Require that the final conversion applied to both the original
1580 and the intermediate range produces the same result. */
1581 final_sgn = TYPE_SIGN (finaltype);
1582 if (wi::ext (middlemin, final_prec, final_sgn)
1583 != wi::ext (innermin, final_prec, final_sgn)
1584 || wi::ext (middlemed, final_prec, final_sgn)
1585 != wi::ext (innermed, final_prec, final_sgn)
1586 || wi::ext (middlemax, final_prec, final_sgn)
1587 != wi::ext (innermax, final_prec, final_sgn))
1588 return false;
1590 gimple_assign_set_rhs1 (stmt, innerop);
1591 fold_stmt (gsi, follow_single_use_edges);
1592 return true;
1595 /* Simplify a conversion from integral SSA name to float in STMT. */
1597 bool
1598 simplify_using_ranges::simplify_float_conversion_using_ranges
1599 (gimple_stmt_iterator *gsi,
1600 gimple *stmt)
1602 tree rhs1 = gimple_assign_rhs1 (stmt);
1603 value_range vr;
1604 scalar_float_mode fltmode
1605 = SCALAR_FLOAT_TYPE_MODE (TREE_TYPE (gimple_assign_lhs (stmt)));
1606 scalar_int_mode mode;
1607 tree tem;
1608 gassign *conv;
1610 /* We can only handle constant ranges. */
1611 if (!query->range_of_expr (vr, rhs1, stmt)
1612 || vr.varying_p ()
1613 || vr.undefined_p ())
1614 return false;
1616 /* First check if we can use a signed type in place of an unsigned. */
1617 scalar_int_mode rhs_mode = SCALAR_INT_TYPE_MODE (TREE_TYPE (rhs1));
1618 if (TYPE_UNSIGNED (TREE_TYPE (rhs1))
1619 && can_float_p (fltmode, rhs_mode, 0) != CODE_FOR_nothing
1620 && range_fits_type_p (&vr, TYPE_PRECISION (TREE_TYPE (rhs1)), SIGNED))
1621 mode = rhs_mode;
1622 /* If we can do the conversion in the current input mode do nothing. */
1623 else if (can_float_p (fltmode, rhs_mode,
1624 TYPE_UNSIGNED (TREE_TYPE (rhs1))) != CODE_FOR_nothing)
1625 return false;
1626 /* Otherwise search for a mode we can use, starting from the narrowest
1627 integer mode available. */
1628 else
1630 mode = NARROWEST_INT_MODE;
1631 for (;;)
1633 /* If we cannot do a signed conversion to float from mode
1634 or if the value-range does not fit in the signed type
1635 try with a wider mode. */
1636 if (can_float_p (fltmode, mode, 0) != CODE_FOR_nothing
1637 && range_fits_type_p (&vr, GET_MODE_PRECISION (mode), SIGNED))
1638 break;
1640 /* But do not widen the input. Instead leave that to the
1641 optabs expansion code. */
1642 if (!GET_MODE_WIDER_MODE (mode).exists (&mode)
1643 || GET_MODE_PRECISION (mode) > TYPE_PRECISION (TREE_TYPE (rhs1)))
1644 return false;
1648 /* It works, insert a truncation or sign-change before the
1649 float conversion. */
1650 tem = make_ssa_name (build_nonstandard_integer_type
1651 (GET_MODE_PRECISION (mode), 0));
1652 conv = gimple_build_assign (tem, NOP_EXPR, rhs1);
1653 gsi_insert_before (gsi, conv, GSI_SAME_STMT);
1654 gimple_assign_set_rhs1 (stmt, tem);
1655 fold_stmt (gsi, follow_single_use_edges);
1657 return true;
1660 /* Simplify an internal fn call using ranges if possible. */
1662 bool
1663 simplify_using_ranges::simplify_internal_call_using_ranges
1664 (gimple_stmt_iterator *gsi,
1665 gimple *stmt)
1667 enum tree_code subcode;
1668 bool is_ubsan = false;
1669 bool ovf = false;
1670 switch (gimple_call_internal_fn (stmt))
1672 case IFN_UBSAN_CHECK_ADD:
1673 subcode = PLUS_EXPR;
1674 is_ubsan = true;
1675 break;
1676 case IFN_UBSAN_CHECK_SUB:
1677 subcode = MINUS_EXPR;
1678 is_ubsan = true;
1679 break;
1680 case IFN_UBSAN_CHECK_MUL:
1681 subcode = MULT_EXPR;
1682 is_ubsan = true;
1683 break;
1684 case IFN_ADD_OVERFLOW:
1685 subcode = PLUS_EXPR;
1686 break;
1687 case IFN_SUB_OVERFLOW:
1688 subcode = MINUS_EXPR;
1689 break;
1690 case IFN_MUL_OVERFLOW:
1691 subcode = MULT_EXPR;
1692 break;
1693 default:
1694 return false;
1697 tree op0 = gimple_call_arg (stmt, 0);
1698 tree op1 = gimple_call_arg (stmt, 1);
1699 tree type;
1700 if (is_ubsan)
1702 type = TREE_TYPE (op0);
1703 if (VECTOR_TYPE_P (type))
1704 return false;
1706 else if (gimple_call_lhs (stmt) == NULL_TREE)
1707 return false;
1708 else
1709 type = TREE_TYPE (TREE_TYPE (gimple_call_lhs (stmt)));
1710 if (!check_for_binary_op_overflow (query, subcode, type, op0, op1, &ovf, stmt)
1711 || (is_ubsan && ovf))
1712 return false;
1714 gimple *g;
1715 location_t loc = gimple_location (stmt);
1716 if (is_ubsan)
1717 g = gimple_build_assign (gimple_call_lhs (stmt), subcode, op0, op1);
1718 else
1720 int prec = TYPE_PRECISION (type);
1721 tree utype = type;
1722 if (ovf
1723 || !useless_type_conversion_p (type, TREE_TYPE (op0))
1724 || !useless_type_conversion_p (type, TREE_TYPE (op1)))
1725 utype = build_nonstandard_integer_type (prec, 1);
1726 if (TREE_CODE (op0) == INTEGER_CST)
1727 op0 = fold_convert (utype, op0);
1728 else if (!useless_type_conversion_p (utype, TREE_TYPE (op0)))
1730 g = gimple_build_assign (make_ssa_name (utype), NOP_EXPR, op0);
1731 gimple_set_location (g, loc);
1732 gsi_insert_before (gsi, g, GSI_SAME_STMT);
1733 op0 = gimple_assign_lhs (g);
1735 if (TREE_CODE (op1) == INTEGER_CST)
1736 op1 = fold_convert (utype, op1);
1737 else if (!useless_type_conversion_p (utype, TREE_TYPE (op1)))
1739 g = gimple_build_assign (make_ssa_name (utype), NOP_EXPR, op1);
1740 gimple_set_location (g, loc);
1741 gsi_insert_before (gsi, g, GSI_SAME_STMT);
1742 op1 = gimple_assign_lhs (g);
1744 g = gimple_build_assign (make_ssa_name (utype), subcode, op0, op1);
1745 gimple_set_location (g, loc);
1746 gsi_insert_before (gsi, g, GSI_SAME_STMT);
1747 if (utype != type)
1749 g = gimple_build_assign (make_ssa_name (type), NOP_EXPR,
1750 gimple_assign_lhs (g));
1751 gimple_set_location (g, loc);
1752 gsi_insert_before (gsi, g, GSI_SAME_STMT);
1754 g = gimple_build_assign (gimple_call_lhs (stmt), COMPLEX_EXPR,
1755 gimple_assign_lhs (g),
1756 build_int_cst (type, ovf));
1758 gimple_set_location (g, loc);
1759 gsi_replace (gsi, g, false);
1760 return true;
1763 /* Return true if VAR is a two-valued variable. Set a and b with the
1764 two-values when it is true. Return false otherwise. */
1766 bool
1767 simplify_using_ranges::two_valued_val_range_p (tree var, tree *a, tree *b,
1768 gimple *s)
1770 value_range vr;
1771 if (!query->range_of_expr (vr, var, s))
1772 return false;
1773 if (vr.varying_p () || vr.undefined_p ())
1774 return false;
1776 if ((vr.num_pairs () == 1 && vr.upper_bound () - vr.lower_bound () == 1)
1777 || (vr.num_pairs () == 2
1778 && vr.lower_bound (0) == vr.upper_bound (0)
1779 && vr.lower_bound (1) == vr.upper_bound (1)))
1781 *a = wide_int_to_tree (TREE_TYPE (var), vr.lower_bound ());
1782 *b = wide_int_to_tree (TREE_TYPE (var), vr.upper_bound ());
1783 return true;
1785 return false;
1788 simplify_using_ranges::simplify_using_ranges (range_query *query,
1789 int not_executable_flag)
1790 : query (query)
1792 to_remove_edges = vNULL;
1793 to_update_switch_stmts = vNULL;
1794 m_not_executable_flag = not_executable_flag;
1795 m_flag_set_edges = vNULL;
1798 simplify_using_ranges::~simplify_using_ranges ()
1800 cleanup_edges_and_switches ();
1801 m_flag_set_edges.release ();
1804 /* Simplify STMT using ranges if possible. */
1806 bool
1807 simplify_using_ranges::simplify (gimple_stmt_iterator *gsi)
1809 gcc_checking_assert (query);
1811 gimple *stmt = gsi_stmt (*gsi);
1812 if (is_gimple_assign (stmt))
1814 enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
1815 tree rhs1 = gimple_assign_rhs1 (stmt);
1816 tree rhs2 = gimple_assign_rhs2 (stmt);
1817 tree lhs = gimple_assign_lhs (stmt);
1818 tree val1 = NULL_TREE, val2 = NULL_TREE;
1819 use_operand_p use_p;
1820 gimple *use_stmt;
1822 /* Convert:
1823 LHS = CST BINOP VAR
1824 Where VAR is two-valued and LHS is used in GIMPLE_COND only
1826 LHS = VAR == VAL1 ? (CST BINOP VAL1) : (CST BINOP VAL2)
1828 Also handles:
1829 LHS = VAR BINOP CST
1830 Where VAR is two-valued and LHS is used in GIMPLE_COND only
1832 LHS = VAR == VAL1 ? (VAL1 BINOP CST) : (VAL2 BINOP CST) */
1834 if (TREE_CODE_CLASS (rhs_code) == tcc_binary
1835 && INTEGRAL_TYPE_P (TREE_TYPE (rhs1))
1836 && ((TREE_CODE (rhs1) == INTEGER_CST
1837 && TREE_CODE (rhs2) == SSA_NAME)
1838 || (TREE_CODE (rhs2) == INTEGER_CST
1839 && TREE_CODE (rhs1) == SSA_NAME))
1840 && single_imm_use (lhs, &use_p, &use_stmt)
1841 && gimple_code (use_stmt) == GIMPLE_COND)
1844 tree new_rhs1 = NULL_TREE;
1845 tree new_rhs2 = NULL_TREE;
1846 tree cmp_var = NULL_TREE;
1848 if (TREE_CODE (rhs2) == SSA_NAME
1849 && two_valued_val_range_p (rhs2, &val1, &val2, stmt))
1851 /* Optimize RHS1 OP [VAL1, VAL2]. */
1852 new_rhs1 = int_const_binop (rhs_code, rhs1, val1);
1853 new_rhs2 = int_const_binop (rhs_code, rhs1, val2);
1854 cmp_var = rhs2;
1856 else if (TREE_CODE (rhs1) == SSA_NAME
1857 && two_valued_val_range_p (rhs1, &val1, &val2, stmt))
1859 /* Optimize [VAL1, VAL2] OP RHS2. */
1860 new_rhs1 = int_const_binop (rhs_code, val1, rhs2);
1861 new_rhs2 = int_const_binop (rhs_code, val2, rhs2);
1862 cmp_var = rhs1;
1865 /* If we could not find two-vals or the optimzation is invalid as
1866 in divide by zero, new_rhs1 / new_rhs will be NULL_TREE. */
1867 if (new_rhs1 && new_rhs2)
1869 tree cond = gimple_build (gsi, true, GSI_SAME_STMT,
1870 UNKNOWN_LOCATION,
1871 EQ_EXPR, boolean_type_node,
1872 cmp_var, val1);
1873 gimple_assign_set_rhs_with_ops (gsi,
1874 COND_EXPR, cond,
1875 new_rhs1,
1876 new_rhs2);
1877 update_stmt (gsi_stmt (*gsi));
1878 fold_stmt (gsi, follow_single_use_edges);
1879 return true;
1883 switch (rhs_code)
1885 case EQ_EXPR:
1886 case NE_EXPR:
1887 /* Transform EQ_EXPR, NE_EXPR into BIT_XOR_EXPR or identity
1888 if the RHS is zero or one, and the LHS are known to be boolean
1889 values. */
1890 if (INTEGRAL_TYPE_P (TREE_TYPE (rhs1)))
1891 return simplify_truth_ops_using_ranges (gsi, stmt);
1892 break;
1894 /* Transform TRUNC_DIV_EXPR and TRUNC_MOD_EXPR into RSHIFT_EXPR
1895 and BIT_AND_EXPR respectively if the first operand is greater
1896 than zero and the second operand is an exact power of two.
1897 Also optimize TRUNC_MOD_EXPR away if the second operand is
1898 constant and the first operand already has the right value
1899 range. */
1900 case TRUNC_DIV_EXPR:
1901 case TRUNC_MOD_EXPR:
1902 if ((TREE_CODE (rhs1) == SSA_NAME
1903 || TREE_CODE (rhs1) == INTEGER_CST)
1904 && INTEGRAL_TYPE_P (TREE_TYPE (rhs1)))
1905 return simplify_div_or_mod_using_ranges (gsi, stmt);
1906 break;
1908 /* Transform ABS (X) into X or -X as appropriate. */
1909 case ABS_EXPR:
1910 if (TREE_CODE (rhs1) == SSA_NAME
1911 && INTEGRAL_TYPE_P (TREE_TYPE (rhs1)))
1912 return simplify_abs_using_ranges (gsi, stmt);
1913 break;
1915 case BIT_AND_EXPR:
1916 case BIT_IOR_EXPR:
1917 /* Optimize away BIT_AND_EXPR and BIT_IOR_EXPR
1918 if all the bits being cleared are already cleared or
1919 all the bits being set are already set. */
1920 if (INTEGRAL_TYPE_P (TREE_TYPE (rhs1)))
1921 return simplify_bit_ops_using_ranges (gsi, stmt);
1922 break;
1924 CASE_CONVERT:
1925 if (TREE_CODE (rhs1) == SSA_NAME
1926 && INTEGRAL_TYPE_P (TREE_TYPE (rhs1)))
1927 return simplify_conversion_using_ranges (gsi, stmt);
1928 break;
1930 case FLOAT_EXPR:
1931 if (TREE_CODE (rhs1) == SSA_NAME
1932 && INTEGRAL_TYPE_P (TREE_TYPE (rhs1)))
1933 return simplify_float_conversion_using_ranges (gsi, stmt);
1934 break;
1936 case MIN_EXPR:
1937 case MAX_EXPR:
1938 if (INTEGRAL_TYPE_P (TREE_TYPE (rhs1)))
1939 return simplify_min_or_max_using_ranges (gsi, stmt);
1940 break;
1942 case RSHIFT_EXPR:
1944 tree op0 = gimple_assign_rhs1 (stmt);
1945 tree type = TREE_TYPE (op0);
1946 int_range_max range;
1947 if (TYPE_SIGN (type) == SIGNED
1948 && query->range_of_expr (range, op0, stmt))
1950 unsigned prec = TYPE_PRECISION (TREE_TYPE (op0));
1951 int_range<2> nzm1 (type, wi::minus_one (prec), wi::zero (prec),
1952 VR_ANTI_RANGE);
1953 range.intersect (nzm1);
1954 // If there are no ranges other than [-1, 0] remove the shift.
1955 if (range.undefined_p ())
1957 gimple_assign_set_rhs_from_tree (gsi, op0);
1958 return true;
1960 return false;
1962 break;
1964 default:
1965 break;
1968 else if (gimple_code (stmt) == GIMPLE_COND)
1969 return simplify_cond_using_ranges_1 (as_a <gcond *> (stmt));
1970 else if (gimple_code (stmt) == GIMPLE_SWITCH)
1971 return simplify_switch_using_ranges (as_a <gswitch *> (stmt));
1972 else if (is_gimple_call (stmt)
1973 && gimple_call_internal_p (stmt))
1974 return simplify_internal_call_using_ranges (gsi, stmt);
1976 return false;