ada: Fix wrong finalization for call to BIP function in conditional expression
[official-gcc.git] / gcc / gimple-predicate-analysis.cc
blob7f20f81ad863e087c905bca756ce455cc1efef9a
1 /* Support for simple predicate analysis.
3 Copyright (C) 2001-2023 Free Software Foundation, Inc.
4 Contributed by Xinliang David Li <davidxl@google.com>
5 Generalized by Martin Sebor <msebor@redhat.com>
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3, or (at your option)
12 any later version.
14 GCC is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3. If not see
21 <http://www.gnu.org/licenses/>. */
23 #define INCLUDE_STRING
24 #include "config.h"
25 #include "system.h"
26 #include "coretypes.h"
27 #include "backend.h"
28 #include "tree.h"
29 #include "gimple.h"
30 #include "tree-pass.h"
31 #include "ssa.h"
32 #include "gimple-pretty-print.h"
33 #include "diagnostic-core.h"
34 #include "fold-const.h"
35 #include "gimple-iterator.h"
36 #include "tree-ssa.h"
37 #include "tree-cfg.h"
38 #include "cfghooks.h"
39 #include "attribs.h"
40 #include "builtins.h"
41 #include "calls.h"
42 #include "value-query.h"
43 #include "cfganal.h"
44 #include "tree-eh.h"
45 #include "gimple-fold.h"
47 #include "gimple-predicate-analysis.h"
49 #define DEBUG_PREDICATE_ANALYZER 1
51 /* In our predicate normal form we have MAX_NUM_CHAINS or predicates
52 and in those MAX_CHAIN_LEN (inverted) and predicates. */
53 #define MAX_NUM_CHAINS 8
54 #define MAX_CHAIN_LEN 5
56 /* Return true if X1 is the negation of X2. */
58 static inline bool
59 pred_neg_p (const pred_info &x1, const pred_info &x2)
61 if (!operand_equal_p (x1.pred_lhs, x2.pred_lhs, 0)
62 || !operand_equal_p (x1.pred_rhs, x2.pred_rhs, 0))
63 return false;
65 tree_code c1 = x1.cond_code, c2;
66 if (x1.invert == x2.invert)
67 c2 = invert_tree_comparison (x2.cond_code, false);
68 else
69 c2 = x2.cond_code;
71 return c1 == c2;
74 /* Return whether the condition (VAL CMPC BOUNDARY) is true. */
76 static bool
77 is_value_included_in (tree val, tree boundary, tree_code cmpc)
79 /* Only handle integer constant here. */
80 if (TREE_CODE (val) != INTEGER_CST || TREE_CODE (boundary) != INTEGER_CST)
81 return true;
83 bool inverted = false;
84 if (cmpc == GE_EXPR || cmpc == GT_EXPR || cmpc == NE_EXPR)
86 cmpc = invert_tree_comparison (cmpc, false);
87 inverted = true;
90 bool result;
91 if (cmpc == EQ_EXPR)
92 result = tree_int_cst_equal (val, boundary);
93 else if (cmpc == LT_EXPR)
94 result = tree_int_cst_lt (val, boundary);
95 else
97 gcc_assert (cmpc == LE_EXPR);
98 result = tree_int_cst_le (val, boundary);
101 if (inverted)
102 result ^= 1;
104 return result;
107 /* Format the vector of edges EV as a string. */
109 static std::string
110 format_edge_vec (const vec<edge> &ev)
112 std::string str;
114 unsigned n = ev.length ();
115 for (unsigned i = 0; i < n; ++i)
117 char es[32];
118 const_edge e = ev[i];
119 sprintf (es, "%u -> %u", e->src->index, e->dest->index);
120 str += es;
121 if (i + 1 < n)
122 str += ", ";
124 return str;
127 /* Format the first N elements of the array of vector of edges EVA as
128 a string. */
130 static std::string
131 format_edge_vecs (const vec<edge> eva[], unsigned n)
133 std::string str;
135 for (unsigned i = 0; i != n; ++i)
137 str += '{';
138 str += format_edge_vec (eva[i]);
139 str += '}';
140 if (i + 1 < n)
141 str += ", ";
143 return str;
146 /* Dump a single pred_info to F. */
148 static void
149 dump_pred_info (FILE *f, const pred_info &pred)
151 if (pred.invert)
152 fprintf (f, "NOT (");
153 print_generic_expr (f, pred.pred_lhs);
154 fprintf (f, " %s ", op_symbol_code (pred.cond_code));
155 print_generic_expr (f, pred.pred_rhs);
156 if (pred.invert)
157 fputc (')', f);
160 /* Dump a pred_chain to F. */
162 static void
163 dump_pred_chain (FILE *f, const pred_chain &chain)
165 unsigned np = chain.length ();
166 for (unsigned j = 0; j < np; j++)
168 if (j > 0)
169 fprintf (f, " AND (");
170 else
171 fputc ('(', f);
172 dump_pred_info (f, chain[j]);
173 fputc (')', f);
177 /* Return the 'normalized' conditional code with operand swapping
178 and condition inversion controlled by SWAP_COND and INVERT. */
180 static tree_code
181 get_cmp_code (tree_code orig_cmp_code, bool swap_cond, bool invert)
183 tree_code tc = orig_cmp_code;
185 if (swap_cond)
186 tc = swap_tree_comparison (orig_cmp_code);
187 if (invert)
188 tc = invert_tree_comparison (tc, false);
190 switch (tc)
192 case LT_EXPR:
193 case LE_EXPR:
194 case GT_EXPR:
195 case GE_EXPR:
196 case EQ_EXPR:
197 case NE_EXPR:
198 break;
199 default:
200 return ERROR_MARK;
202 return tc;
205 /* Return true if PRED is common among all predicate chains in PREDS
206 (and therefore can be factored out). */
208 static bool
209 find_matching_predicate_in_rest_chains (const pred_info &pred,
210 const pred_chain_union &preds)
212 /* Trival case. */
213 if (preds.length () == 1)
214 return true;
216 for (unsigned i = 1; i < preds.length (); i++)
218 bool found = false;
219 const pred_chain &chain = preds[i];
220 unsigned n = chain.length ();
221 for (unsigned j = 0; j < n; j++)
223 const pred_info &pred2 = chain[j];
224 /* Can relax the condition comparison to not use address
225 comparison. However, the most common case is that
226 multiple control dependent paths share a common path
227 prefix, so address comparison should be ok. */
228 if (operand_equal_p (pred2.pred_lhs, pred.pred_lhs, 0)
229 && operand_equal_p (pred2.pred_rhs, pred.pred_rhs, 0)
230 && pred2.invert == pred.invert)
232 found = true;
233 break;
236 if (!found)
237 return false;
239 return true;
242 /* Find a predicate to examine against paths of interest. If there
243 is no predicate of the "FLAG_VAR CMP CONST" form, try to find one
244 of that's the form "FLAG_VAR CMP FLAG_VAR" with value range info.
245 PHI is the phi node whose incoming (interesting) paths need to be
246 examined. On success, return the comparison code, set defintion
247 gimple of FLAG_DEF and BOUNDARY_CST. Otherwise return ERROR_MARK. */
249 static tree_code
250 find_var_cmp_const (pred_chain_union preds, gphi *phi, gimple **flag_def,
251 tree *boundary_cst)
253 tree_code vrinfo_code = ERROR_MARK;
254 gimple *vrinfo_def = NULL;
255 tree vrinfo_cst = NULL;
257 gcc_assert (preds.length () > 0);
258 pred_chain chain = preds[0];
259 for (unsigned i = 0; i < chain.length (); i++)
261 bool use_vrinfo_p = false;
262 const pred_info &pred = chain[i];
263 tree cond_lhs = pred.pred_lhs;
264 tree cond_rhs = pred.pred_rhs;
265 if (cond_lhs == NULL_TREE || cond_rhs == NULL_TREE)
266 continue;
268 tree_code code = get_cmp_code (pred.cond_code, false, pred.invert);
269 if (code == ERROR_MARK)
270 continue;
272 /* Convert to the canonical form SSA_NAME CMP CONSTANT. */
273 if (TREE_CODE (cond_lhs) == SSA_NAME
274 && is_gimple_constant (cond_rhs))
276 else if (TREE_CODE (cond_rhs) == SSA_NAME
277 && is_gimple_constant (cond_lhs))
279 std::swap (cond_lhs, cond_rhs);
280 if ((code = get_cmp_code (code, true, false)) == ERROR_MARK)
281 continue;
283 /* Check if we can take advantage of FLAG_VAR COMP FLAG_VAR predicate
284 with value range info. Note only first of such case is handled. */
285 else if (vrinfo_code == ERROR_MARK
286 && TREE_CODE (cond_lhs) == SSA_NAME
287 && TREE_CODE (cond_rhs) == SSA_NAME)
289 gimple* lhs_def = SSA_NAME_DEF_STMT (cond_lhs);
290 if (!lhs_def || gimple_code (lhs_def) != GIMPLE_PHI
291 || gimple_bb (lhs_def) != gimple_bb (phi))
293 std::swap (cond_lhs, cond_rhs);
294 if ((code = get_cmp_code (code, true, false)) == ERROR_MARK)
295 continue;
298 /* Check value range info of rhs, do following transforms:
299 flag_var < [min, max] -> flag_var < max
300 flag_var > [min, max] -> flag_var > min
302 We can also transform LE_EXPR/GE_EXPR to LT_EXPR/GT_EXPR:
303 flag_var <= [min, max] -> flag_var < [min, max+1]
304 flag_var >= [min, max] -> flag_var > [min-1, max]
305 if no overflow/wrap. */
306 tree type = TREE_TYPE (cond_lhs);
307 value_range r;
308 if (!INTEGRAL_TYPE_P (type)
309 || !get_range_query (cfun)->range_of_expr (r, cond_rhs)
310 || r.undefined_p ()
311 || r.varying_p ())
312 continue;
314 wide_int min = r.lower_bound ();
315 wide_int max = r.upper_bound ();
316 if (code == LE_EXPR
317 && max != wi::max_value (TYPE_PRECISION (type), TYPE_SIGN (type)))
319 code = LT_EXPR;
320 max = max + 1;
322 if (code == GE_EXPR
323 && min != wi::min_value (TYPE_PRECISION (type), TYPE_SIGN (type)))
325 code = GT_EXPR;
326 min = min - 1;
328 if (code == LT_EXPR)
329 cond_rhs = wide_int_to_tree (type, max);
330 else if (code == GT_EXPR)
331 cond_rhs = wide_int_to_tree (type, min);
332 else
333 continue;
335 use_vrinfo_p = true;
337 else
338 continue;
340 if ((*flag_def = SSA_NAME_DEF_STMT (cond_lhs)) == NULL)
341 continue;
343 if (gimple_code (*flag_def) != GIMPLE_PHI
344 || gimple_bb (*flag_def) != gimple_bb (phi)
345 || !find_matching_predicate_in_rest_chains (pred, preds))
346 continue;
348 /* Return if any "flag_var comp const" predicate is found. */
349 if (!use_vrinfo_p)
351 *boundary_cst = cond_rhs;
352 return code;
354 /* Record if any "flag_var comp flag_var[vinfo]" predicate is found. */
355 else if (vrinfo_code == ERROR_MARK)
357 vrinfo_code = code;
358 vrinfo_def = *flag_def;
359 vrinfo_cst = cond_rhs;
362 /* Return the "flag_var cmp flag_var[vinfo]" predicate we found. */
363 if (vrinfo_code != ERROR_MARK)
365 *flag_def = vrinfo_def;
366 *boundary_cst = vrinfo_cst;
368 return vrinfo_code;
371 /* Return true if all interesting opnds are pruned, false otherwise.
372 PHI is the phi node with interesting operands, OPNDS is the bitmap
373 of the interesting operand positions, FLAG_DEF is the statement
374 defining the flag guarding the use of the PHI output, BOUNDARY_CST
375 is the const value used in the predicate associated with the flag,
376 CMP_CODE is the comparison code used in the predicate, VISITED_PHIS
377 is the pointer set of phis visited, and VISITED_FLAG_PHIS is
378 the pointer to the pointer set of flag definitions that are also
379 phis.
381 Example scenario:
383 BB1:
384 flag_1 = phi <0, 1> // (1)
385 var_1 = phi <undef, some_val>
388 BB2:
389 flag_2 = phi <0, flag_1, flag_1> // (2)
390 var_2 = phi <undef, var_1, var_1>
391 if (flag_2 == 1)
392 goto BB3;
394 BB3:
395 use of var_2 // (3)
397 Because some flag arg in (1) is not constant, if we do not look into
398 the flag phis recursively, it is conservatively treated as unknown and
399 var_1 is thought to flow into use at (3). Since var_1 is potentially
400 uninitialized a false warning will be emitted.
401 Checking recursively into (1), the compiler can find out that only
402 some_val (which is defined) can flow into (3) which is OK. */
404 bool
405 uninit_analysis::prune_phi_opnds (gphi *phi, unsigned opnds, gphi *flag_def,
406 tree boundary_cst, tree_code cmp_code,
407 hash_set<gphi *> *visited_phis,
408 bitmap *visited_flag_phis)
410 /* The Boolean predicate guarding the PHI definition. Initialized
411 lazily from PHI in the first call to is_use_guarded() and cached
412 for subsequent iterations. */
413 uninit_analysis def_preds (m_eval);
415 unsigned n = MIN (m_eval.max_phi_args, gimple_phi_num_args (flag_def));
416 for (unsigned i = 0; i < n; i++)
418 if (!MASK_TEST_BIT (opnds, i))
419 continue;
421 tree flag_arg = gimple_phi_arg_def (flag_def, i);
422 if (!is_gimple_constant (flag_arg))
424 if (TREE_CODE (flag_arg) != SSA_NAME)
425 return false;
427 gphi *flag_arg_def = dyn_cast<gphi *> (SSA_NAME_DEF_STMT (flag_arg));
428 if (!flag_arg_def)
429 return false;
431 tree phi_arg = gimple_phi_arg_def (phi, i);
432 if (TREE_CODE (phi_arg) != SSA_NAME)
433 return false;
435 gphi *phi_arg_def = dyn_cast<gphi *> (SSA_NAME_DEF_STMT (phi_arg));
436 if (!phi_arg_def)
437 return false;
439 if (gimple_bb (phi_arg_def) != gimple_bb (flag_arg_def))
440 return false;
442 if (!*visited_flag_phis)
443 *visited_flag_phis = BITMAP_ALLOC (NULL);
445 tree phi_result = gimple_phi_result (flag_arg_def);
446 if (bitmap_bit_p (*visited_flag_phis, SSA_NAME_VERSION (phi_result)))
447 return false;
449 bitmap_set_bit (*visited_flag_phis, SSA_NAME_VERSION (phi_result));
451 /* Now recursively try to prune the interesting phi args. */
452 unsigned opnds_arg_phi = m_eval.phi_arg_set (phi_arg_def);
453 if (!prune_phi_opnds (phi_arg_def, opnds_arg_phi, flag_arg_def,
454 boundary_cst, cmp_code, visited_phis,
455 visited_flag_phis))
456 return false;
458 bitmap_clear_bit (*visited_flag_phis, SSA_NAME_VERSION (phi_result));
459 continue;
462 /* Now check if the constant is in the guarded range. */
463 if (is_value_included_in (flag_arg, boundary_cst, cmp_code))
465 /* Now that we know that this undefined edge is not pruned.
466 If the operand is defined by another phi, we can further
467 prune the incoming edges of that phi by checking
468 the predicates of this operands. */
470 tree opnd = gimple_phi_arg_def (phi, i);
471 gimple *opnd_def = SSA_NAME_DEF_STMT (opnd);
472 if (gphi *opnd_def_phi = dyn_cast <gphi *> (opnd_def))
474 unsigned opnds2 = m_eval.phi_arg_set (opnd_def_phi);
475 if (!MASK_EMPTY (opnds2))
477 edge opnd_edge = gimple_phi_arg_edge (phi, i);
478 if (def_preds.is_use_guarded (phi, opnd_edge->src,
479 opnd_def_phi, opnds2,
480 visited_phis))
481 return false;
484 else
485 return false;
489 return true;
492 /* Recursively compute the set PHI's incoming edges with "uninteresting"
493 operands of a phi chain, i.e., those for which EVAL returns false.
494 CD_ROOT is the control dependence root from which edges are collected
495 up the CFG nodes that it's dominated by. *EDGES holds the result, and
496 VISITED is used for detecting cycles. */
498 void
499 uninit_analysis::collect_phi_def_edges (gphi *phi, basic_block cd_root,
500 vec<edge> *edges,
501 hash_set<gimple *> *visited)
503 if (visited->elements () == 0
504 && DEBUG_PREDICATE_ANALYZER
505 && dump_file)
507 fprintf (dump_file, "%s for cd_root %u and ",
508 __func__, cd_root->index);
509 print_gimple_stmt (dump_file, phi, 0);
513 if (visited->add (phi))
514 return;
516 unsigned n = gimple_phi_num_args (phi);
517 unsigned opnds_arg_phi = m_eval.phi_arg_set (phi);
518 for (unsigned i = 0; i < n; i++)
520 if (!MASK_TEST_BIT (opnds_arg_phi, i))
522 /* Add the edge for a not maybe-undefined edge value. */
523 edge opnd_edge = gimple_phi_arg_edge (phi, i);
524 if (dump_file && (dump_flags & TDF_DETAILS))
526 fprintf (dump_file,
527 "\tFound def edge %i -> %i for cd_root %i "
528 "and operand %u of: ",
529 opnd_edge->src->index, opnd_edge->dest->index,
530 cd_root->index, i);
531 print_gimple_stmt (dump_file, phi, 0);
533 edges->safe_push (opnd_edge);
534 continue;
536 else
538 tree opnd = gimple_phi_arg_def (phi, i);
539 if (TREE_CODE (opnd) == SSA_NAME)
541 gimple *def = SSA_NAME_DEF_STMT (opnd);
542 if (gimple_code (def) == GIMPLE_PHI
543 && dominated_by_p (CDI_DOMINATORS, gimple_bb (def), cd_root))
544 /* Process PHI defs of maybe-undefined edge values
545 recursively. */
546 collect_phi_def_edges (as_a<gphi *> (def), cd_root, edges,
547 visited);
553 /* Return a bitset of all PHI arguments or zero if there are too many. */
555 unsigned
556 uninit_analysis::func_t::phi_arg_set (gphi *phi)
558 unsigned n = gimple_phi_num_args (phi);
560 if (max_phi_args < n)
561 return 0;
563 /* Set the least significant N bits. */
564 return (1U << n) - 1;
567 /* Determine if the predicate set of the use does not overlap with that
568 of the interesting paths. The most common senario of guarded use is
569 in Example 1:
570 Example 1:
571 if (some_cond)
573 x = ...; // set x to valid
574 flag = true;
577 ... some code ...
579 if (flag)
580 use (x); // use when x is valid
582 The real world examples are usually more complicated, but similar
583 and usually result from inlining:
585 bool init_func (int * x)
587 if (some_cond)
588 return false;
589 *x = ...; // set *x to valid
590 return true;
593 void foo (..)
595 int x;
597 if (!init_func (&x))
598 return;
600 .. some_code ...
601 use (x); // use when x is valid
604 Another possible use scenario is in the following trivial example:
606 Example 2:
607 if (n > 0)
608 x = 1;
610 if (n > 0)
612 if (m < 2)
613 ... = x;
616 Predicate analysis needs to compute the composite predicate:
618 1) 'x' use predicate: (n > 0) .AND. (m < 2)
619 2) 'x' default value (non-def) predicate: .NOT. (n > 0)
620 (the predicate chain for phi operand defs can be computed
621 starting from a bb that is control equivalent to the phi's
622 bb and is dominating the operand def.)
624 and check overlapping:
625 (n > 0) .AND. (m < 2) .AND. (.NOT. (n > 0))
626 <==> false
628 This implementation provides a framework that can handle different
629 scenarios. (Note that many simple cases are handled properly without
630 the predicate analysis if jump threading eliminates the merge point
631 thus makes path-sensitive analysis unnecessary.)
633 PHI is the phi node whose incoming (undefined) paths need to be
634 pruned, and OPNDS is the bitmap holding interesting operand
635 positions. VISITED is the pointer set of phi stmts being
636 checked. */
638 bool
639 uninit_analysis::overlap (gphi *phi, unsigned opnds, hash_set<gphi *> *visited,
640 const predicate &use_preds)
642 gimple *flag_def = NULL;
643 tree boundary_cst = NULL_TREE;
644 bitmap visited_flag_phis = NULL;
646 /* Find within the common prefix of multiple predicate chains
647 a predicate that is a comparison of a flag variable against
648 a constant. */
649 tree_code cmp_code = find_var_cmp_const (use_preds.chain (), phi, &flag_def,
650 &boundary_cst);
651 if (cmp_code == ERROR_MARK)
652 return true;
654 /* Now check all the uninit incoming edges have a constant flag
655 value that is in conflict with the use guard/predicate. */
656 gphi *phi_def = as_a<gphi *> (flag_def);
657 bool all_pruned = prune_phi_opnds (phi, opnds, phi_def, boundary_cst,
658 cmp_code, visited,
659 &visited_flag_phis);
661 if (visited_flag_phis)
662 BITMAP_FREE (visited_flag_phis);
664 return !all_pruned;
667 /* Return true if two predicates PRED1 and X2 are equivalent. Assume
668 the expressions have already properly re-associated. */
670 static inline bool
671 pred_equal_p (const pred_info &pred1, const pred_info &pred2)
673 if (!operand_equal_p (pred1.pred_lhs, pred2.pred_lhs, 0)
674 || !operand_equal_p (pred1.pred_rhs, pred2.pred_rhs, 0))
675 return false;
677 tree_code c1 = pred1.cond_code, c2;
678 if (pred1.invert != pred2.invert
679 && TREE_CODE_CLASS (pred2.cond_code) == tcc_comparison)
680 c2 = invert_tree_comparison (pred2.cond_code, false);
681 else
682 c2 = pred2.cond_code;
684 return c1 == c2;
687 /* Return true if PRED tests inequality (i.e., X != Y). */
689 static inline bool
690 is_neq_relop_p (const pred_info &pred)
693 return ((pred.cond_code == NE_EXPR && !pred.invert)
694 || (pred.cond_code == EQ_EXPR && pred.invert));
697 /* Returns true if PRED is of the form X != 0. */
699 static inline bool
700 is_neq_zero_form_p (const pred_info &pred)
702 if (!is_neq_relop_p (pred) || !integer_zerop (pred.pred_rhs)
703 || TREE_CODE (pred.pred_lhs) != SSA_NAME)
704 return false;
705 return true;
708 /* Return true if PRED is equivalent to X != 0. */
710 static inline bool
711 pred_expr_equal_p (const pred_info &pred, tree expr)
713 if (!is_neq_zero_form_p (pred))
714 return false;
716 return operand_equal_p (pred.pred_lhs, expr, 0);
719 /* Return true if VAL satisfies (x CMPC BOUNDARY) predicate. CMPC can
720 be either one of the range comparison codes ({GE,LT,EQ,NE}_EXPR and
721 the like), or BIT_AND_EXPR. EXACT_P is only meaningful for the latter.
722 Modify the question from VAL & BOUNDARY != 0 to VAL & BOUNDARY == VAL.
723 For other values of CMPC, EXACT_P is ignored. */
725 static bool
726 value_sat_pred_p (tree val, tree boundary, tree_code cmpc,
727 bool exact_p = false)
729 if (cmpc != BIT_AND_EXPR)
730 return is_value_included_in (val, boundary, cmpc);
732 widest_int andw = wi::to_widest (val) & wi::to_widest (boundary);
733 if (exact_p)
734 return andw == wi::to_widest (val);
736 return wi::ne_p (andw, 0);
739 /* Return true if the domain of single predicate expression PRED1
740 is a subset of that of PRED2, and false if it cannot be proved. */
742 static bool
743 subset_of (const pred_info &pred1, const pred_info &pred2)
745 if (pred_equal_p (pred1, pred2))
746 return true;
748 if ((TREE_CODE (pred1.pred_rhs) != INTEGER_CST)
749 || (TREE_CODE (pred2.pred_rhs) != INTEGER_CST))
750 return false;
752 if (!operand_equal_p (pred1.pred_lhs, pred2.pred_lhs, 0))
753 return false;
755 tree_code code1 = pred1.cond_code;
756 if (pred1.invert)
757 code1 = invert_tree_comparison (code1, false);
758 tree_code code2 = pred2.cond_code;
759 if (pred2.invert)
760 code2 = invert_tree_comparison (code2, false);
762 if (code2 == NE_EXPR && code1 == NE_EXPR)
763 return false;
765 if (code2 == NE_EXPR)
766 return !value_sat_pred_p (pred2.pred_rhs, pred1.pred_rhs, code1);
768 if (code1 == EQ_EXPR)
769 return value_sat_pred_p (pred1.pred_rhs, pred2.pred_rhs, code2);
771 if (code1 == code2)
772 return value_sat_pred_p (pred1.pred_rhs, pred2.pred_rhs, code2,
773 code1 == BIT_AND_EXPR);
775 return false;
778 /* Return true if the domain of CHAIN1 is a subset of that of CHAIN2.
779 Return false if it cannot be proven so. */
781 static bool
782 subset_of (const pred_chain &chain1, const pred_chain &chain2)
784 unsigned np1 = chain1.length ();
785 unsigned np2 = chain2.length ();
786 for (unsigned i2 = 0; i2 < np2; i2++)
788 bool found = false;
789 const pred_info &info2 = chain2[i2];
790 for (unsigned i1 = 0; i1 < np1; i1++)
792 const pred_info &info1 = chain1[i1];
793 if (subset_of (info1, info2))
795 found = true;
796 break;
799 if (!found)
800 return false;
802 return true;
805 /* Return true if the domain defined by the predicate chain PREDS is
806 a subset of the domain of *THIS. Return false if PREDS's domain
807 is not a subset of any of the sub-domains of *THIS (corresponding
808 to each individual chains in it), even though it may be still be
809 a subset of whole domain of *THIS which is the union (ORed) of all
810 its subdomains. In other words, the result is conservative. */
812 bool
813 predicate::includes (const pred_chain &chain) const
815 for (unsigned i = 0; i < m_preds.length (); i++)
816 if (subset_of (chain, m_preds[i]))
817 return true;
819 return false;
822 /* Return true if the domain defined by *THIS is a superset of PREDS's
823 domain.
824 Avoid building generic trees (and rely on the folding capability
825 of the compiler), and instead perform brute force comparison of
826 individual predicate chains (this won't be a computationally costly
827 since the chains are pretty short). Returning false does not
828 necessarily mean *THIS is not a superset of *PREDS, only that
829 it need not be since the analysis cannot prove it. */
831 bool
832 predicate::superset_of (const predicate &preds) const
834 for (unsigned i = 0; i < preds.m_preds.length (); i++)
835 if (!includes (preds.m_preds[i]))
836 return false;
838 return true;
841 /* Create a predicate of the form OP != 0 and push it the work list CHAIN. */
843 static void
844 push_to_worklist (tree op, pred_chain *chain, hash_set<tree> *mark_set)
846 if (mark_set->contains (op))
847 return;
848 mark_set->add (op);
850 pred_info arg_pred;
851 arg_pred.pred_lhs = op;
852 arg_pred.pred_rhs = integer_zero_node;
853 arg_pred.cond_code = NE_EXPR;
854 arg_pred.invert = false;
855 chain->safe_push (arg_pred);
858 /* Return a pred_info for a gimple assignment CMP_ASSIGN with comparison
859 rhs. */
861 static pred_info
862 get_pred_info_from_cmp (const gimple *cmp_assign)
864 pred_info pred;
865 pred.pred_lhs = gimple_assign_rhs1 (cmp_assign);
866 pred.pred_rhs = gimple_assign_rhs2 (cmp_assign);
867 pred.cond_code = gimple_assign_rhs_code (cmp_assign);
868 pred.invert = false;
869 return pred;
872 /* If PHI is a degenerate phi with all operands having the same value (relop)
873 update *PRED to that value and return true. Otherwise return false. */
875 static bool
876 is_degenerate_phi (gimple *phi, pred_info *pred)
878 tree op0 = gimple_phi_arg_def (phi, 0);
880 if (TREE_CODE (op0) != SSA_NAME)
881 return false;
883 gimple *def0 = SSA_NAME_DEF_STMT (op0);
884 if (gimple_code (def0) != GIMPLE_ASSIGN)
885 return false;
887 if (TREE_CODE_CLASS (gimple_assign_rhs_code (def0)) != tcc_comparison)
888 return false;
890 pred_info pred0 = get_pred_info_from_cmp (def0);
892 unsigned n = gimple_phi_num_args (phi);
893 for (unsigned i = 1; i < n; ++i)
895 tree op = gimple_phi_arg_def (phi, i);
896 if (TREE_CODE (op) != SSA_NAME)
897 return false;
899 gimple *def = SSA_NAME_DEF_STMT (op);
900 if (gimple_code (def) != GIMPLE_ASSIGN)
901 return false;
903 if (TREE_CODE_CLASS (gimple_assign_rhs_code (def)) != tcc_comparison)
904 return false;
906 pred_info pred = get_pred_info_from_cmp (def);
907 if (!pred_equal_p (pred, pred0))
908 return false;
911 *pred = pred0;
912 return true;
915 /* If compute_control_dep_chain bailed out due to limits this routine
916 tries to build a partial sparse path using dominators. Returns
917 path edges whose predicates are always true when reaching E. */
919 static void
920 simple_control_dep_chain (vec<edge>& chain, basic_block from, basic_block to)
922 if (!dominated_by_p (CDI_DOMINATORS, to, from))
923 return;
925 basic_block src = to;
926 while (src != from
927 && chain.length () <= MAX_CHAIN_LEN)
929 basic_block dest = src;
930 src = get_immediate_dominator (CDI_DOMINATORS, src);
931 if (single_pred_p (dest))
933 edge pred_e = single_pred_edge (dest);
934 gcc_assert (pred_e->src == src);
935 if (!(pred_e->flags & ((EDGE_FAKE | EDGE_ABNORMAL | EDGE_DFS_BACK)))
936 && !single_succ_p (src))
937 chain.safe_push (pred_e);
942 /* Perform a DFS walk on predecessor edges to mark the region denoted
943 by the EXIT_SRC block and DOM which dominates EXIT_SRC, including DOM.
944 Blocks in the region are marked with FLAG and added to BBS. BBS is
945 filled up to its capacity only after which the walk is terminated
946 and false is returned. If the whole region was marked, true is returned. */
948 static bool
949 dfs_mark_dominating_region (basic_block exit_src, basic_block dom, int flag,
950 vec<basic_block> &bbs)
952 if (exit_src == dom || exit_src->flags & flag)
953 return true;
954 if (!bbs.space (1))
955 return false;
956 bbs.quick_push (exit_src);
957 exit_src->flags |= flag;
958 auto_vec<edge_iterator, 20> stack (bbs.allocated () - bbs.length () + 1);
959 stack.quick_push (ei_start (exit_src->preds));
960 while (!stack.is_empty ())
962 /* Look at the edge on the top of the stack. */
963 edge_iterator ei = stack.last ();
964 basic_block src = ei_edge (ei)->src;
966 /* Check if the edge source has been visited yet. */
967 if (!(src->flags & flag))
969 /* Mark the source if there's still space. If not, return early. */
970 if (!bbs.space (1))
971 return false;
972 src->flags |= flag;
973 bbs.quick_push (src);
975 /* Queue its predecessors if we didn't reach DOM. */
976 if (src != dom && EDGE_COUNT (src->preds) > 0)
977 stack.quick_push (ei_start (src->preds));
979 else
981 if (!ei_one_before_end_p (ei))
982 ei_next (&stack.last ());
983 else
984 stack.pop ();
987 return true;
990 static bool
991 compute_control_dep_chain (basic_block dom_bb, const_basic_block dep_bb,
992 vec<edge> cd_chains[], unsigned *num_chains,
993 vec<edge> &cur_cd_chain, unsigned *num_calls,
994 unsigned in_region, unsigned depth,
995 bool *complete_p);
997 /* Helper for compute_control_dep_chain that walks the post-dominator
998 chain from CD_BB up unto TARGET_BB looking for paths to DEP_BB. */
1000 static bool
1001 compute_control_dep_chain_pdom (basic_block cd_bb, const_basic_block dep_bb,
1002 basic_block target_bb,
1003 vec<edge> cd_chains[], unsigned *num_chains,
1004 vec<edge> &cur_cd_chain, unsigned *num_calls,
1005 unsigned in_region, unsigned depth,
1006 bool *complete_p)
1008 bool found_cd_chain = false;
1009 while (cd_bb != target_bb)
1011 if (cd_bb == dep_bb)
1013 /* Found a direct control dependence. */
1014 if (*num_chains < MAX_NUM_CHAINS)
1016 if (DEBUG_PREDICATE_ANALYZER && dump_file)
1017 fprintf (dump_file, "%*s pushing { %s }\n",
1018 depth, "", format_edge_vec (cur_cd_chain).c_str ());
1019 cd_chains[*num_chains] = cur_cd_chain.copy ();
1020 (*num_chains)++;
1022 found_cd_chain = true;
1023 /* Check path from next edge. */
1024 break;
1027 /* If the dominating region has been marked avoid walking outside. */
1028 if (in_region != 0 && !(cd_bb->flags & in_region))
1029 break;
1031 /* Count the number of steps we perform to limit compile-time.
1032 This should cover both recursion and the post-dominator walk. */
1033 if (*num_calls > (unsigned)param_uninit_control_dep_attempts)
1035 if (dump_file)
1036 fprintf (dump_file, "param_uninit_control_dep_attempts "
1037 "exceeded: %u\n", *num_calls);
1038 *complete_p = false;
1039 break;
1041 ++*num_calls;
1043 /* Check if DEP_BB is indirectly control-dependent on DOM_BB. */
1044 if (!single_succ_p (cd_bb)
1045 && compute_control_dep_chain (cd_bb, dep_bb, cd_chains,
1046 num_chains, cur_cd_chain,
1047 num_calls, in_region, depth + 1,
1048 complete_p))
1050 found_cd_chain = true;
1051 break;
1054 /* The post-dominator walk will reach a backedge only
1055 from a forwarder, otherwise it should choose to exit
1056 the SCC. */
1057 if (single_succ_p (cd_bb)
1058 && single_succ_edge (cd_bb)->flags & EDGE_DFS_BACK)
1059 break;
1060 basic_block prev_cd_bb = cd_bb;
1061 cd_bb = get_immediate_dominator (CDI_POST_DOMINATORS, cd_bb);
1062 if (cd_bb == EXIT_BLOCK_PTR_FOR_FN (cfun))
1063 break;
1064 /* Pick up conditions toward the post dominator such like
1065 loop exit conditions. See gcc.dg/uninit-pred-11.c and
1066 gcc.dg/unninit-pred-12.c and PR106754. */
1067 if (single_pred_p (cd_bb))
1069 edge e2 = single_pred_edge (cd_bb);
1070 gcc_assert (e2->src == prev_cd_bb);
1071 /* But avoid adding fallthru or abnormal edges. */
1072 if (!(e2->flags & (EDGE_FAKE | EDGE_ABNORMAL | EDGE_DFS_BACK))
1073 && !single_succ_p (prev_cd_bb))
1074 cur_cd_chain.safe_push (e2);
1077 return found_cd_chain;
1081 /* Recursively compute the control dependence chains (paths of edges)
1082 from the dependent basic block, DEP_BB, up to the dominating basic
1083 block, DOM_BB (the head node of a chain should be dominated by it),
1084 storing them in the CD_CHAINS array.
1085 CUR_CD_CHAIN is the current chain being computed.
1086 *NUM_CHAINS is total number of chains in the CD_CHAINS array.
1087 *NUM_CALLS is the number of recursive calls to control unbounded
1088 recursion.
1089 Return true if the information is successfully computed, false if
1090 there is no control dependence or not computed.
1091 *COMPLETE_P is set to false if we stopped walking due to limits.
1092 In this case there might be missing chains. */
1094 static bool
1095 compute_control_dep_chain (basic_block dom_bb, const_basic_block dep_bb,
1096 vec<edge> cd_chains[], unsigned *num_chains,
1097 vec<edge> &cur_cd_chain, unsigned *num_calls,
1098 unsigned in_region, unsigned depth,
1099 bool *complete_p)
1101 /* In our recursive calls this doesn't happen. */
1102 if (single_succ_p (dom_bb))
1103 return false;
1105 /* FIXME: Use a set instead. */
1106 unsigned cur_chain_len = cur_cd_chain.length ();
1107 if (cur_chain_len > MAX_CHAIN_LEN)
1109 if (dump_file)
1110 fprintf (dump_file, "MAX_CHAIN_LEN exceeded: %u\n", cur_chain_len);
1112 *complete_p = false;
1113 return false;
1116 if (cur_chain_len > 5)
1118 if (dump_file)
1119 fprintf (dump_file, "chain length exceeds 5: %u\n", cur_chain_len);
1122 if (DEBUG_PREDICATE_ANALYZER && dump_file)
1123 fprintf (dump_file,
1124 "%*s%s (dom_bb = %u, dep_bb = %u, ..., "
1125 "cur_cd_chain = { %s }, ...)\n",
1126 depth, "", __func__, dom_bb->index, dep_bb->index,
1127 format_edge_vec (cur_cd_chain).c_str ());
1129 bool found_cd_chain = false;
1131 /* Iterate over DOM_BB's successors. */
1132 edge e;
1133 edge_iterator ei;
1134 FOR_EACH_EDGE (e, ei, dom_bb->succs)
1136 if (e->flags & (EDGE_FAKE | EDGE_ABNORMAL | EDGE_DFS_BACK))
1137 continue;
1139 basic_block cd_bb = e->dest;
1140 unsigned pop_mark = cur_cd_chain.length ();
1141 cur_cd_chain.safe_push (e);
1142 basic_block target_bb
1143 = get_immediate_dominator (CDI_POST_DOMINATORS, dom_bb);
1144 /* Walk the post-dominator chain up to the CFG merge. */
1145 found_cd_chain
1146 |= compute_control_dep_chain_pdom (cd_bb, dep_bb, target_bb,
1147 cd_chains, num_chains,
1148 cur_cd_chain, num_calls,
1149 in_region, depth, complete_p);
1150 cur_cd_chain.truncate (pop_mark);
1151 gcc_assert (cur_cd_chain.length () == cur_chain_len);
1154 gcc_assert (cur_cd_chain.length () == cur_chain_len);
1155 return found_cd_chain;
1158 /* Wrapper around the compute_control_dep_chain worker above. Returns
1159 true when the collected set of chains in CD_CHAINS is complete. */
1161 static bool
1162 compute_control_dep_chain (basic_block dom_bb, const_basic_block dep_bb,
1163 vec<edge> cd_chains[], unsigned *num_chains,
1164 unsigned in_region = 0)
1166 auto_vec<edge, MAX_CHAIN_LEN + 1> cur_cd_chain;
1167 unsigned num_calls = 0;
1168 unsigned depth = 0;
1169 bool complete_p = true;
1170 /* Walk the post-dominator chain. */
1171 compute_control_dep_chain_pdom (dom_bb, dep_bb, NULL, cd_chains,
1172 num_chains, cur_cd_chain, &num_calls,
1173 in_region, depth, &complete_p);
1174 return complete_p;
1177 /* Implemented simplifications:
1179 1a) ((x IOR y) != 0) AND (x != 0) is equivalent to (x != 0);
1180 1b) [!](X rel y) AND [!](X rel y') where y == y' or both constant
1181 can possibly be simplified
1182 2) (X AND Y) OR (!X AND Y) is equivalent to Y;
1183 3) X OR (!X AND Y) is equivalent to (X OR Y);
1184 4) ((x IAND y) != 0) || (x != 0 AND y != 0)) is equivalent to
1185 (x != 0 AND y != 0)
1186 5) (X AND Y) OR (!X AND Z) OR (!Y AND Z) is equivalent to
1187 (X AND Y) OR Z
1189 PREDS is the predicate chains, and N is the number of chains. */
1191 /* Implement rule 1a above. PREDS is the AND predicate to simplify
1192 in place. */
1194 static void
1195 simplify_1a (pred_chain &chain)
1197 bool simplified = false;
1198 pred_chain s_chain = vNULL;
1200 unsigned n = chain.length ();
1201 for (unsigned i = 0; i < n; i++)
1203 pred_info &a_pred = chain[i];
1205 if (!a_pred.pred_lhs
1206 || !is_neq_zero_form_p (a_pred))
1207 continue;
1209 gimple *def_stmt = SSA_NAME_DEF_STMT (a_pred.pred_lhs);
1210 if (gimple_code (def_stmt) != GIMPLE_ASSIGN)
1211 continue;
1213 if (gimple_assign_rhs_code (def_stmt) != BIT_IOR_EXPR)
1214 continue;
1216 for (unsigned j = 0; j < n; j++)
1218 const pred_info &b_pred = chain[j];
1220 if (!b_pred.pred_lhs
1221 || !is_neq_zero_form_p (b_pred))
1222 continue;
1224 if (pred_expr_equal_p (b_pred, gimple_assign_rhs1 (def_stmt))
1225 || pred_expr_equal_p (b_pred, gimple_assign_rhs2 (def_stmt)))
1227 /* Mark A_PRED for removal from PREDS. */
1228 a_pred.pred_lhs = NULL;
1229 a_pred.pred_rhs = NULL;
1230 simplified = true;
1231 break;
1236 if (!simplified)
1237 return;
1239 /* Remove predicates marked above. */
1240 for (unsigned i = 0; i < n; i++)
1242 pred_info &a_pred = chain[i];
1243 if (!a_pred.pred_lhs)
1244 continue;
1245 s_chain.safe_push (a_pred);
1248 chain.release ();
1249 chain = s_chain;
1252 /* Implement rule 1b above. PREDS is the AND predicate to simplify
1253 in place. Returns true if CHAIN simplifies to true or false. */
1255 static bool
1256 simplify_1b (pred_chain &chain)
1258 for (unsigned i = 0; i < chain.length (); i++)
1260 pred_info &a_pred = chain[i];
1262 for (unsigned j = i + 1; j < chain.length (); ++j)
1264 pred_info &b_pred = chain[j];
1266 if (!operand_equal_p (a_pred.pred_lhs, b_pred.pred_lhs)
1267 || (!operand_equal_p (a_pred.pred_rhs, b_pred.pred_rhs)
1268 && !(CONSTANT_CLASS_P (a_pred.pred_rhs)
1269 && CONSTANT_CLASS_P (b_pred.pred_rhs))))
1270 continue;
1272 tree_code a_code = a_pred.cond_code;
1273 if (a_pred.invert)
1274 a_code = invert_tree_comparison (a_code, false);
1275 tree_code b_code = b_pred.cond_code;
1276 if (b_pred.invert)
1277 b_code = invert_tree_comparison (b_code, false);
1278 /* Try to combine X a_code Y && X b_code Y'. */
1279 tree comb = maybe_fold_and_comparisons (boolean_type_node,
1280 a_code,
1281 a_pred.pred_lhs,
1282 a_pred.pred_rhs,
1283 b_code,
1284 b_pred.pred_lhs,
1285 b_pred.pred_rhs, NULL);
1286 if (!comb)
1288 else if (integer_zerop (comb))
1289 return true;
1290 else if (integer_truep (comb))
1292 chain.ordered_remove (j);
1293 chain.ordered_remove (i);
1294 if (chain.is_empty ())
1295 return true;
1296 i--;
1297 break;
1299 else if (COMPARISON_CLASS_P (comb)
1300 && operand_equal_p (a_pred.pred_lhs, TREE_OPERAND (comb, 0)))
1302 chain.ordered_remove (j);
1303 a_pred.cond_code = TREE_CODE (comb);
1304 a_pred.pred_rhs = TREE_OPERAND (comb, 1);
1305 a_pred.invert = false;
1306 j--;
1311 return false;
1314 /* Implements rule 2 for the OR predicate PREDS:
1316 2) (X AND Y) OR (!X AND Y) is equivalent to Y. */
1318 bool
1319 predicate::simplify_2 ()
1321 bool simplified = false;
1323 /* (X AND Y) OR (!X AND Y) is equivalent to Y.
1324 (X AND Y) OR (X AND !Y) is equivalent to X. */
1326 for (unsigned i = 0; i < m_preds.length (); i++)
1328 pred_chain &a_chain = m_preds[i];
1330 for (unsigned j = i + 1; j < m_preds.length (); j++)
1332 pred_chain &b_chain = m_preds[j];
1333 if (b_chain.length () != a_chain.length ())
1334 continue;
1336 unsigned neg_idx = -1U;
1337 for (unsigned k = 0; k < a_chain.length (); ++k)
1339 if (pred_equal_p (a_chain[k], b_chain[k]))
1340 continue;
1341 if (neg_idx != -1U)
1343 neg_idx = -1U;
1344 break;
1346 if (pred_neg_p (a_chain[k], b_chain[k]))
1347 neg_idx = k;
1348 else
1349 break;
1351 /* If we found equal chains with one negated predicate
1352 simplify. */
1353 if (neg_idx != -1U)
1355 a_chain.ordered_remove (neg_idx);
1356 m_preds.ordered_remove (j);
1357 simplified = true;
1358 if (a_chain.is_empty ())
1360 /* A && !A simplifies to true, wipe the whole predicate. */
1361 for (unsigned k = 0; k < m_preds.length (); ++k)
1362 m_preds[k].release ();
1363 m_preds.truncate (0);
1365 break;
1370 return simplified;
1373 /* Implement rule 3 for the OR predicate PREDS:
1375 3) x OR (!x AND y) is equivalent to x OR y. */
1377 bool
1378 predicate::simplify_3 ()
1380 /* Now iteratively simplify X OR (!X AND Z ..)
1381 into X OR (Z ...). */
1383 unsigned n = m_preds.length ();
1384 if (n < 2)
1385 return false;
1387 bool simplified = false;
1388 for (unsigned i = 0; i < n; i++)
1390 const pred_chain &a_chain = m_preds[i];
1392 if (a_chain.length () != 1)
1393 continue;
1395 const pred_info &x = a_chain[0];
1396 for (unsigned j = 0; j < n; j++)
1398 if (j == i)
1399 continue;
1401 pred_chain b_chain = m_preds[j];
1402 if (b_chain.length () < 2)
1403 continue;
1405 for (unsigned k = 0; k < b_chain.length (); k++)
1407 const pred_info &x2 = b_chain[k];
1408 if (pred_neg_p (x, x2))
1410 b_chain.unordered_remove (k);
1411 simplified = true;
1412 break;
1417 return simplified;
1420 /* Implement rule 4 for the OR predicate PREDS:
1422 2) ((x AND y) != 0) OR (x != 0 AND y != 0) is equivalent to
1423 (x != 0 AND y != 0). */
1425 bool
1426 predicate::simplify_4 ()
1428 bool simplified = false;
1429 pred_chain_union s_preds = vNULL;
1431 unsigned n = m_preds.length ();
1432 for (unsigned i = 0; i < n; i++)
1434 pred_chain a_chain = m_preds[i];
1435 if (a_chain.length () != 1)
1436 continue;
1438 const pred_info &z = a_chain[0];
1439 if (!is_neq_zero_form_p (z))
1440 continue;
1442 gimple *def_stmt = SSA_NAME_DEF_STMT (z.pred_lhs);
1443 if (gimple_code (def_stmt) != GIMPLE_ASSIGN)
1444 continue;
1446 if (gimple_assign_rhs_code (def_stmt) != BIT_AND_EXPR)
1447 continue;
1449 for (unsigned j = 0; j < n; j++)
1451 if (j == i)
1452 continue;
1454 pred_chain b_chain = m_preds[j];
1455 if (b_chain.length () != 2)
1456 continue;
1458 const pred_info &x2 = b_chain[0];
1459 const pred_info &y2 = b_chain[1];
1460 if (!is_neq_zero_form_p (x2) || !is_neq_zero_form_p (y2))
1461 continue;
1463 if ((pred_expr_equal_p (x2, gimple_assign_rhs1 (def_stmt))
1464 && pred_expr_equal_p (y2, gimple_assign_rhs2 (def_stmt)))
1465 || (pred_expr_equal_p (x2, gimple_assign_rhs2 (def_stmt))
1466 && pred_expr_equal_p (y2, gimple_assign_rhs1 (def_stmt))))
1468 /* Kill a_chain. */
1469 a_chain.release ();
1470 simplified = true;
1471 break;
1475 /* Now clean up the chain. */
1476 if (simplified)
1478 for (unsigned i = 0; i < n; i++)
1480 if (m_preds[i].is_empty ())
1481 continue;
1482 s_preds.safe_push (m_preds[i]);
1485 m_preds.release ();
1486 m_preds = s_preds;
1487 s_preds = vNULL;
1490 return simplified;
1493 /* Simplify predicates in *THIS. */
1495 void
1496 predicate::simplify (gimple *use_or_def, bool is_use)
1498 if (dump_file && dump_flags & TDF_DETAILS)
1500 fprintf (dump_file, "Before simplication ");
1501 dump (dump_file, use_or_def, is_use ? "[USE]:\n" : "[DEF]:\n");
1504 for (unsigned i = 0; i < m_preds.length (); i++)
1506 ::simplify_1a (m_preds[i]);
1507 if (::simplify_1b (m_preds[i]))
1509 m_preds[i].release ();
1510 m_preds.ordered_remove (i);
1511 i--;
1515 if (m_preds.length () < 2)
1516 return;
1518 bool changed;
1521 changed = false;
1522 if (simplify_2 ())
1523 changed = true;
1525 if (simplify_3 ())
1526 changed = true;
1528 if (simplify_4 ())
1529 changed = true;
1531 while (changed);
1534 /* Attempt to normalize predicate chains by following UD chains by
1535 building up a big tree of either IOR operations or AND operations,
1536 and converting the IOR tree into a pred_chain_union or the BIT_AND
1537 tree into a pred_chain.
1538 Example:
1540 _3 = _2 RELOP1 _1;
1541 _6 = _5 RELOP2 _4;
1542 _9 = _8 RELOP3 _7;
1543 _10 = _3 | _6;
1544 _12 = _9 | _0;
1545 _t = _10 | _12;
1547 then _t != 0 will be normalized into a pred_chain_union
1549 (_2 RELOP1 _1) OR (_5 RELOP2 _4) OR (_8 RELOP3 _7) OR (_0 != 0)
1551 Similarly given:
1553 _3 = _2 RELOP1 _1;
1554 _6 = _5 RELOP2 _4;
1555 _9 = _8 RELOP3 _7;
1556 _10 = _3 & _6;
1557 _12 = _9 & _0;
1559 then _t != 0 will be normalized into a pred_chain:
1560 (_2 RELOP1 _1) AND (_5 RELOP2 _4) AND (_8 RELOP3 _7) AND (_0 != 0)
1563 /* Normalize predicate PRED:
1564 1) if PRED can no longer be normalized, append it to *THIS.
1565 2) otherwise if PRED is of the form x != 0, follow x's definition
1566 and put normalized predicates into WORK_LIST. */
1568 void
1569 predicate::normalize (pred_chain *norm_chain,
1570 pred_info pred,
1571 tree_code and_or_code,
1572 pred_chain *work_list,
1573 hash_set<tree> *mark_set)
1575 if (!is_neq_zero_form_p (pred))
1577 if (and_or_code == BIT_IOR_EXPR)
1578 push_pred (pred);
1579 else
1580 norm_chain->safe_push (pred);
1581 return;
1584 gimple *def_stmt = SSA_NAME_DEF_STMT (pred.pred_lhs);
1586 if (gimple_code (def_stmt) == GIMPLE_PHI
1587 && is_degenerate_phi (def_stmt, &pred))
1588 /* PRED has been modified above. */
1589 work_list->safe_push (pred);
1590 else if (gimple_code (def_stmt) == GIMPLE_PHI && and_or_code == BIT_IOR_EXPR)
1592 unsigned n = gimple_phi_num_args (def_stmt);
1594 /* Punt for a nonzero constant. The predicate should be one guarding
1595 the phi edge. */
1596 for (unsigned i = 0; i < n; ++i)
1598 tree op = gimple_phi_arg_def (def_stmt, i);
1599 if (TREE_CODE (op) == INTEGER_CST && !integer_zerop (op))
1601 push_pred (pred);
1602 return;
1606 for (unsigned i = 0; i < n; ++i)
1608 tree op = gimple_phi_arg_def (def_stmt, i);
1609 if (integer_zerop (op))
1610 continue;
1612 push_to_worklist (op, work_list, mark_set);
1615 else if (gimple_code (def_stmt) != GIMPLE_ASSIGN)
1617 if (and_or_code == BIT_IOR_EXPR)
1618 push_pred (pred);
1619 else
1620 norm_chain->safe_push (pred);
1622 else if (gimple_assign_rhs_code (def_stmt) == and_or_code)
1624 /* Avoid splitting up bit manipulations like x & 3 or y | 1. */
1625 if (is_gimple_min_invariant (gimple_assign_rhs2 (def_stmt)))
1627 /* But treat x & 3 as a condition. */
1628 if (and_or_code == BIT_AND_EXPR)
1630 pred_info n_pred;
1631 n_pred.pred_lhs = gimple_assign_rhs1 (def_stmt);
1632 n_pred.pred_rhs = gimple_assign_rhs2 (def_stmt);
1633 n_pred.cond_code = and_or_code;
1634 n_pred.invert = false;
1635 norm_chain->safe_push (n_pred);
1638 else
1640 push_to_worklist (gimple_assign_rhs1 (def_stmt), work_list, mark_set);
1641 push_to_worklist (gimple_assign_rhs2 (def_stmt), work_list, mark_set);
1644 else if (TREE_CODE_CLASS (gimple_assign_rhs_code (def_stmt))
1645 == tcc_comparison)
1647 pred_info n_pred = get_pred_info_from_cmp (def_stmt);
1648 if (and_or_code == BIT_IOR_EXPR)
1649 push_pred (n_pred);
1650 else
1651 norm_chain->safe_push (n_pred);
1653 else
1655 if (and_or_code == BIT_IOR_EXPR)
1656 push_pred (pred);
1657 else
1658 norm_chain->safe_push (pred);
1662 /* Normalize PRED and store the normalized predicates in THIS->M_PREDS. */
1664 void
1665 predicate::normalize (const pred_info &pred)
1667 if (!is_neq_zero_form_p (pred))
1669 push_pred (pred);
1670 return;
1673 tree_code and_or_code = ERROR_MARK;
1675 gimple *def_stmt = SSA_NAME_DEF_STMT (pred.pred_lhs);
1676 if (gimple_code (def_stmt) == GIMPLE_ASSIGN)
1677 and_or_code = gimple_assign_rhs_code (def_stmt);
1678 if (and_or_code != BIT_IOR_EXPR && and_or_code != BIT_AND_EXPR)
1680 if (TREE_CODE_CLASS (and_or_code) == tcc_comparison)
1682 pred_info n_pred = get_pred_info_from_cmp (def_stmt);
1683 push_pred (n_pred);
1685 else
1686 push_pred (pred);
1687 return;
1691 pred_chain norm_chain = vNULL;
1692 pred_chain work_list = vNULL;
1693 work_list.safe_push (pred);
1694 hash_set<tree> mark_set;
1696 while (!work_list.is_empty ())
1698 pred_info a_pred = work_list.pop ();
1699 normalize (&norm_chain, a_pred, and_or_code, &work_list, &mark_set);
1702 if (and_or_code == BIT_AND_EXPR)
1703 m_preds.safe_push (norm_chain);
1705 work_list.release ();
1708 /* Normalize a single predicate PRED_CHAIN and append it to *THIS. */
1710 void
1711 predicate::normalize (const pred_chain &chain)
1713 pred_chain work_list = vNULL;
1714 hash_set<tree> mark_set;
1715 for (unsigned i = 0; i < chain.length (); i++)
1717 work_list.safe_push (chain[i]);
1718 mark_set.add (chain[i].pred_lhs);
1721 /* Normalized chain of predicates built up below. */
1722 pred_chain norm_chain = vNULL;
1723 while (!work_list.is_empty ())
1725 pred_info pi = work_list.pop ();
1726 /* The predicate object is not modified here, only NORM_CHAIN and
1727 WORK_LIST are appended to. */
1728 unsigned oldlen = m_preds.length ();
1729 normalize (&norm_chain, pi, BIT_AND_EXPR, &work_list, &mark_set);
1730 gcc_assert (m_preds.length () == oldlen);
1733 m_preds.safe_push (norm_chain);
1734 work_list.release ();
1737 /* Normalize predicate chains in THIS. */
1739 void
1740 predicate::normalize (gimple *use_or_def, bool is_use)
1742 if (dump_file && dump_flags & TDF_DETAILS)
1744 fprintf (dump_file, "Before normalization ");
1745 dump (dump_file, use_or_def, is_use ? "[USE]:\n" : "[DEF]:\n");
1748 predicate norm_preds (empty_val ());
1749 for (unsigned i = 0; i < m_preds.length (); i++)
1751 if (m_preds[i].length () != 1)
1752 norm_preds.normalize (m_preds[i]);
1753 else
1754 norm_preds.normalize (m_preds[i][0]);
1757 *this = norm_preds;
1759 if (dump_file)
1761 fprintf (dump_file, "After normalization ");
1762 dump (dump_file, use_or_def, is_use ? "[USE]:\n" : "[DEF]:\n");
1766 /* Convert the chains of control dependence edges into a set of predicates.
1767 A control dependence chain is represented by a vector edges. DEP_CHAINS
1768 points to an array of NUM_CHAINS dependence chains. One edge in
1769 a dependence chain is mapped to predicate expression represented by
1770 pred_info type. One dependence chain is converted to a composite
1771 predicate that is the result of AND operation of pred_info mapped to
1772 each edge. A composite predicate is represented by a vector of
1773 pred_info. Sets M_PREDS to the resulting composite predicates. */
1775 void
1776 predicate::init_from_control_deps (const vec<edge> *dep_chains,
1777 unsigned num_chains, bool is_use)
1779 gcc_assert (is_empty ());
1781 if (num_chains == 0)
1782 return;
1784 if (DEBUG_PREDICATE_ANALYZER && dump_file)
1785 fprintf (dump_file, "init_from_control_deps [%s] {%s}:\n",
1786 is_use ? "USE" : "DEF",
1787 format_edge_vecs (dep_chains, num_chains).c_str ());
1789 /* Convert the control dependency chain into a set of predicates. */
1790 m_preds.reserve (num_chains);
1792 for (unsigned i = 0; i < num_chains; i++)
1794 /* One path through the CFG represents a logical conjunction
1795 of the predicates. */
1796 const vec<edge> &path = dep_chains[i];
1798 bool has_valid_pred = false;
1799 /* The chain of predicates guarding the definition along this path. */
1800 pred_chain t_chain{ };
1801 for (unsigned j = 0; j < path.length (); j++)
1803 edge e = path[j];
1804 basic_block guard_bb = e->src;
1806 gcc_assert (!empty_block_p (guard_bb) && !single_succ_p (guard_bb));
1808 /* Skip this edge if it is bypassing an abort - when the
1809 condition is not satisfied we are neither reaching the
1810 definition nor the use so it isn't meaningful. Note if
1811 we are processing the use predicate the condition is
1812 meaningful. See PR65244. */
1813 if (!is_use && EDGE_COUNT (e->src->succs) == 2)
1815 edge e1;
1816 edge_iterator ei1;
1817 bool skip = false;
1819 FOR_EACH_EDGE (e1, ei1, e->src->succs)
1821 if (EDGE_COUNT (e1->dest->succs) == 0)
1823 skip = true;
1824 break;
1827 if (skip)
1829 has_valid_pred = true;
1830 continue;
1833 /* Get the conditional controlling the bb exit edge. */
1834 gimple *cond_stmt = *gsi_last_bb (guard_bb);
1835 if (gimple_code (cond_stmt) == GIMPLE_COND)
1837 /* The true edge corresponds to the uninteresting condition.
1838 Add the negated predicate(s) for the edge to record
1839 the interesting condition. */
1840 pred_info one_pred;
1841 one_pred.pred_lhs = gimple_cond_lhs (cond_stmt);
1842 one_pred.pred_rhs = gimple_cond_rhs (cond_stmt);
1843 one_pred.cond_code = gimple_cond_code (cond_stmt);
1844 one_pred.invert = !!(e->flags & EDGE_FALSE_VALUE);
1846 t_chain.safe_push (one_pred);
1848 if (DEBUG_PREDICATE_ANALYZER && dump_file)
1850 fprintf (dump_file, "%d -> %d: one_pred = ",
1851 e->src->index, e->dest->index);
1852 dump_pred_info (dump_file, one_pred);
1853 fputc ('\n', dump_file);
1856 has_valid_pred = true;
1858 else if (gswitch *gs = dyn_cast<gswitch *> (cond_stmt))
1860 /* Find the case label, but avoid quadratic behavior. */
1861 tree l = get_cases_for_edge (e, gs);
1862 /* If more than one label reaches this block or the case
1863 label doesn't have a contiguous range of values (like the
1864 default one) fail. */
1865 if (!l || CASE_CHAIN (l) || !CASE_LOW (l))
1866 has_valid_pred = false;
1867 else if (!CASE_HIGH (l)
1868 || operand_equal_p (CASE_LOW (l), CASE_HIGH (l)))
1870 pred_info one_pred;
1871 one_pred.pred_lhs = gimple_switch_index (gs);
1872 one_pred.pred_rhs = CASE_LOW (l);
1873 one_pred.cond_code = EQ_EXPR;
1874 one_pred.invert = false;
1875 t_chain.safe_push (one_pred);
1876 has_valid_pred = true;
1878 else
1880 /* Support a case label with a range with
1881 two predicates. We're overcommitting on
1882 the MAX_CHAIN_LEN budget by at most a factor
1883 of two here. */
1884 pred_info one_pred;
1885 one_pred.pred_lhs = gimple_switch_index (gs);
1886 one_pred.pred_rhs = CASE_LOW (l);
1887 one_pred.cond_code = GE_EXPR;
1888 one_pred.invert = false;
1889 t_chain.safe_push (one_pred);
1890 one_pred.pred_rhs = CASE_HIGH (l);
1891 one_pred.cond_code = LE_EXPR;
1892 t_chain.safe_push (one_pred);
1893 has_valid_pred = true;
1896 else if (stmt_can_throw_internal (cfun, cond_stmt)
1897 && !(e->flags & EDGE_EH))
1898 /* Ignore the exceptional control flow and proceed as if
1899 E were a fallthru without a controlling predicate for
1900 both the USE (valid) and DEF (questionable) case. */
1901 has_valid_pred = true;
1902 else
1903 has_valid_pred = false;
1905 /* For USE predicates we can drop components of the
1906 AND chain. */
1907 if (!has_valid_pred && !is_use)
1908 break;
1911 /* For DEF predicates we have to drop components of the OR chain
1912 on failure. */
1913 if (!has_valid_pred && !is_use)
1915 t_chain.release ();
1916 continue;
1919 /* When we add || 1 simply prune the chain and return. */
1920 if (t_chain.is_empty ())
1922 t_chain.release ();
1923 for (auto chain : m_preds)
1924 chain.release ();
1925 m_preds.truncate (0);
1926 break;
1929 m_preds.quick_push (t_chain);
1932 if (DEBUG_PREDICATE_ANALYZER && dump_file)
1933 dump (dump_file);
1936 /* Store a PRED in *THIS. */
1938 void
1939 predicate::push_pred (const pred_info &pred)
1941 pred_chain chain = vNULL;
1942 chain.safe_push (pred);
1943 m_preds.safe_push (chain);
1946 /* Dump predicates in *THIS to F. */
1948 void
1949 predicate::dump (FILE *f) const
1951 unsigned np = m_preds.length ();
1952 if (np == 0)
1954 fprintf (f, "\tTRUE (empty)\n");
1955 return;
1958 for (unsigned i = 0; i < np; i++)
1960 if (i > 0)
1961 fprintf (f, "\tOR (");
1962 else
1963 fprintf (f, "\t(");
1964 dump_pred_chain (f, m_preds[i]);
1965 fprintf (f, ")\n");
1969 /* Dump predicates in *THIS to stderr. */
1971 void
1972 predicate::debug () const
1974 dump (stderr);
1977 /* Dump predicates in *THIS for STMT prepended by MSG to F. */
1979 void
1980 predicate::dump (FILE *f, gimple *stmt, const char *msg) const
1982 fprintf (f, "%s", msg);
1983 if (stmt)
1985 fputc ('\t', f);
1986 print_gimple_stmt (f, stmt, 0);
1987 fprintf (f, " is conditional on:\n");
1990 dump (f);
1993 /* Initialize USE_PREDS with the predicates of the control dependence chains
1994 between the basic block DEF_BB that defines a variable of interst and
1995 USE_BB that uses the variable, respectively. */
1997 bool
1998 uninit_analysis::init_use_preds (predicate &use_preds, basic_block def_bb,
1999 basic_block use_bb)
2001 if (DEBUG_PREDICATE_ANALYZER && dump_file)
2002 fprintf (dump_file, "init_use_preds (def_bb = %u, use_bb = %u)\n",
2003 def_bb->index, use_bb->index);
2005 gcc_assert (use_preds.is_empty ()
2006 && dominated_by_p (CDI_DOMINATORS, use_bb, def_bb));
2008 /* Set CD_ROOT to the basic block closest to USE_BB that is the control
2009 equivalent of (is guarded by the same predicate as) DEF_BB that also
2010 dominates USE_BB. This mimics the inner loop in
2011 compute_control_dep_chain. */
2012 basic_block cd_root = def_bb;
2015 basic_block pdom = get_immediate_dominator (CDI_POST_DOMINATORS, cd_root);
2017 /* Stop at a loop exit which is also postdominating cd_root. */
2018 if (single_pred_p (pdom) && !single_succ_p (cd_root))
2019 break;
2021 if (!dominated_by_p (CDI_DOMINATORS, pdom, cd_root)
2022 || !dominated_by_p (CDI_DOMINATORS, use_bb, pdom))
2023 break;
2025 cd_root = pdom;
2027 while (1);
2029 auto_bb_flag in_region (cfun);
2030 auto_vec<basic_block, 20> region (MIN (n_basic_blocks_for_fn (cfun),
2031 param_uninit_control_dep_attempts));
2033 /* Set DEP_CHAINS to the set of edges between CD_ROOT and USE_BB.
2034 Each DEP_CHAINS element is a series of edges whose conditions
2035 are logical conjunctions. Together, the DEP_CHAINS vector is
2036 used below to initialize an OR expression of the conjunctions. */
2037 unsigned num_chains = 0;
2038 auto_vec<edge> dep_chains[MAX_NUM_CHAINS];
2040 if (!dfs_mark_dominating_region (use_bb, cd_root, in_region, region)
2041 || !compute_control_dep_chain (cd_root, use_bb, dep_chains, &num_chains,
2042 in_region))
2044 /* If the info in dep_chains is not complete we need to use a
2045 conservative approximation for the use predicate. */
2046 if (DEBUG_PREDICATE_ANALYZER && dump_file)
2047 fprintf (dump_file, "init_use_preds: dep_chain incomplete, using "
2048 "conservative approximation\n");
2049 num_chains = 1;
2050 dep_chains[0].truncate (0);
2051 simple_control_dep_chain (dep_chains[0], cd_root, use_bb);
2054 /* Unmark the region. */
2055 for (auto bb : region)
2056 bb->flags &= ~in_region;
2058 /* From the set of edges computed above initialize *THIS as the OR
2059 condition under which the definition in DEF_BB is used in USE_BB.
2060 Each OR subexpression is represented by one element of DEP_CHAINS,
2061 where each element consists of a series of AND subexpressions. */
2062 use_preds.init_from_control_deps (dep_chains, num_chains, true);
2063 return !use_preds.is_empty ();
2066 /* Release resources in *THIS. */
2068 predicate::~predicate ()
2070 unsigned n = m_preds.length ();
2071 for (unsigned i = 0; i != n; ++i)
2072 m_preds[i].release ();
2073 m_preds.release ();
2076 /* Copy-assign RHS to *THIS. */
2078 predicate&
2079 predicate::operator= (const predicate &rhs)
2081 if (this == &rhs)
2082 return *this;
2084 m_cval = rhs.m_cval;
2086 unsigned n = m_preds.length ();
2087 for (unsigned i = 0; i != n; ++i)
2088 m_preds[i].release ();
2089 m_preds.release ();
2091 n = rhs.m_preds.length ();
2092 for (unsigned i = 0; i != n; ++i)
2094 const pred_chain &chain = rhs.m_preds[i];
2095 m_preds.safe_push (chain.copy ());
2098 return *this;
2101 /* For each use edge of PHI, compute all control dependence chains
2102 and convert those to the composite predicates in M_PREDS.
2103 Return true if a nonempty predicate has been obtained. */
2105 bool
2106 uninit_analysis::init_from_phi_def (gphi *phi)
2108 gcc_assert (m_phi_def_preds.is_empty ());
2110 basic_block phi_bb = gimple_bb (phi);
2111 /* Find the closest dominating bb to be the control dependence root. */
2112 basic_block cd_root = get_immediate_dominator (CDI_DOMINATORS, phi_bb);
2113 if (!cd_root)
2114 return false;
2116 /* Set DEF_EDGES to the edges to the PHI from the bb's that provide
2117 definitions of each of the PHI operands for which M_EVAL is false. */
2118 auto_vec<edge> def_edges;
2119 hash_set<gimple *> visited_phis;
2120 collect_phi_def_edges (phi, cd_root, &def_edges, &visited_phis);
2122 unsigned nedges = def_edges.length ();
2123 if (nedges == 0)
2124 return false;
2126 auto_bb_flag in_region (cfun);
2127 auto_vec<basic_block, 20> region (MIN (n_basic_blocks_for_fn (cfun),
2128 param_uninit_control_dep_attempts));
2129 /* Pre-mark the PHI incoming edges PHI block to make sure we only walk
2130 interesting edges from there. */
2131 for (unsigned i = 0; i < nedges; i++)
2133 if (!(def_edges[i]->dest->flags & in_region))
2135 if (!region.space (1))
2136 break;
2137 def_edges[i]->dest->flags |= in_region;
2138 region.quick_push (def_edges[i]->dest);
2141 for (unsigned i = 0; i < nedges; i++)
2142 if (!dfs_mark_dominating_region (def_edges[i]->src, cd_root,
2143 in_region, region))
2144 break;
2146 unsigned num_chains = 0;
2147 auto_vec<edge> dep_chains[MAX_NUM_CHAINS];
2148 for (unsigned i = 0; i < nedges; i++)
2150 edge e = def_edges[i];
2151 unsigned prev_nc = num_chains;
2152 bool complete_p = compute_control_dep_chain (cd_root, e->src, dep_chains,
2153 &num_chains, in_region);
2155 /* Update the newly added chains with the phi operand edge. */
2156 if (EDGE_COUNT (e->src->succs) > 1)
2158 if (complete_p
2159 && prev_nc == num_chains
2160 && num_chains < MAX_NUM_CHAINS)
2161 /* We can only add a chain for the PHI operand edge when the
2162 collected info was complete, otherwise the predicate may
2163 not be conservative. */
2164 dep_chains[num_chains++] = vNULL;
2165 for (unsigned j = prev_nc; j < num_chains; j++)
2166 dep_chains[j].safe_push (e);
2170 /* Unmark the region. */
2171 for (auto bb : region)
2172 bb->flags &= ~in_region;
2174 /* Convert control dependence chains to the predicate in *THIS under
2175 which the PHI operands are defined to values for which M_EVAL is
2176 false. */
2177 m_phi_def_preds.init_from_control_deps (dep_chains, num_chains, false);
2178 return !m_phi_def_preds.is_empty ();
2181 /* Compute the predicates that guard the use USE_STMT and check if
2182 the incoming paths that have an empty (or possibly empty) definition
2183 can be pruned. Return true if it can be determined that the use of
2184 PHI's def in USE_STMT is guarded by a predicate set that does not
2185 overlap with the predicate sets of all runtime paths that do not
2186 have a definition.
2188 Return false if the use is not guarded or if it cannot be determined.
2189 USE_BB is the bb of the use (for phi operand use, the bb is not the bb
2190 of the phi stmt, but the source bb of the operand edge).
2192 OPNDS is a bitmap with a bit set for each PHI operand of interest.
2194 THIS->M_PREDS contains the (memoized) defining predicate chains of
2195 a PHI. If THIS->M_PREDS is empty, the PHI's defining predicate
2196 chains are computed and stored into THIS->M_PREDS as needed.
2198 VISITED_PHIS is a pointer set of phis being visited. */
2200 bool
2201 uninit_analysis::is_use_guarded (gimple *use_stmt, basic_block use_bb,
2202 gphi *phi, unsigned opnds,
2203 hash_set<gphi *> *visited)
2205 if (visited->add (phi))
2206 return false;
2208 /* The basic block where the PHI is defined. */
2209 basic_block def_bb = gimple_bb (phi);
2211 /* Try to build the predicate expression under which the PHI flows
2212 into its use. This will be empty if the PHI is defined and used
2213 in the same bb. */
2214 predicate use_preds (true);
2215 if (!init_use_preds (use_preds, def_bb, use_bb))
2216 return false;
2218 use_preds.simplify (use_stmt, /*is_use=*/true);
2219 if (use_preds.is_false ())
2220 return true;
2221 if (use_preds.is_true ())
2222 return false;
2223 use_preds.normalize (use_stmt, /*is_use=*/true);
2225 /* Try to prune the dead incoming phi edges. */
2226 if (!overlap (phi, opnds, visited, use_preds))
2228 if (DEBUG_PREDICATE_ANALYZER && dump_file)
2229 fputs ("found predicate overlap\n", dump_file);
2231 return true;
2234 if (m_phi_def_preds.is_empty ())
2236 /* Lazily initialize *THIS from PHI. */
2237 if (!init_from_phi_def (phi))
2238 return false;
2240 m_phi_def_preds.simplify (phi);
2241 if (m_phi_def_preds.is_false ())
2242 return false;
2243 if (m_phi_def_preds.is_true ())
2244 return true;
2245 m_phi_def_preds.normalize (phi);
2248 /* Return true if the predicate guarding the valid definition (i.e.,
2249 *THIS) is a superset of the predicate guarding the use (i.e.,
2250 USE_PREDS). */
2251 if (m_phi_def_preds.superset_of (use_preds))
2252 return true;
2254 return false;
2257 /* Public interface to the above. */
2259 bool
2260 uninit_analysis::is_use_guarded (gimple *stmt, basic_block use_bb, gphi *phi,
2261 unsigned opnds)
2263 hash_set<gphi *> visited;
2264 return is_use_guarded (stmt, use_bb, phi, opnds, &visited);