1 /* Header file for mixed range operator class.
2 Copyright (C) 2017-2023 Free Software Foundation, Inc.
3 Contributed by Andrew MacLeod <amacleod@redhat.com>
4 and Aldy Hernandez <aldyh@redhat.com>.
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
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/>. */
22 #ifndef GCC_RANGE_OP_MIXED_H
23 #define GCC_RANGE_OP_MIXED_H
25 void update_known_bitmask (irange
&, tree_code
, const irange
&, const irange
&);
26 bool minus_op1_op2_relation_effect (irange
&lhs_range
, tree type
,
27 const irange
&, const irange
&,
31 // Return TRUE if 0 is within [WMIN, WMAX].
34 wi_includes_zero_p (tree type
, const wide_int
&wmin
, const wide_int
&wmax
)
36 signop sign
= TYPE_SIGN (type
);
37 return wi::le_p (wmin
, 0, sign
) && wi::ge_p (wmax
, 0, sign
);
40 // Return TRUE if [WMIN, WMAX] is the singleton 0.
43 wi_zero_p (tree type
, const wide_int
&wmin
, const wide_int
&wmax
)
45 unsigned prec
= TYPE_PRECISION (type
);
46 return wmin
== wmax
&& wi::eq_p (wmin
, wi::zero (prec
));
50 enum bool_range_state
{ BRS_FALSE
, BRS_TRUE
, BRS_EMPTY
, BRS_FULL
};
51 bool_range_state
get_bool_state (vrange
&r
, const vrange
&lhs
, tree val_type
);
53 // If the range of either op1 or op2 is undefined, set the result to
54 // varying and return TRUE. If the caller truly cares about a result,
55 // they should pass in a varying if it has an undefined that it wants
56 // treated as a varying.
59 empty_range_varying (vrange
&r
, tree type
,
60 const vrange
&op1
, const vrange
& op2
)
62 if (op1
.undefined_p () || op2
.undefined_p ())
71 // For relation opcodes, first try to see if the supplied relation
72 // forces a true or false result, and return that.
73 // Then check for undefined operands. If none of this applies,
77 relop_early_resolve (irange
&r
, tree type
, const vrange
&op1
,
78 const vrange
&op2
, relation_trio trio
,
81 relation_kind rel
= trio
.op1_op2 ();
82 // If known relation is a complete subset of this relation, always true.
83 if (relation_union (rel
, my_rel
) == my_rel
)
85 r
= range_true (type
);
89 // If known relation has no subset of this relation, always false.
90 if (relation_intersect (rel
, my_rel
) == VREL_UNDEFINED
)
92 r
= range_false (type
);
96 // If either operand is undefined, return VARYING.
97 if (empty_range_varying (r
, type
, op1
, op2
))
103 // ----------------------------------------------------------------------
104 // Mixed Mode Operators.
105 // ----------------------------------------------------------------------
107 class operator_equal
: public range_operator
110 using range_operator::fold_range
;
111 using range_operator::op1_range
;
112 using range_operator::op2_range
;
113 using range_operator::op1_op2_relation
;
114 bool fold_range (irange
&r
, tree type
,
115 const irange
&op1
, const irange
&op2
,
116 relation_trio
= TRIO_VARYING
) const final override
;
117 bool fold_range (irange
&r
, tree type
,
118 const frange
&op1
, const frange
&op2
,
119 relation_trio
= TRIO_VARYING
) const final override
;
121 bool op1_range (irange
&r
, tree type
,
122 const irange
&lhs
, const irange
&val
,
123 relation_trio
= TRIO_VARYING
) const final override
;
124 bool op1_range (frange
&r
, tree type
,
125 const irange
&lhs
, const frange
&op2
,
126 relation_trio
= TRIO_VARYING
) const final override
;
128 bool op2_range (irange
&r
, tree type
,
129 const irange
&lhs
, const irange
&val
,
130 relation_trio
= TRIO_VARYING
) const final override
;
131 bool op2_range (frange
&r
, tree type
,
132 const irange
&lhs
, const frange
&op1
,
133 relation_trio rel
= TRIO_VARYING
) const final override
;
135 relation_kind
op1_op2_relation (const irange
&lhs
, const irange
&,
136 const irange
&) const final override
;
137 relation_kind
op1_op2_relation (const irange
&lhs
, const frange
&,
138 const frange
&) const final override
;
139 void update_bitmask (irange
&r
, const irange
&lh
,
140 const irange
&rh
) const final override
;
143 class operator_not_equal
: public range_operator
146 using range_operator::fold_range
;
147 using range_operator::op1_range
;
148 using range_operator::op2_range
;
149 using range_operator::op1_op2_relation
;
150 bool fold_range (irange
&r
, tree type
,
151 const irange
&op1
, const irange
&op2
,
152 relation_trio
= TRIO_VARYING
) const final override
;
153 bool fold_range (irange
&r
, tree type
,
154 const frange
&op1
, const frange
&op2
,
155 relation_trio rel
= TRIO_VARYING
) const final override
;
157 bool op1_range (irange
&r
, tree type
,
158 const irange
&lhs
, const irange
&op2
,
159 relation_trio
= TRIO_VARYING
) const final override
;
160 bool op1_range (frange
&r
, tree type
,
161 const irange
&lhs
, const frange
&op2
,
162 relation_trio
= TRIO_VARYING
) const final override
;
164 bool op2_range (irange
&r
, tree type
,
165 const irange
&lhs
, const irange
&op1
,
166 relation_trio
= TRIO_VARYING
) const final override
;
167 bool op2_range (frange
&r
, tree type
,
168 const irange
&lhs
, const frange
&op1
,
169 relation_trio
= TRIO_VARYING
) const final override
;
171 relation_kind
op1_op2_relation (const irange
&lhs
, const irange
&,
172 const irange
&) const final override
;
173 relation_kind
op1_op2_relation (const irange
&lhs
, const frange
&,
174 const frange
&) const final override
;
175 void update_bitmask (irange
&r
, const irange
&lh
,
176 const irange
&rh
) const final override
;
179 class operator_lt
: public range_operator
182 using range_operator::fold_range
;
183 using range_operator::op1_range
;
184 using range_operator::op2_range
;
185 using range_operator::op1_op2_relation
;
186 bool fold_range (irange
&r
, tree type
,
187 const irange
&op1
, const irange
&op2
,
188 relation_trio
= TRIO_VARYING
) const final override
;
189 bool fold_range (irange
&r
, tree type
,
190 const frange
&op1
, const frange
&op2
,
191 relation_trio
= TRIO_VARYING
) const final override
;
192 bool op1_range (irange
&r
, tree type
,
193 const irange
&lhs
, const irange
&op2
,
194 relation_trio
= TRIO_VARYING
) const final override
;
195 bool op1_range (frange
&r
, tree type
,
196 const irange
&lhs
, const frange
&op2
,
197 relation_trio
= TRIO_VARYING
) const final override
;
198 bool op2_range (irange
&r
, tree type
,
199 const irange
&lhs
, const irange
&op1
,
200 relation_trio
= TRIO_VARYING
) const final override
;
201 bool op2_range (frange
&r
, tree type
,
202 const irange
&lhs
, const frange
&op1
,
203 relation_trio
= TRIO_VARYING
) const final override
;
204 relation_kind
op1_op2_relation (const irange
&lhs
, const irange
&,
205 const irange
&) const final override
;
206 relation_kind
op1_op2_relation (const irange
&lhs
, const frange
&,
207 const frange
&) const final override
;
208 void update_bitmask (irange
&r
, const irange
&lh
,
209 const irange
&rh
) const final override
;
212 class operator_le
: public range_operator
215 using range_operator::fold_range
;
216 using range_operator::op1_range
;
217 using range_operator::op2_range
;
218 using range_operator::op1_op2_relation
;
219 bool fold_range (irange
&r
, tree type
,
220 const irange
&op1
, const irange
&op2
,
221 relation_trio
= TRIO_VARYING
) const final override
;
222 bool fold_range (irange
&r
, tree type
,
223 const frange
&op1
, const frange
&op2
,
224 relation_trio rel
= TRIO_VARYING
) const final override
;
226 bool op1_range (irange
&r
, tree type
,
227 const irange
&lhs
, const irange
&op2
,
228 relation_trio
= TRIO_VARYING
) const final override
;
229 bool op1_range (frange
&r
, tree type
,
230 const irange
&lhs
, const frange
&op2
,
231 relation_trio rel
= TRIO_VARYING
) const final override
;
233 bool op2_range (irange
&r
, tree type
,
234 const irange
&lhs
, const irange
&op1
,
235 relation_trio
= TRIO_VARYING
) const final override
;
236 bool op2_range (frange
&r
, tree type
,
237 const irange
&lhs
, const frange
&op1
,
238 relation_trio rel
= TRIO_VARYING
) const final override
;
240 relation_kind
op1_op2_relation (const irange
&lhs
, const irange
&,
241 const irange
&) const final override
;
242 relation_kind
op1_op2_relation (const irange
&lhs
, const frange
&,
243 const frange
&) const final override
;
244 void update_bitmask (irange
&r
, const irange
&lh
,
245 const irange
&rh
) const final override
;
248 class operator_gt
: public range_operator
251 using range_operator::fold_range
;
252 using range_operator::op1_range
;
253 using range_operator::op2_range
;
254 using range_operator::op1_op2_relation
;
255 bool fold_range (irange
&r
, tree type
,
256 const irange
&op1
, const irange
&op2
,
257 relation_trio
= TRIO_VARYING
) const final override
;
258 bool fold_range (irange
&r
, tree type
,
259 const frange
&op1
, const frange
&op2
,
260 relation_trio
= TRIO_VARYING
) const final override
;
262 bool op1_range (irange
&r
, tree type
,
263 const irange
&lhs
, const irange
&op2
,
264 relation_trio
= TRIO_VARYING
) const final override
;
265 bool op1_range (frange
&r
, tree type
,
266 const irange
&lhs
, const frange
&op2
,
267 relation_trio
= TRIO_VARYING
) const final override
;
269 bool op2_range (irange
&r
, tree type
,
270 const irange
&lhs
, const irange
&op1
,
271 relation_trio
= TRIO_VARYING
) const final override
;
272 bool op2_range (frange
&r
, tree type
,
273 const irange
&lhs
, const frange
&op1
,
274 relation_trio
= TRIO_VARYING
) const final override
;
275 relation_kind
op1_op2_relation (const irange
&lhs
, const irange
&,
276 const irange
&) const final override
;
277 relation_kind
op1_op2_relation (const irange
&lhs
, const frange
&,
278 const frange
&) const final override
;
279 void update_bitmask (irange
&r
, const irange
&lh
,
280 const irange
&rh
) const final override
;
283 class operator_ge
: public range_operator
286 using range_operator::fold_range
;
287 using range_operator::op1_range
;
288 using range_operator::op2_range
;
289 using range_operator::op1_op2_relation
;
290 bool fold_range (irange
&r
, tree type
,
291 const irange
&op1
, const irange
&op2
,
292 relation_trio
= TRIO_VARYING
) const final override
;
293 bool fold_range (irange
&r
, tree type
,
294 const frange
&op1
, const frange
&op2
,
295 relation_trio
= TRIO_VARYING
) const final override
;
297 bool op1_range (irange
&r
, tree type
,
298 const irange
&lhs
, const irange
&op2
,
299 relation_trio
= TRIO_VARYING
) const final override
;
300 bool op1_range (frange
&r
, tree type
,
301 const irange
&lhs
, const frange
&op2
,
302 relation_trio
= TRIO_VARYING
) const final override
;
304 bool op2_range (irange
&r
, tree type
,
305 const irange
&lhs
, const irange
&op1
,
306 relation_trio
= TRIO_VARYING
) const final override
;
307 bool op2_range (frange
&r
, tree type
,
308 const irange
&lhs
, const frange
&op1
,
309 relation_trio
= TRIO_VARYING
) const final override
;
311 relation_kind
op1_op2_relation (const irange
&lhs
, const irange
&,
312 const irange
&) const final override
;
313 relation_kind
op1_op2_relation (const irange
&lhs
, const frange
&,
314 const frange
&) const final override
;
315 void update_bitmask (irange
&r
, const irange
&lh
,
316 const irange
&rh
) const final override
;
319 class operator_identity
: public range_operator
322 using range_operator::fold_range
;
323 using range_operator::op1_range
;
324 using range_operator::lhs_op1_relation
;
325 bool fold_range (irange
&r
, tree type
,
326 const irange
&op1
, const irange
&op2
,
327 relation_trio rel
= TRIO_VARYING
) const final override
;
328 bool fold_range (frange
&r
, tree type ATTRIBUTE_UNUSED
,
329 const frange
&op1
, const frange
&op2 ATTRIBUTE_UNUSED
,
330 relation_trio
= TRIO_VARYING
) const final override
;
331 bool op1_range (irange
&r
, tree type
,
332 const irange
&lhs
, const irange
&op2
,
333 relation_trio rel
= TRIO_VARYING
) const final override
;
334 bool op1_range (frange
&r
, tree type ATTRIBUTE_UNUSED
,
335 const frange
&lhs
, const frange
&op2 ATTRIBUTE_UNUSED
,
336 relation_trio
= TRIO_VARYING
) const final override
;
337 relation_kind
lhs_op1_relation (const irange
&lhs
,
338 const irange
&op1
, const irange
&op2
,
339 relation_kind rel
) const final override
;
342 class operator_cst
: public range_operator
345 using range_operator::fold_range
;
346 bool fold_range (irange
&r
, tree type
,
347 const irange
&op1
, const irange
&op2
,
348 relation_trio rel
= TRIO_VARYING
) const final override
;
349 bool fold_range (frange
&r
, tree type
,
350 const frange
&op1
, const frange
&op2
,
351 relation_trio
= TRIO_VARYING
) const final override
;
355 class operator_cast
: public range_operator
358 using range_operator::fold_range
;
359 using range_operator::op1_range
;
360 using range_operator::lhs_op1_relation
;
361 bool fold_range (irange
&r
, tree type
,
362 const irange
&op1
, const irange
&op2
,
363 relation_trio rel
= TRIO_VARYING
) const final override
;
364 bool op1_range (irange
&r
, tree type
,
365 const irange
&lhs
, const irange
&op2
,
366 relation_trio rel
= TRIO_VARYING
) const final override
;
367 relation_kind
lhs_op1_relation (const irange
&lhs
,
368 const irange
&op1
, const irange
&op2
,
369 relation_kind
) const final override
;
370 void update_bitmask (irange
&r
, const irange
&lh
,
371 const irange
&rh
) const final override
;
373 bool truncating_cast_p (const irange
&inner
, const irange
&outer
) const;
374 bool inside_domain_p (const wide_int
&min
, const wide_int
&max
,
375 const irange
&outer
) const;
376 void fold_pair (irange
&r
, unsigned index
, const irange
&inner
,
377 const irange
&outer
) const;
380 class operator_plus
: public range_operator
383 using range_operator::op1_range
;
384 using range_operator::op2_range
;
385 using range_operator::lhs_op1_relation
;
386 using range_operator::lhs_op2_relation
;
387 bool op1_range (irange
&r
, tree type
,
388 const irange
&lhs
, const irange
&op2
,
389 relation_trio
) const final override
;
390 bool op1_range (frange
&r
, tree type
,
391 const frange
&lhs
, const frange
&op2
,
392 relation_trio
= TRIO_VARYING
) const final override
;
394 bool op2_range (irange
&r
, tree type
,
395 const irange
&lhs
, const irange
&op1
,
396 relation_trio
) const final override
;
397 bool op2_range (frange
&r
, tree type
,
398 const frange
&lhs
, const frange
&op1
,
399 relation_trio
= TRIO_VARYING
) const final override
;
401 relation_kind
lhs_op1_relation (const irange
&lhs
, const irange
&op1
,
403 relation_kind rel
) const final override
;
404 relation_kind
lhs_op2_relation (const irange
&lhs
, const irange
&op1
,
406 relation_kind rel
) const final override
;
407 void update_bitmask (irange
&r
, const irange
&lh
,
408 const irange
&rh
) const final override
;
410 virtual bool overflow_free_p (const irange
&lh
, const irange
&rh
,
411 relation_trio
= TRIO_VARYING
) const;
414 void wi_fold (irange
&r
, tree type
, const wide_int
&lh_lb
,
415 const wide_int
&lh_ub
, const wide_int
&rh_lb
,
416 const wide_int
&rh_ub
) const final override
;
417 void rv_fold (REAL_VALUE_TYPE
&lb
, REAL_VALUE_TYPE
&ub
,
418 bool &maybe_nan
, tree type
,
419 const REAL_VALUE_TYPE
&lh_lb
, const REAL_VALUE_TYPE
&lh_ub
,
420 const REAL_VALUE_TYPE
&rh_lb
, const REAL_VALUE_TYPE
&rh_ub
,
421 relation_kind
) const final override
;
424 class operator_abs
: public range_operator
427 using range_operator::fold_range
;
428 using range_operator::op1_range
;
429 bool fold_range (frange
&r
, tree type
,
430 const frange
&op1
, const frange
&,
431 relation_trio
= TRIO_VARYING
) const final override
;
433 bool op1_range (irange
&r
, tree type
, const irange
&lhs
,
434 const irange
&op2
, relation_trio
) const final override
;
435 bool op1_range (frange
&r
, tree type
,
436 const frange
&lhs
, const frange
&op2
,
437 relation_trio rel
= TRIO_VARYING
) const final override
;
438 void update_bitmask (irange
&r
, const irange
&lh
,
439 const irange
&rh
) const final override
;
441 void wi_fold (irange
&r
, tree type
, const wide_int
&lh_lb
,
442 const wide_int
&lh_ub
, const wide_int
&rh_lb
,
443 const wide_int
&rh_ub
) const final override
;
447 class operator_minus
: public range_operator
450 using range_operator::fold_range
;
451 using range_operator::op1_range
;
452 using range_operator::op2_range
;
453 using range_operator::lhs_op1_relation
;
454 bool op1_range (irange
&r
, tree type
,
455 const irange
&lhs
, const irange
&op2
,
456 relation_trio
) const final override
;
457 bool op1_range (frange
&r
, tree type
,
458 const frange
&lhs
, const frange
&op2
,
459 relation_trio
= TRIO_VARYING
) const final override
;
461 bool op2_range (irange
&r
, tree type
,
462 const irange
&lhs
, const irange
&op1
,
463 relation_trio
) const final override
;
464 bool op2_range (frange
&r
, tree type
,
467 relation_trio
= TRIO_VARYING
) const final override
;
469 relation_kind
lhs_op1_relation (const irange
&lhs
,
470 const irange
&op1
, const irange
&op2
,
471 relation_kind rel
) const final override
;
472 bool op1_op2_relation_effect (irange
&lhs_range
, tree type
,
473 const irange
&op1_range
,
474 const irange
&op2_range
,
475 relation_kind rel
) const final override
;
476 void update_bitmask (irange
&r
, const irange
&lh
,
477 const irange
&rh
) const final override
;
479 virtual bool overflow_free_p (const irange
&lh
, const irange
&rh
,
480 relation_trio
= TRIO_VARYING
) const;
483 void wi_fold (irange
&r
, tree type
, const wide_int
&lh_lb
,
484 const wide_int
&lh_ub
, const wide_int
&rh_lb
,
485 const wide_int
&rh_ub
) const final override
;
486 void rv_fold (REAL_VALUE_TYPE
&lb
, REAL_VALUE_TYPE
&ub
,
487 bool &maybe_nan
, tree type
,
488 const REAL_VALUE_TYPE
&lh_lb
, const REAL_VALUE_TYPE
&lh_ub
,
489 const REAL_VALUE_TYPE
&rh_lb
, const REAL_VALUE_TYPE
&rh_ub
,
490 relation_kind
) const final override
;
493 class operator_negate
: public range_operator
496 using range_operator::fold_range
;
497 using range_operator::op1_range
;
498 bool fold_range (irange
&r
, tree type
,
499 const irange
&op1
, const irange
&op2
,
500 relation_trio rel
= TRIO_VARYING
) const final override
;
501 bool fold_range (frange
&r
, tree type
,
502 const frange
&op1
, const frange
&op2
,
503 relation_trio
= TRIO_VARYING
) const final override
;
505 bool op1_range (irange
&r
, tree type
,
506 const irange
&lhs
, const irange
&op2
,
507 relation_trio rel
= TRIO_VARYING
) const final override
;
508 bool op1_range (frange
&r
, tree type
,
509 const frange
&lhs
, const frange
&op2
,
510 relation_trio rel
= TRIO_VARYING
) const final override
;
514 class cross_product_operator
: public range_operator
517 virtual bool wi_op_overflows (wide_int
&r
,
520 const wide_int
&) const = 0;
521 void wi_cross_product (irange
&r
, tree type
,
522 const wide_int
&lh_lb
,
523 const wide_int
&lh_ub
,
524 const wide_int
&rh_lb
,
525 const wide_int
&rh_ub
) const;
528 class operator_mult
: public cross_product_operator
531 using range_operator::op1_range
;
532 using range_operator::op2_range
;
533 bool op1_range (irange
&r
, tree type
,
534 const irange
&lhs
, const irange
&op2
,
535 relation_trio
) const final override
;
536 bool op1_range (frange
&r
, tree type
,
537 const frange
&lhs
, const frange
&op2
,
538 relation_trio
= TRIO_VARYING
) const final override
;
540 bool op2_range (irange
&r
, tree type
,
541 const irange
&lhs
, const irange
&op1
,
542 relation_trio
) const final override
;
543 bool op2_range (frange
&r
, tree type
,
544 const frange
&lhs
, const frange
&op1
,
545 relation_trio
= TRIO_VARYING
) const final override
;
547 void update_bitmask (irange
&r
, const irange
&lh
,
548 const irange
&rh
) const final override
;
550 void wi_fold (irange
&r
, tree type
, const wide_int
&lh_lb
,
551 const wide_int
&lh_ub
, const wide_int
&rh_lb
,
552 const wide_int
&rh_ub
) const final override
;
553 bool wi_op_overflows (wide_int
&res
, tree type
, const wide_int
&w0
,
554 const wide_int
&w1
) const final override
;
556 void rv_fold (REAL_VALUE_TYPE
&lb
, REAL_VALUE_TYPE
&ub
,
557 bool &maybe_nan
, tree type
,
558 const REAL_VALUE_TYPE
&lh_lb
, const REAL_VALUE_TYPE
&lh_ub
,
559 const REAL_VALUE_TYPE
&rh_lb
, const REAL_VALUE_TYPE
&rh_ub
,
560 relation_kind kind
) const final override
;
561 virtual bool overflow_free_p (const irange
&lh
, const irange
&rh
,
562 relation_trio
= TRIO_VARYING
) const;
566 class operator_addr_expr
: public range_operator
569 using range_operator::fold_range
;
570 using range_operator::op1_range
;
571 bool fold_range (irange
&r
, tree type
,
572 const irange
&op1
, const irange
&op2
,
573 relation_trio rel
= TRIO_VARYING
) const final override
;
574 bool op1_range (irange
&r
, tree type
,
575 const irange
&lhs
, const irange
&op2
,
576 relation_trio rel
= TRIO_VARYING
) const final override
;
579 class operator_bitwise_not
: public range_operator
582 using range_operator::fold_range
;
583 using range_operator::op1_range
;
584 bool fold_range (irange
&r
, tree type
,
585 const irange
&lh
, const irange
&rh
,
586 relation_trio rel
= TRIO_VARYING
) const final override
;
587 bool op1_range (irange
&r
, tree type
,
588 const irange
&lhs
, const irange
&op2
,
589 relation_trio rel
= TRIO_VARYING
) const final override
;
590 void update_bitmask (irange
&r
, const irange
&lh
,
591 const irange
&rh
) const final override
;
594 class operator_bitwise_xor
: public range_operator
597 using range_operator::op1_range
;
598 using range_operator::op2_range
;
599 bool op1_range (irange
&r
, tree type
,
600 const irange
&lhs
, const irange
&op2
,
601 relation_trio rel
= TRIO_VARYING
) const final override
;
602 bool op2_range (irange
&r
, tree type
,
603 const irange
&lhs
, const irange
&op1
,
604 relation_trio rel
= TRIO_VARYING
) const final override
;
605 bool op1_op2_relation_effect (irange
&lhs_range
,
607 const irange
&op1_range
,
608 const irange
&op2_range
,
609 relation_kind rel
) const final override
;
610 void update_bitmask (irange
&r
, const irange
&lh
,
611 const irange
&rh
) const final override
;
613 void wi_fold (irange
&r
, tree type
, const wide_int
&lh_lb
,
614 const wide_int
&lh_ub
, const wide_int
&rh_lb
,
615 const wide_int
&rh_ub
) const final override
;
618 class operator_bitwise_and
: public range_operator
621 using range_operator::op1_range
;
622 using range_operator::op2_range
;
623 using range_operator::lhs_op1_relation
;
624 bool op1_range (irange
&r
, tree type
,
625 const irange
&lhs
, const irange
&op2
,
626 relation_trio rel
= TRIO_VARYING
) const override
;
627 bool op2_range (irange
&r
, tree type
,
628 const irange
&lhs
, const irange
&op1
,
629 relation_trio rel
= TRIO_VARYING
) const override
;
630 relation_kind
lhs_op1_relation (const irange
&lhs
,
631 const irange
&op1
, const irange
&op2
,
632 relation_kind
) const override
;
633 void update_bitmask (irange
&r
, const irange
&lh
,
634 const irange
&rh
) const override
;
636 void wi_fold (irange
&r
, tree type
, const wide_int
&lh_lb
,
637 const wide_int
&lh_ub
, const wide_int
&rh_lb
,
638 const wide_int
&rh_ub
) const override
;
639 void simple_op1_range_solver (irange
&r
, tree type
,
641 const irange
&op2
) const;
644 class operator_bitwise_or
: public range_operator
647 using range_operator::op1_range
;
648 using range_operator::op2_range
;
649 bool op1_range (irange
&r
, tree type
,
650 const irange
&lhs
, const irange
&op2
,
651 relation_trio rel
= TRIO_VARYING
) const override
;
652 bool op2_range (irange
&r
, tree type
,
653 const irange
&lhs
, const irange
&op1
,
654 relation_trio rel
= TRIO_VARYING
) const override
;
655 void update_bitmask (irange
&r
, const irange
&lh
,
656 const irange
&rh
) const override
;
658 void wi_fold (irange
&r
, tree type
, const wide_int
&lh_lb
,
659 const wide_int
&lh_ub
, const wide_int
&rh_lb
,
660 const wide_int
&rh_ub
) const override
;
663 class operator_min
: public range_operator
666 void update_bitmask (irange
&r
, const irange
&lh
,
667 const irange
&rh
) const override
;
669 void wi_fold (irange
&r
, tree type
, const wide_int
&lh_lb
,
670 const wide_int
&lh_ub
, const wide_int
&rh_lb
,
671 const wide_int
&rh_ub
) const override
;
674 class operator_max
: public range_operator
677 void update_bitmask (irange
&r
, const irange
&lh
,
678 const irange
&rh
) const override
;
680 void wi_fold (irange
&r
, tree type
, const wide_int
&lh_lb
,
681 const wide_int
&lh_ub
, const wide_int
&rh_lb
,
682 const wide_int
&rh_ub
) const override
;
684 #endif // GCC_RANGE_OP_MIXED_H