Extend fold_vec_perm to handle VLA vector_cst.
[official-gcc.git] / gcc / gimple-range-gori.cc
blob51fb542a19cbcfe5696a68ab632291ec63cd1fe8
1 /* Gimple range GORI functions.
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
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.
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.
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 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "backend.h"
26 #include "tree.h"
27 #include "gimple.h"
28 #include "ssa.h"
29 #include "gimple-pretty-print.h"
30 #include "gimple-range.h"
32 // Return TRUE if GS is a logical && or || expression.
34 static inline bool
35 is_gimple_logical_p (const gimple *gs)
37 // Look for boolean and/or condition.
38 if (is_gimple_assign (gs))
39 switch (gimple_expr_code (gs))
41 case TRUTH_AND_EXPR:
42 case TRUTH_OR_EXPR:
43 return true;
45 case BIT_AND_EXPR:
46 case BIT_IOR_EXPR:
47 // Bitwise operations on single bits are logical too.
48 if (types_compatible_p (TREE_TYPE (gimple_assign_rhs1 (gs)),
49 boolean_type_node))
50 return true;
51 break;
53 default:
54 break;
56 return false;
59 /* RANGE_DEF_CHAIN is used to determine which SSA names in a block can
60 have range information calculated for them, and what the
61 dependencies on each other are.
63 Information for a basic block is calculated once and stored. It is
64 only calculated the first time a query is made, so if no queries
65 are made, there is little overhead.
67 The def_chain bitmap is indexed by SSA_NAME_VERSION. Bits are set
68 within this bitmap to indicate SSA names that are defined in the
69 SAME block and used to calculate this SSA name.
72 <bb 2> :
73 _1 = x_4(D) + -2;
74 _2 = _1 * 4;
75 j_7 = foo ();
76 q_5 = _2 + 3;
77 if (q_5 <= 13)
79 _1 : x_4(D)
80 _2 : 1 x_4(D)
81 q_5 : _1 _2 x_4(D)
83 This dump indicates the bits set in the def_chain vector.
84 as well as demonstrates the def_chain bits for the related ssa_names.
86 Checking the chain for _2 indicates that _1 and x_4 are used in
87 its evaluation.
89 Def chains also only include statements which are valid gimple
90 so a def chain will only span statements for which the range
91 engine implements operations for. */
94 // Construct a range_def_chain.
96 range_def_chain::range_def_chain ()
98 bitmap_obstack_initialize (&m_bitmaps);
99 m_def_chain.create (0);
100 m_def_chain.safe_grow_cleared (num_ssa_names);
101 m_logical_depth = 0;
104 // Destruct a range_def_chain.
106 range_def_chain::~range_def_chain ()
108 m_def_chain.release ();
109 bitmap_obstack_release (&m_bitmaps);
112 // Return true if NAME is in the def chain of DEF. If BB is provided,
113 // only return true if the defining statement of DEF is in BB.
115 bool
116 range_def_chain::in_chain_p (tree name, tree def)
118 gcc_checking_assert (gimple_range_ssa_p (def));
119 gcc_checking_assert (gimple_range_ssa_p (name));
121 // Get the definition chain for DEF.
122 bitmap chain = get_def_chain (def);
124 if (chain == NULL)
125 return false;
126 return bitmap_bit_p (chain, SSA_NAME_VERSION (name));
129 // Add either IMP or the import list B to the import set of DATA.
131 void
132 range_def_chain::set_import (struct rdc &data, tree imp, bitmap b)
134 // If there are no imports, just return
135 if (imp == NULL_TREE && !b)
136 return;
137 if (!data.m_import)
138 data.m_import = BITMAP_ALLOC (&m_bitmaps);
139 if (imp != NULL_TREE)
140 bitmap_set_bit (data.m_import, SSA_NAME_VERSION (imp));
141 else
142 bitmap_ior_into (data.m_import, b);
145 // Return the import list for NAME.
147 bitmap
148 range_def_chain::get_imports (tree name)
150 if (!has_def_chain (name))
151 get_def_chain (name);
152 bitmap i = m_def_chain[SSA_NAME_VERSION (name)].m_import;
153 return i;
156 // Return true if IMPORT is an import to NAMEs def chain.
158 bool
159 range_def_chain::chain_import_p (tree name, tree import)
161 bitmap b = get_imports (name);
162 if (b)
163 return bitmap_bit_p (b, SSA_NAME_VERSION (import));
164 return false;
167 // Build def_chains for NAME if it is in BB. Copy the def chain into RESULT.
169 void
170 range_def_chain::register_dependency (tree name, tree dep, basic_block bb)
172 if (!gimple_range_ssa_p (dep))
173 return;
175 unsigned v = SSA_NAME_VERSION (name);
176 if (v >= m_def_chain.length ())
177 m_def_chain.safe_grow_cleared (num_ssa_names + 1);
178 struct rdc &src = m_def_chain[v];
179 gimple *def_stmt = SSA_NAME_DEF_STMT (dep);
180 unsigned dep_v = SSA_NAME_VERSION (dep);
181 bitmap b;
183 // Set the direct dependency cache entries.
184 if (!src.ssa1)
185 src.ssa1 = SSA_NAME_VERSION (dep);
186 else if (!src.ssa2 && src.ssa1 != SSA_NAME_VERSION (dep))
187 src.ssa2 = SSA_NAME_VERSION (dep);
189 // Don't calculate imports or export/dep chains if BB is not provided.
190 // This is usually the case for when the temporal cache wants the direct
191 // dependencies of a stmt.
192 if (!bb)
193 return;
195 if (!src.bm)
196 src.bm = BITMAP_ALLOC (&m_bitmaps);
198 // Add this operand into the result.
199 bitmap_set_bit (src.bm, dep_v);
201 if (gimple_bb (def_stmt) == bb && !is_a<gphi *>(def_stmt))
203 // Get the def chain for the operand.
204 b = get_def_chain (dep);
205 // If there was one, copy it into result. Access def_chain directly
206 // as the get_def_chain request above could reallocate the vector.
207 if (b)
208 bitmap_ior_into (m_def_chain[v].bm, b);
209 // And copy the import list.
210 set_import (m_def_chain[v], NULL_TREE, get_imports (dep));
212 else
213 // Originated outside the block, so it is an import.
214 set_import (src, dep, NULL);
217 bool
218 range_def_chain::def_chain_in_bitmap_p (tree name, bitmap b)
220 bitmap a = get_def_chain (name);
221 if (a && b)
222 return bitmap_intersect_p (a, b);
223 return false;
226 void
227 range_def_chain::add_def_chain_to_bitmap (bitmap b, tree name)
229 bitmap r = get_def_chain (name);
230 if (r)
231 bitmap_ior_into (b, r);
235 // Return TRUE if NAME has been processed for a def_chain.
237 inline bool
238 range_def_chain::has_def_chain (tree name)
240 // Ensure there is an entry in the internal vector.
241 unsigned v = SSA_NAME_VERSION (name);
242 if (v >= m_def_chain.length ())
243 m_def_chain.safe_grow_cleared (num_ssa_names + 1);
244 return (m_def_chain[v].ssa1 != 0);
249 // Calculate the def chain for NAME and all of its dependent
250 // operands. Only using names in the same BB. Return the bitmap of
251 // all names in the m_def_chain. This only works for supported range
252 // statements.
254 bitmap
255 range_def_chain::get_def_chain (tree name)
257 tree ssa[3];
258 unsigned v = SSA_NAME_VERSION (name);
260 // If it has already been processed, just return the cached value.
261 if (has_def_chain (name) && m_def_chain[v].bm)
262 return m_def_chain[v].bm;
264 // No definition chain for default defs.
265 if (SSA_NAME_IS_DEFAULT_DEF (name))
267 // A Default def is always an import.
268 set_import (m_def_chain[v], name, NULL);
269 return NULL;
272 gimple *stmt = SSA_NAME_DEF_STMT (name);
273 unsigned count = gimple_range_ssa_names (ssa, 3, stmt);
274 if (count == 0)
276 // Stmts not understood or with no operands are always imports.
277 set_import (m_def_chain[v], name, NULL);
278 return NULL;
281 // Terminate the def chains if we see too many cascading stmts.
282 if (m_logical_depth == param_ranger_logical_depth)
283 return NULL;
285 // Increase the depth if we have a pair of ssa-names.
286 if (count > 1)
287 m_logical_depth++;
289 for (unsigned x = 0; x < count; x++)
290 register_dependency (name, ssa[x], gimple_bb (stmt));
292 if (count > 1)
293 m_logical_depth--;
295 return m_def_chain[v].bm;
298 // Dump what we know for basic block BB to file F.
300 void
301 range_def_chain::dump (FILE *f, basic_block bb, const char *prefix)
303 unsigned x, y;
304 bitmap_iterator bi;
306 // Dump the def chain for each SSA_NAME defined in BB.
307 for (x = 1; x < num_ssa_names; x++)
309 tree name = ssa_name (x);
310 if (!name)
311 continue;
312 gimple *stmt = SSA_NAME_DEF_STMT (name);
313 if (!stmt || (bb && gimple_bb (stmt) != bb))
314 continue;
315 bitmap chain = (has_def_chain (name) ? get_def_chain (name) : NULL);
316 if (chain && !bitmap_empty_p (chain))
318 fprintf (f, prefix);
319 print_generic_expr (f, name, TDF_SLIM);
320 fprintf (f, " : ");
322 bitmap imports = get_imports (name);
323 EXECUTE_IF_SET_IN_BITMAP (chain, 0, y, bi)
325 print_generic_expr (f, ssa_name (y), TDF_SLIM);
326 if (imports && bitmap_bit_p (imports, y))
327 fprintf (f, "(I)");
328 fprintf (f, " ");
330 fprintf (f, "\n");
336 // -------------------------------------------------------------------
338 /* GORI_MAP is used to accumulate what SSA names in a block can
339 generate range information, and provides tools for the block ranger
340 to enable it to efficiently calculate these ranges.
342 GORI stands for "Generates Outgoing Range Information."
344 It utilizes the range_def_chain class to construct def_chains.
345 Information for a basic block is calculated once and stored. It is
346 only calculated the first time a query is made. If no queries are
347 made, there is little overhead.
349 one bitmap is maintained for each basic block:
350 m_outgoing : a set bit indicates a range can be generated for a name.
352 Generally speaking, the m_outgoing vector is the union of the
353 entire def_chain of all SSA names used in the last statement of the
354 block which generate ranges. */
357 // Initialize a gori-map structure.
359 gori_map::gori_map ()
361 m_outgoing.create (0);
362 m_outgoing.safe_grow_cleared (last_basic_block_for_fn (cfun));
363 m_incoming.create (0);
364 m_incoming.safe_grow_cleared (last_basic_block_for_fn (cfun));
365 m_maybe_variant = BITMAP_ALLOC (&m_bitmaps);
368 // Free any memory the GORI map allocated.
370 gori_map::~gori_map ()
372 m_incoming.release ();
373 m_outgoing.release ();
376 // Return the bitmap vector of all export from BB. Calculate if necessary.
378 bitmap
379 gori_map::exports (basic_block bb)
381 if (bb->index >= (signed int)m_outgoing.length () || !m_outgoing[bb->index])
382 calculate_gori (bb);
383 return m_outgoing[bb->index];
386 // Return the bitmap vector of all imports to BB. Calculate if necessary.
388 bitmap
389 gori_map::imports (basic_block bb)
391 if (bb->index >= (signed int)m_outgoing.length () || !m_outgoing[bb->index])
392 calculate_gori (bb);
393 return m_incoming[bb->index];
396 // Return true if NAME is can have ranges generated for it from basic
397 // block BB.
399 bool
400 gori_map::is_export_p (tree name, basic_block bb)
402 // If no BB is specified, test if it is exported anywhere in the IL.
403 if (!bb)
404 return bitmap_bit_p (m_maybe_variant, SSA_NAME_VERSION (name));
405 return bitmap_bit_p (exports (bb), SSA_NAME_VERSION (name));
408 // Set or clear the m_maybe_variant bit to determine if ranges will be tracked
409 // for NAME. A clear bit means they will NOT be tracked.
411 void
412 gori_map::set_range_invariant (tree name, bool invariant)
414 if (invariant)
415 bitmap_clear_bit (m_maybe_variant, SSA_NAME_VERSION (name));
416 else
417 bitmap_set_bit (m_maybe_variant, SSA_NAME_VERSION (name));
420 // Return true if NAME is an import to block BB.
422 bool
423 gori_map::is_import_p (tree name, basic_block bb)
425 // If no BB is specified, test if it is exported anywhere in the IL.
426 return bitmap_bit_p (imports (bb), SSA_NAME_VERSION (name));
429 // If NAME is non-NULL and defined in block BB, calculate the def
430 // chain and add it to m_outgoing.
432 void
433 gori_map::maybe_add_gori (tree name, basic_block bb)
435 if (name)
437 // Check if there is a def chain, regardless of the block.
438 add_def_chain_to_bitmap (m_outgoing[bb->index], name);
439 // Check for any imports.
440 bitmap imp = get_imports (name);
441 // If there were imports, add them so we can recompute
442 if (imp)
443 bitmap_ior_into (m_incoming[bb->index], imp);
444 // This name is always an import.
445 if (gimple_bb (SSA_NAME_DEF_STMT (name)) != bb)
446 bitmap_set_bit (m_incoming[bb->index], SSA_NAME_VERSION (name));
448 // Def chain doesn't include itself, and even if there isn't a
449 // def chain, this name should be added to exports.
450 bitmap_set_bit (m_outgoing[bb->index], SSA_NAME_VERSION (name));
454 // Calculate all the required information for BB.
456 void
457 gori_map::calculate_gori (basic_block bb)
459 tree name;
460 if (bb->index >= (signed int)m_outgoing.length ())
462 m_outgoing.safe_grow_cleared (last_basic_block_for_fn (cfun));
463 m_incoming.safe_grow_cleared (last_basic_block_for_fn (cfun));
465 gcc_checking_assert (m_outgoing[bb->index] == NULL);
466 m_outgoing[bb->index] = BITMAP_ALLOC (&m_bitmaps);
467 m_incoming[bb->index] = BITMAP_ALLOC (&m_bitmaps);
469 if (single_succ_p (bb))
470 return;
472 // If this block's last statement may generate range information, go
473 // calculate it.
474 gimple *stmt = gimple_outgoing_range_stmt_p (bb);
475 if (!stmt)
476 return;
477 if (is_a<gcond *> (stmt))
479 gcond *gc = as_a<gcond *>(stmt);
480 name = gimple_range_ssa_p (gimple_cond_lhs (gc));
481 maybe_add_gori (name, gimple_bb (stmt));
483 name = gimple_range_ssa_p (gimple_cond_rhs (gc));
484 maybe_add_gori (name, gimple_bb (stmt));
486 else
488 // Do not process switches if they are too large.
489 if (EDGE_COUNT (bb->succs) > (unsigned)param_vrp_switch_limit)
490 return;
491 gswitch *gs = as_a<gswitch *>(stmt);
492 name = gimple_range_ssa_p (gimple_switch_index (gs));
493 maybe_add_gori (name, gimple_bb (stmt));
495 // Add this bitmap to the aggregate list of all outgoing names.
496 bitmap_ior_into (m_maybe_variant, m_outgoing[bb->index]);
499 // Dump the table information for BB to file F.
501 void
502 gori_map::dump (FILE *f, basic_block bb, bool verbose)
504 // BB was not processed.
505 if (!m_outgoing[bb->index] || bitmap_empty_p (m_outgoing[bb->index]))
506 return;
508 tree name;
510 bitmap imp = imports (bb);
511 if (!bitmap_empty_p (imp))
513 if (verbose)
514 fprintf (f, "bb<%u> Imports: ",bb->index);
515 else
516 fprintf (f, "Imports: ");
517 FOR_EACH_GORI_IMPORT_NAME (*this, bb, name)
519 print_generic_expr (f, name, TDF_SLIM);
520 fprintf (f, " ");
522 fputc ('\n', f);
525 if (verbose)
526 fprintf (f, "bb<%u> Exports: ",bb->index);
527 else
528 fprintf (f, "Exports: ");
529 // Dump the export vector.
530 FOR_EACH_GORI_EXPORT_NAME (*this, bb, name)
532 print_generic_expr (f, name, TDF_SLIM);
533 fprintf (f, " ");
535 fputc ('\n', f);
537 range_def_chain::dump (f, bb, " ");
540 // Dump the entire GORI map structure to file F.
542 void
543 gori_map::dump (FILE *f)
545 basic_block bb;
546 FOR_EACH_BB_FN (bb, cfun)
547 dump (f, bb);
550 DEBUG_FUNCTION void
551 debug (gori_map &g)
553 g.dump (stderr);
556 // -------------------------------------------------------------------
558 // Construct a gori_compute object.
560 gori_compute::gori_compute (int not_executable_flag)
561 : outgoing (param_vrp_switch_limit), tracer ("GORI ")
563 m_not_executable_flag = not_executable_flag;
564 // Create a boolean_type true and false range.
565 m_bool_zero = range_false ();
566 m_bool_one = range_true ();
567 if (dump_file && (param_ranger_debug & RANGER_DEBUG_GORI))
568 tracer.enable_trace ();
571 // Given the switch S, return an evaluation in R for NAME when the lhs
572 // evaluates to LHS. Returning false means the name being looked for
573 // was not resolvable.
575 bool
576 gori_compute::compute_operand_range_switch (vrange &r, gswitch *s,
577 const vrange &lhs,
578 tree name, fur_source &src)
580 tree op1 = gimple_switch_index (s);
582 // If name matches, the range is simply the range from the edge.
583 // Empty ranges are viral as they are on a path which isn't
584 // executable.
585 if (op1 == name || lhs.undefined_p ())
587 r = lhs;
588 return true;
591 // If op1 is in the definition chain, pass lhs back.
592 if (gimple_range_ssa_p (op1) && in_chain_p (name, op1))
593 return compute_operand_range (r, SSA_NAME_DEF_STMT (op1), lhs, name, src);
595 return false;
599 // Return an evaluation for NAME as it would appear in STMT when the
600 // statement's lhs evaluates to LHS. If successful, return TRUE and
601 // store the evaluation in R, otherwise return FALSE.
603 bool
604 gori_compute::compute_operand_range (vrange &r, gimple *stmt,
605 const vrange &lhs, tree name,
606 fur_source &src, value_relation *rel)
608 value_relation vrel;
609 value_relation *vrel_ptr = rel;
610 // Empty ranges are viral as they are on an unexecutable path.
611 if (lhs.undefined_p ())
613 r.set_undefined ();
614 return true;
616 if (is_a<gswitch *> (stmt))
617 return compute_operand_range_switch (r, as_a<gswitch *> (stmt), lhs, name,
618 src);
619 gimple_range_op_handler handler (stmt);
620 if (!handler)
621 return false;
623 tree op1 = gimple_range_ssa_p (handler.operand1 ());
624 tree op2 = gimple_range_ssa_p (handler.operand2 ());
626 // If there is a relation betwen op1 and op2, use it instead as it is
627 // likely to be more applicable.
628 if (op1 && op2)
630 Value_Range r1, r2;
631 r1.set_varying (TREE_TYPE (op1));
632 r2.set_varying (TREE_TYPE (op2));
633 relation_kind k = handler.op1_op2_relation (lhs, r1, r2);
634 if (k != VREL_VARYING)
636 vrel.set_relation (k, op1, op2);
637 vrel_ptr = &vrel;
641 // Handle end of lookup first.
642 if (op1 == name)
643 return compute_operand1_range (r, handler, lhs, src, vrel_ptr);
644 if (op2 == name)
645 return compute_operand2_range (r, handler, lhs, src, vrel_ptr);
647 // NAME is not in this stmt, but one of the names in it ought to be
648 // derived from it.
649 bool op1_in_chain = op1 && in_chain_p (name, op1);
650 bool op2_in_chain = op2 && in_chain_p (name, op2);
652 // If neither operand is derived, then this stmt tells us nothing.
653 if (!op1_in_chain && !op2_in_chain)
654 return false;
656 // If either operand is in the def chain of the other (or they are equal), it
657 // will be evaluated twice and can result in an exponential time calculation.
658 // Instead just evaluate the one operand.
659 if (op1_in_chain && op2_in_chain)
661 if (in_chain_p (op1, op2) || op1 == op2)
662 op1_in_chain = false;
663 else if (in_chain_p (op2, op1))
664 op2_in_chain = false;
667 bool res = false;
668 // If the lhs doesn't tell us anything only a relation can possibly enhance
669 // the result.
670 if (lhs.varying_p ())
672 if (!vrel_ptr)
673 return false;
674 // If there is a relation (ie: x != y) , it can only be relevant if
675 // a) both elements are in the defchain
676 // c = x > y // (x and y are in c's defchain)
677 if (op1_in_chain)
678 res = in_chain_p (vrel_ptr->op1 (), op1)
679 && in_chain_p (vrel_ptr->op2 (), op1);
680 if (!res && op2_in_chain)
681 res = in_chain_p (vrel_ptr->op1 (), op2)
682 || in_chain_p (vrel_ptr->op2 (), op2);
683 if (!res)
685 // or b) one relation element is in the defchain of the other and the
686 // other is the LHS of this stmt.
687 // x = y + 2
688 if (vrel_ptr->op1 () == handler.lhs ()
689 && (vrel_ptr->op2 () == op1 || vrel_ptr->op2 () == op2))
690 res = true;
691 else if (vrel_ptr->op2 () == handler.lhs ()
692 && (vrel_ptr->op1 () == op1 || vrel_ptr->op1 () == op2))
693 res = true;
695 if (!res)
696 return false;
699 // Process logicals as they have special handling.
700 if (is_gimple_logical_p (stmt))
702 // If the lhs doesn't tell us anything, neither will combining operands.
703 if (lhs.varying_p ())
704 return false;
706 unsigned idx;
707 if ((idx = tracer.header ("compute_operand ")))
709 print_generic_expr (dump_file, name, TDF_SLIM);
710 fprintf (dump_file, " with LHS = ");
711 lhs.dump (dump_file);
712 fprintf (dump_file, " at stmt ");
713 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
716 tree type = TREE_TYPE (name);
717 Value_Range op1_trange (type), op1_frange (type);
718 Value_Range op2_trange (type), op2_frange (type);
719 compute_logical_operands (op1_trange, op1_frange, handler,
720 as_a <irange> (lhs),
721 name, src, op1, op1_in_chain);
722 compute_logical_operands (op2_trange, op2_frange, handler,
723 as_a <irange> (lhs),
724 name, src, op2, op2_in_chain);
725 res = logical_combine (r,
726 gimple_expr_code (stmt),
727 as_a <irange> (lhs),
728 op1_trange, op1_frange, op2_trange, op2_frange);
729 if (idx)
730 tracer.trailer (idx, "compute_operand", res, name, r);
731 return res;
733 // Follow the appropriate operands now.
734 if (op1_in_chain && op2_in_chain)
735 return compute_operand1_and_operand2_range (r, handler, lhs, name, src,
736 vrel_ptr);
737 Value_Range vr;
738 gimple *src_stmt;
739 if (op1_in_chain)
741 vr.set_type (TREE_TYPE (op1));
742 if (!compute_operand1_range (vr, handler, lhs, src, vrel_ptr))
743 return false;
744 src_stmt = SSA_NAME_DEF_STMT (op1);
746 else
748 gcc_checking_assert (op2_in_chain);
749 vr.set_type (TREE_TYPE (op2));
750 if (!compute_operand2_range (vr, handler, lhs, src, vrel_ptr))
751 return false;
752 src_stmt = SSA_NAME_DEF_STMT (op2);
755 gcc_checking_assert (src_stmt);
756 // Then feed this range back as the LHS of the defining statement.
757 return compute_operand_range (r, src_stmt, vr, name, src, vrel_ptr);
758 // If neither operand is derived, this statement tells us nothing.
762 // Return TRUE if range R is either a true or false compatible range.
764 static bool
765 range_is_either_true_or_false (const irange &r)
767 if (r.undefined_p ())
768 return false;
770 // This is complicated by the fact that Ada has multi-bit booleans,
771 // so true can be ~[0, 0] (i.e. [1,MAX]).
772 tree type = r.type ();
773 gcc_checking_assert (range_compatible_p (type, boolean_type_node));
774 return (r.singleton_p ()
775 || !r.contains_p (wi::zero (TYPE_PRECISION (type))));
778 // Evaluate a binary logical expression by combining the true and
779 // false ranges for each of the operands based on the result value in
780 // the LHS.
782 bool
783 gori_compute::logical_combine (vrange &r, enum tree_code code,
784 const irange &lhs,
785 const vrange &op1_true, const vrange &op1_false,
786 const vrange &op2_true, const vrange &op2_false)
788 if (op1_true.varying_p () && op1_false.varying_p ()
789 && op2_true.varying_p () && op2_false.varying_p ())
790 return false;
792 unsigned idx;
793 if ((idx = tracer.header ("logical_combine")))
795 switch (code)
797 case TRUTH_OR_EXPR:
798 case BIT_IOR_EXPR:
799 fprintf (dump_file, " || ");
800 break;
801 case TRUTH_AND_EXPR:
802 case BIT_AND_EXPR:
803 fprintf (dump_file, " && ");
804 break;
805 default:
806 break;
808 fprintf (dump_file, " with LHS = ");
809 lhs.dump (dump_file);
810 fputc ('\n', dump_file);
812 tracer.print (idx, "op1_true = ");
813 op1_true.dump (dump_file);
814 fprintf (dump_file, " op1_false = ");
815 op1_false.dump (dump_file);
816 fputc ('\n', dump_file);
817 tracer.print (idx, "op2_true = ");
818 op2_true.dump (dump_file);
819 fprintf (dump_file, " op2_false = ");
820 op2_false.dump (dump_file);
821 fputc ('\n', dump_file);
824 // This is not a simple fold of a logical expression, rather it
825 // determines ranges which flow through the logical expression.
827 // Assuming x_8 is an unsigned char, and relational statements:
828 // b_1 = x_8 < 20
829 // b_2 = x_8 > 5
830 // consider the logical expression and branch:
831 // c_2 = b_1 && b_2
832 // if (c_2)
834 // To determine the range of x_8 on either edge of the branch, one
835 // must first determine what the range of x_8 is when the boolean
836 // values of b_1 and b_2 are both true and false.
837 // b_1 TRUE x_8 = [0, 19]
838 // b_1 FALSE x_8 = [20, 255]
839 // b_2 TRUE x_8 = [6, 255]
840 // b_2 FALSE x_8 = [0,5].
842 // These ranges are then combined based on the expected outcome of
843 // the branch. The range on the TRUE side of the branch must satisfy
844 // b_1 == true && b_2 == true
846 // In terms of x_8, that means both x_8 == [0, 19] and x_8 = [6, 255]
847 // must be true. The range of x_8 on the true side must be the
848 // intersection of both ranges since both must be true. Thus the
849 // range of x_8 on the true side is [6, 19].
851 // To determine the ranges on the FALSE side, all 3 combinations of
852 // failing ranges must be considered, and combined as any of them
853 // can cause the false result.
855 // If the LHS can be TRUE or FALSE, then evaluate both a TRUE and
856 // FALSE results and combine them. If we fell back to VARYING any
857 // range restrictions that have been discovered up to this point
858 // would be lost.
859 if (!range_is_either_true_or_false (lhs))
861 bool res;
862 Value_Range r1 (r);
863 if (logical_combine (r1, code, m_bool_zero, op1_true, op1_false,
864 op2_true, op2_false)
865 && logical_combine (r, code, m_bool_one, op1_true, op1_false,
866 op2_true, op2_false))
868 r.union_ (r1);
869 res = true;
871 else
872 res = false;
873 if (idx && res)
875 tracer.print (idx, "logical_combine produced ");
876 r.dump (dump_file);
877 fputc ('\n', dump_file);
881 switch (code)
883 // A logical AND combines ranges from 2 boolean conditions.
884 // c_2 = b_1 && b_2
885 case TRUTH_AND_EXPR:
886 case BIT_AND_EXPR:
887 if (!lhs.zero_p ())
889 // The TRUE side is the intersection of the 2 true ranges.
890 r = op1_true;
891 r.intersect (op2_true);
893 else
895 // The FALSE side is the union of the other 3 cases.
896 Value_Range ff (op1_false);
897 ff.intersect (op2_false);
898 Value_Range tf (op1_true);
899 tf.intersect (op2_false);
900 Value_Range ft (op1_false);
901 ft.intersect (op2_true);
902 r = ff;
903 r.union_ (tf);
904 r.union_ (ft);
906 break;
907 // A logical OR combines ranges from 2 boolean conditions.
908 // c_2 = b_1 || b_2
909 case TRUTH_OR_EXPR:
910 case BIT_IOR_EXPR:
911 if (lhs.zero_p ())
913 // An OR operation will only take the FALSE path if both
914 // operands are false simultaneously, which means they should
915 // be intersected. !(x || y) == !x && !y
916 r = op1_false;
917 r.intersect (op2_false);
919 else
921 // The TRUE side of an OR operation will be the union of
922 // the other three combinations.
923 Value_Range tt (op1_true);
924 tt.intersect (op2_true);
925 Value_Range tf (op1_true);
926 tf.intersect (op2_false);
927 Value_Range ft (op1_false);
928 ft.intersect (op2_true);
929 r = tt;
930 r.union_ (tf);
931 r.union_ (ft);
933 break;
934 default:
935 gcc_unreachable ();
938 if (idx)
939 tracer.trailer (idx, "logical_combine", true, NULL_TREE, r);
940 return true;
944 // Given a logical STMT, calculate true and false ranges for each
945 // potential path of NAME, assuming NAME came through the OP chain if
946 // OP_IN_CHAIN is true.
948 void
949 gori_compute::compute_logical_operands (vrange &true_range, vrange &false_range,
950 gimple_range_op_handler &handler,
951 const irange &lhs,
952 tree name, fur_source &src,
953 tree op, bool op_in_chain)
955 gimple *stmt = handler.stmt ();
956 gimple *src_stmt = gimple_range_ssa_p (op) ? SSA_NAME_DEF_STMT (op) : NULL;
957 if (!op_in_chain || !src_stmt || chain_import_p (handler.lhs (), op))
959 // If op is not in the def chain, or defined in this block,
960 // use its known value on entry to the block.
961 src.get_operand (true_range, name);
962 false_range = true_range;
963 unsigned idx;
964 if ((idx = tracer.header ("logical_operand")))
966 print_generic_expr (dump_file, op, TDF_SLIM);
967 fprintf (dump_file, " not in computation chain. Queried.\n");
968 tracer.trailer (idx, "logical_operand", true, NULL_TREE, true_range);
970 return;
973 enum tree_code code = gimple_expr_code (stmt);
974 // Optimize [0 = x | y], since neither operand can ever be non-zero.
975 if ((code == BIT_IOR_EXPR || code == TRUTH_OR_EXPR) && lhs.zero_p ())
977 if (!compute_operand_range (false_range, src_stmt, m_bool_zero, name,
978 src))
979 src.get_operand (false_range, name);
980 true_range = false_range;
981 return;
984 // Optimize [1 = x & y], since neither operand can ever be zero.
985 if ((code == BIT_AND_EXPR || code == TRUTH_AND_EXPR) && lhs == m_bool_one)
987 if (!compute_operand_range (true_range, src_stmt, m_bool_one, name, src))
988 src.get_operand (true_range, name);
989 false_range = true_range;
990 return;
993 // Calculate ranges for true and false on both sides, since the false
994 // path is not always a simple inversion of the true side.
995 if (!compute_operand_range (true_range, src_stmt, m_bool_one, name, src))
996 src.get_operand (true_range, name);
997 if (!compute_operand_range (false_range, src_stmt, m_bool_zero, name, src))
998 src.get_operand (false_range, name);
1002 // This routine will try to refine the ranges of OP1 and OP2 given a relation
1003 // K between them. In order to perform this refinement, one of the operands
1004 // must be in the definition chain of the other. The use is refined using
1005 // op1/op2_range on the statement, and the definition is then recalculated
1006 // using the relation.
1008 bool
1009 gori_compute::refine_using_relation (tree op1, vrange &op1_range,
1010 tree op2, vrange &op2_range,
1011 fur_source &src, relation_kind k)
1013 gcc_checking_assert (TREE_CODE (op1) == SSA_NAME);
1014 gcc_checking_assert (TREE_CODE (op2) == SSA_NAME);
1016 if (k == VREL_VARYING || k == VREL_EQ || k == VREL_UNDEFINED)
1017 return false;
1019 bool change = false;
1020 bool op1_def_p = in_chain_p (op2, op1);
1021 if (!op1_def_p)
1022 if (!in_chain_p (op1, op2))
1023 return false;
1025 tree def_op = op1_def_p ? op1 : op2;
1026 tree use_op = op1_def_p ? op2 : op1;
1028 if (!op1_def_p)
1029 k = relation_swap (k);
1031 // op1_def is true if we want to look up op1, otherwise we want op2.
1032 // if neither is the case, we returned in the above check.
1034 gimple *def_stmt = SSA_NAME_DEF_STMT (def_op);
1035 gimple_range_op_handler op_handler (def_stmt);
1036 if (!op_handler)
1037 return false;
1038 tree def_op1 = op_handler.operand1 ();
1039 tree def_op2 = op_handler.operand2 ();
1040 // if the def isn't binary, the relation will not be useful.
1041 if (!def_op2)
1042 return false;
1044 // Determine if op2 is directly referenced as an operand.
1045 if (def_op1 == use_op)
1047 // def_stmt has op1 in the 1st operand position.
1048 Value_Range other_op (TREE_TYPE (def_op2));
1049 src.get_operand (other_op, def_op2);
1051 // Using op1_range as the LHS, and relation REL, evaluate op2.
1052 tree type = TREE_TYPE (def_op1);
1053 Value_Range new_result (type);
1054 if (!op_handler.op1_range (new_result, type,
1055 op1_def_p ? op1_range : op2_range,
1056 other_op, relation_trio::lhs_op1 (k)))
1057 return false;
1058 if (op1_def_p)
1060 change |= op2_range.intersect (new_result);
1061 // Recalculate op2.
1062 if (op_handler.fold_range (new_result, type, op2_range, other_op))
1064 change |= op1_range.intersect (new_result);
1067 else
1069 change |= op1_range.intersect (new_result);
1070 // Recalculate op1.
1071 if (op_handler.fold_range (new_result, type, op1_range, other_op))
1073 change |= op2_range.intersect (new_result);
1077 else if (def_op2 == use_op)
1079 // def_stmt has op1 in the 1st operand position.
1080 Value_Range other_op (TREE_TYPE (def_op1));
1081 src.get_operand (other_op, def_op1);
1083 // Using op1_range as the LHS, and relation REL, evaluate op2.
1084 tree type = TREE_TYPE (def_op2);
1085 Value_Range new_result (type);
1086 if (!op_handler.op2_range (new_result, type,
1087 op1_def_p ? op1_range : op2_range,
1088 other_op, relation_trio::lhs_op2 (k)))
1089 return false;
1090 if (op1_def_p)
1092 change |= op2_range.intersect (new_result);
1093 // Recalculate op1.
1094 if (op_handler.fold_range (new_result, type, other_op, op2_range))
1096 change |= op1_range.intersect (new_result);
1099 else
1101 change |= op1_range.intersect (new_result);
1102 // Recalculate op2.
1103 if (op_handler.fold_range (new_result, type, other_op, op1_range))
1105 change |= op2_range.intersect (new_result);
1109 return change;
1112 // Calculate a range for NAME from the operand 1 position of STMT
1113 // assuming the result of the statement is LHS. Return the range in
1114 // R, or false if no range could be calculated.
1116 bool
1117 gori_compute::compute_operand1_range (vrange &r,
1118 gimple_range_op_handler &handler,
1119 const vrange &lhs,
1120 fur_source &src, value_relation *rel)
1122 gimple *stmt = handler.stmt ();
1123 tree op1 = handler.operand1 ();
1124 tree op2 = handler.operand2 ();
1125 tree lhs_name = gimple_get_lhs (stmt);
1127 relation_trio trio;
1128 if (rel)
1129 trio = rel->create_trio (lhs_name, op1, op2);
1131 Value_Range op1_range (TREE_TYPE (op1));
1132 Value_Range op2_range (op2 ? TREE_TYPE (op2) : TREE_TYPE (op1));
1134 // Fetch the known range for op1 in this block.
1135 src.get_operand (op1_range, op1);
1137 // Now range-op calculate and put that result in r.
1138 if (op2)
1140 src.get_operand (op2_range, op2);
1142 relation_kind op_op = trio.op1_op2 ();
1143 if (op_op != VREL_VARYING)
1144 refine_using_relation (op1, op1_range, op2, op2_range, src, op_op);
1146 // If op1 == op2, create a new trio for just this call.
1147 if (op1 == op2 && gimple_range_ssa_p (op1))
1149 relation_kind k = get_identity_relation (op1, op1_range);
1150 trio = relation_trio (trio.lhs_op1 (), trio.lhs_op2 (), k);
1152 if (!handler.calc_op1 (r, lhs, op2_range, trio))
1153 return false;
1155 else
1157 // We pass op1_range to the unary operation. Normally it's a
1158 // hidden range_for_type parameter, but sometimes having the
1159 // actual range can result in better information.
1160 if (!handler.calc_op1 (r, lhs, op1_range, trio))
1161 return false;
1164 unsigned idx;
1165 if ((idx = tracer.header ("compute op 1 (")))
1167 print_generic_expr (dump_file, op1, TDF_SLIM);
1168 fprintf (dump_file, ") at ");
1169 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
1170 tracer.print (idx, "LHS =");
1171 lhs.dump (dump_file);
1172 if (op2 && TREE_CODE (op2) == SSA_NAME)
1174 fprintf (dump_file, ", ");
1175 print_generic_expr (dump_file, op2, TDF_SLIM);
1176 fprintf (dump_file, " = ");
1177 op2_range.dump (dump_file);
1179 fprintf (dump_file, "\n");
1180 tracer.print (idx, "Computes ");
1181 print_generic_expr (dump_file, op1, TDF_SLIM);
1182 fprintf (dump_file, " = ");
1183 r.dump (dump_file);
1184 fprintf (dump_file, " intersect Known range : ");
1185 op1_range.dump (dump_file);
1186 fputc ('\n', dump_file);
1189 r.intersect (op1_range);
1190 if (idx)
1191 tracer.trailer (idx, "produces ", true, op1, r);
1192 return true;
1196 // Calculate a range for NAME from the operand 2 position of S
1197 // assuming the result of the statement is LHS. Return the range in
1198 // R, or false if no range could be calculated.
1200 bool
1201 gori_compute::compute_operand2_range (vrange &r,
1202 gimple_range_op_handler &handler,
1203 const vrange &lhs,
1204 fur_source &src, value_relation *rel)
1206 gimple *stmt = handler.stmt ();
1207 tree op1 = handler.operand1 ();
1208 tree op2 = handler.operand2 ();
1209 tree lhs_name = gimple_get_lhs (stmt);
1211 Value_Range op1_range (TREE_TYPE (op1));
1212 Value_Range op2_range (TREE_TYPE (op2));
1214 src.get_operand (op1_range, op1);
1215 src.get_operand (op2_range, op2);
1217 relation_trio trio;
1218 if (rel)
1219 trio = rel->create_trio (lhs_name, op1, op2);
1220 relation_kind op_op = trio.op1_op2 ();
1222 if (op_op != VREL_VARYING)
1223 refine_using_relation (op1, op1_range, op2, op2_range, src, op_op);
1225 // If op1 == op2, create a new trio for this stmt.
1226 if (op1 == op2 && gimple_range_ssa_p (op1))
1228 relation_kind k = get_identity_relation (op1, op1_range);
1229 trio = relation_trio (trio.lhs_op1 (), trio.lhs_op2 (), k);
1231 // Intersect with range for op2 based on lhs and op1.
1232 if (!handler.calc_op2 (r, lhs, op1_range, trio))
1233 return false;
1235 unsigned idx;
1236 if ((idx = tracer.header ("compute op 2 (")))
1238 print_generic_expr (dump_file, op2, TDF_SLIM);
1239 fprintf (dump_file, ") at ");
1240 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
1241 tracer.print (idx, "LHS = ");
1242 lhs.dump (dump_file);
1243 if (TREE_CODE (op1) == SSA_NAME)
1245 fprintf (dump_file, ", ");
1246 print_generic_expr (dump_file, op1, TDF_SLIM);
1247 fprintf (dump_file, " = ");
1248 op1_range.dump (dump_file);
1250 fprintf (dump_file, "\n");
1251 tracer.print (idx, "Computes ");
1252 print_generic_expr (dump_file, op2, TDF_SLIM);
1253 fprintf (dump_file, " = ");
1254 r.dump (dump_file);
1255 fprintf (dump_file, " intersect Known range : ");
1256 op2_range.dump (dump_file);
1257 fputc ('\n', dump_file);
1259 // Intersect the calculated result with the known result and return if done.
1260 r.intersect (op2_range);
1261 if (idx)
1262 tracer.trailer (idx, " produces ", true, op2, r);
1263 return true;
1266 // Calculate a range for NAME from both operand positions of S
1267 // assuming the result of the statement is LHS. Return the range in
1268 // R, or false if no range could be calculated.
1270 bool
1271 gori_compute::compute_operand1_and_operand2_range (vrange &r,
1272 gimple_range_op_handler
1273 &handler,
1274 const vrange &lhs,
1275 tree name,
1276 fur_source &src,
1277 value_relation *rel)
1279 Value_Range op_range (TREE_TYPE (name));
1281 Value_Range vr (TREE_TYPE (handler.operand2 ()));
1282 // Calculate a good a range through op2.
1283 if (!compute_operand2_range (vr, handler, lhs, src, rel))
1284 return false;
1285 gimple *src_stmt = SSA_NAME_DEF_STMT (handler.operand2 ());
1286 gcc_checking_assert (src_stmt);
1287 // Then feed this range back as the LHS of the defining statement.
1288 if (!compute_operand_range (r, src_stmt, vr, name, src, rel))
1289 return false;
1291 // Now get the range thru op1.
1292 vr.set_type (TREE_TYPE (handler.operand1 ()));
1293 if (!compute_operand1_range (vr, handler, lhs, src, rel))
1294 return false;
1295 src_stmt = SSA_NAME_DEF_STMT (handler.operand1 ());
1296 gcc_checking_assert (src_stmt);
1297 // Then feed this range back as the LHS of the defining statement.
1298 if (!compute_operand_range (op_range, src_stmt, vr, name, src, rel))
1299 return false;
1301 // Both operands have to be simultaneously true, so perform an intersection.
1302 r.intersect (op_range);
1303 return true;
1306 // Return TRUE if NAME can be recomputed on any edge exiting BB. If any
1307 // direct dependent is exported, it may also change the computed value of NAME.
1309 bool
1310 gori_compute::may_recompute_p (tree name, basic_block bb, int depth)
1312 tree dep1 = depend1 (name);
1313 tree dep2 = depend2 (name);
1315 // If the first dependency is not set, there is no recomputation.
1316 // Dependencies reflect original IL, not current state. Check if the
1317 // SSA_NAME is still valid as well.
1318 if (!dep1)
1319 return false;
1321 // Don't recalculate PHIs or statements with side_effects.
1322 gimple *s = SSA_NAME_DEF_STMT (name);
1323 if (is_a<gphi *> (s) || gimple_has_side_effects (s))
1324 return false;
1326 if (!dep2)
1328 // -1 indicates a default param, convert it to the real default.
1329 if (depth == -1)
1331 depth = (int)param_ranger_recompute_depth;
1332 gcc_checking_assert (depth >= 1);
1335 bool res = (bb ? is_export_p (dep1, bb) : is_export_p (dep1));
1336 if (res || depth <= 1)
1337 return res;
1338 // Check another level of recomputation.
1339 return may_recompute_p (dep1, bb, --depth);
1341 // Two dependencies terminate the depth of the search.
1342 if (bb)
1343 return is_export_p (dep1, bb) || is_export_p (dep2, bb);
1344 else
1345 return is_export_p (dep1) || is_export_p (dep2);
1348 // Return TRUE if NAME can be recomputed on edge E. If any direct dependent
1349 // is exported on edge E, it may change the computed value of NAME.
1351 bool
1352 gori_compute::may_recompute_p (tree name, edge e, int depth)
1354 gcc_checking_assert (e);
1355 return may_recompute_p (name, e->src, depth);
1359 // Return TRUE if a range can be calculated or recomputed for NAME on any
1360 // edge exiting BB.
1362 bool
1363 gori_compute::has_edge_range_p (tree name, basic_block bb)
1365 // Check if NAME is an export or can be recomputed.
1366 if (bb)
1367 return is_export_p (name, bb) || may_recompute_p (name, bb);
1369 // If no block is specified, check for anywhere in the IL.
1370 return is_export_p (name) || may_recompute_p (name);
1373 // Return TRUE if a range can be calculated or recomputed for NAME on edge E.
1375 bool
1376 gori_compute::has_edge_range_p (tree name, edge e)
1378 gcc_checking_assert (e);
1379 return has_edge_range_p (name, e->src);
1382 // Calculate a range on edge E and return it in R. Try to evaluate a
1383 // range for NAME on this edge. Return FALSE if this is either not a
1384 // control edge or NAME is not defined by this edge.
1386 bool
1387 gori_compute::outgoing_edge_range_p (vrange &r, edge e, tree name,
1388 range_query &q)
1390 unsigned idx;
1392 if ((e->flags & m_not_executable_flag))
1394 r.set_undefined ();
1395 if (dump_file && (dump_flags & TDF_DETAILS))
1396 fprintf (dump_file, "Outgoing edge %d->%d unexecutable.\n",
1397 e->src->index, e->dest->index);
1398 return true;
1401 gcc_checking_assert (gimple_range_ssa_p (name));
1402 int_range_max lhs;
1403 // Determine if there is an outgoing edge.
1404 gimple *stmt = outgoing.edge_range_p (lhs, e);
1405 if (!stmt)
1406 return false;
1408 fur_stmt src (stmt, &q);
1409 // If NAME can be calculated on the edge, use that.
1410 if (is_export_p (name, e->src))
1412 bool res;
1413 if ((idx = tracer.header ("outgoing_edge")))
1415 fprintf (dump_file, " for ");
1416 print_generic_expr (dump_file, name, TDF_SLIM);
1417 fprintf (dump_file, " on edge %d->%d\n",
1418 e->src->index, e->dest->index);
1420 if ((res = compute_operand_range (r, stmt, lhs, name, src)))
1422 // Sometimes compatible types get interchanged. See PR97360.
1423 // Make sure we are returning the type of the thing we asked for.
1424 if (!r.undefined_p () && r.type () != TREE_TYPE (name))
1426 gcc_checking_assert (range_compatible_p (r.type (),
1427 TREE_TYPE (name)));
1428 range_cast (r, TREE_TYPE (name));
1431 if (idx)
1432 tracer.trailer (idx, "outgoing_edge", res, name, r);
1433 return res;
1435 // If NAME isn't exported, check if it can be recomputed.
1436 else if (may_recompute_p (name, e))
1438 gimple *def_stmt = SSA_NAME_DEF_STMT (name);
1440 if ((idx = tracer.header ("recomputation")))
1442 fprintf (dump_file, " attempt on edge %d->%d for ",
1443 e->src->index, e->dest->index);
1444 print_gimple_stmt (dump_file, def_stmt, 0, TDF_SLIM);
1446 // Simply calculate DEF_STMT on edge E using the range query Q.
1447 fold_range (r, def_stmt, e, &q);
1448 if (idx)
1449 tracer.trailer (idx, "recomputation", true, name, r);
1450 return true;
1452 return false;
1455 // Given COND ? OP1 : OP2 with ranges R1 for OP1 and R2 for OP2, Use gori
1456 // to further resolve R1 and R2 if there are any dependencies between
1457 // OP1 and COND or OP2 and COND. All values can are to be calculated using SRC
1458 // as the origination source location for operands..
1459 // Effectively, use COND an the edge condition and solve for OP1 on the true
1460 // edge and OP2 on the false edge.
1462 bool
1463 gori_compute::condexpr_adjust (vrange &r1, vrange &r2, gimple *, tree cond,
1464 tree op1, tree op2, fur_source &src)
1466 tree ssa1 = gimple_range_ssa_p (op1);
1467 tree ssa2 = gimple_range_ssa_p (op2);
1468 if (!ssa1 && !ssa2)
1469 return false;
1470 if (TREE_CODE (cond) != SSA_NAME)
1471 return false;
1472 gassign *cond_def = dyn_cast <gassign *> (SSA_NAME_DEF_STMT (cond));
1473 if (!cond_def
1474 || TREE_CODE_CLASS (gimple_assign_rhs_code (cond_def)) != tcc_comparison)
1475 return false;
1476 tree type = TREE_TYPE (gimple_assign_rhs1 (cond_def));
1477 if (!range_compatible_p (type, TREE_TYPE (gimple_assign_rhs2 (cond_def))))
1478 return false;
1479 range_op_handler hand (gimple_assign_rhs_code (cond_def));
1480 if (!hand)
1481 return false;
1483 tree c1 = gimple_range_ssa_p (gimple_assign_rhs1 (cond_def));
1484 tree c2 = gimple_range_ssa_p (gimple_assign_rhs2 (cond_def));
1486 // Only solve if there is one SSA name in the condition.
1487 if ((!c1 && !c2) || (c1 && c2))
1488 return false;
1490 // Pick up the current values of each part of the condition.
1491 tree rhs1 = gimple_assign_rhs1 (cond_def);
1492 tree rhs2 = gimple_assign_rhs2 (cond_def);
1493 Value_Range cl (TREE_TYPE (rhs1));
1494 Value_Range cr (TREE_TYPE (rhs2));
1495 src.get_operand (cl, rhs1);
1496 src.get_operand (cr, rhs2);
1498 tree cond_name = c1 ? c1 : c2;
1499 gimple *def_stmt = SSA_NAME_DEF_STMT (cond_name);
1501 // Evaluate the value of COND_NAME on the true and false edges, using either
1502 // the op1 or op2 routines based on its location.
1503 Value_Range cond_true (type), cond_false (type);
1504 if (c1)
1506 if (!hand.op1_range (cond_false, type, m_bool_zero, cr))
1507 return false;
1508 if (!hand.op1_range (cond_true, type, m_bool_one, cr))
1509 return false;
1510 cond_false.intersect (cl);
1511 cond_true.intersect (cl);
1513 else
1515 if (!hand.op2_range (cond_false, type, m_bool_zero, cl))
1516 return false;
1517 if (!hand.op2_range (cond_true, type, m_bool_one, cl))
1518 return false;
1519 cond_false.intersect (cr);
1520 cond_true.intersect (cr);
1523 unsigned idx;
1524 if ((idx = tracer.header ("cond_expr evaluation : ")))
1526 fprintf (dump_file, " range1 = ");
1527 r1.dump (dump_file);
1528 fprintf (dump_file, ", range2 = ");
1529 r1.dump (dump_file);
1530 fprintf (dump_file, "\n");
1533 // Now solve for SSA1 or SSA2 if they are in the dependency chain.
1534 if (ssa1 && in_chain_p (ssa1, cond_name))
1536 Value_Range tmp1 (TREE_TYPE (ssa1));
1537 if (compute_operand_range (tmp1, def_stmt, cond_true, ssa1, src))
1538 r1.intersect (tmp1);
1540 if (ssa2 && in_chain_p (ssa2, cond_name))
1542 Value_Range tmp2 (TREE_TYPE (ssa2));
1543 if (compute_operand_range (tmp2, def_stmt, cond_false, ssa2, src))
1544 r2.intersect (tmp2);
1546 if (idx)
1548 tracer.print (idx, "outgoing: range1 = ");
1549 r1.dump (dump_file);
1550 fprintf (dump_file, ", range2 = ");
1551 r1.dump (dump_file);
1552 fprintf (dump_file, "\n");
1553 tracer.trailer (idx, "cond_expr", true, cond_name, cond_true);
1555 return true;
1558 // Dump what is known to GORI computes to listing file F.
1560 void
1561 gori_compute::dump (FILE *f)
1563 gori_map::dump (f);
1566 // ------------------------------------------------------------------------
1567 // GORI iterator. Although we have bitmap iterators, don't expose that it
1568 // is currently a bitmap. Use an export iterator to hide future changes.
1570 // Construct a basic iterator over an export bitmap.
1572 gori_export_iterator::gori_export_iterator (bitmap b)
1574 bm = b;
1575 if (b)
1576 bmp_iter_set_init (&bi, b, 1, &y);
1580 // Move to the next export bitmap spot.
1582 void
1583 gori_export_iterator::next ()
1585 bmp_iter_next (&bi, &y);
1589 // Fetch the name of the next export in the export list. Return NULL if
1590 // iteration is done.
1592 tree
1593 gori_export_iterator::get_name ()
1595 if (!bm)
1596 return NULL_TREE;
1598 while (bmp_iter_set (&bi, &y))
1600 tree t = ssa_name (y);
1601 if (t)
1602 return t;
1603 next ();
1605 return NULL_TREE;