Update gcc-50 to SVN version 239798 (gcc-5-branch)
[dragonfly.git] / contrib / gcc-5.0 / gcc / tree-ssa-uninit.c
1 /* Predicate aware uninitialized variable warning.
2    Copyright (C) 2001-2015 Free Software Foundation, Inc.
3    Contributed by Xinliang David Li <davidxl@google.com>
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
10 any later version.
11
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3.  If not see
19 <http://www.gnu.org/licenses/>.  */
20
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "hash-set.h"
26 #include "machmode.h"
27 #include "vec.h"
28 #include "double-int.h"
29 #include "input.h"
30 #include "alias.h"
31 #include "symtab.h"
32 #include "wide-int.h"
33 #include "inchash.h"
34 #include "tree.h"
35 #include "fold-const.h"
36 #include "flags.h"
37 #include "tm_p.h"
38 #include "predict.h"
39 #include "hard-reg-set.h"
40 #include "input.h"
41 #include "function.h"
42 #include "dominance.h"
43 #include "cfg.h"
44 #include "basic-block.h"
45 #include "gimple-pretty-print.h"
46 #include "bitmap.h"
47 #include "tree-ssa-alias.h"
48 #include "internal-fn.h"
49 #include "gimple-expr.h"
50 #include "is-a.h"
51 #include "gimple.h"
52 #include "gimple-iterator.h"
53 #include "gimple-ssa.h"
54 #include "tree-phinodes.h"
55 #include "ssa-iterators.h"
56 #include "tree-ssa.h"
57 #include "tree-inline.h"
58 #include "tree-pass.h"
59 #include "diagnostic-core.h"
60 #include "params.h"
61 #include "tree-cfg.h"
62
63 /* This implements the pass that does predicate aware warning on uses of
64    possibly uninitialized variables. The pass first collects the set of
65    possibly uninitialized SSA names. For each such name, it walks through
66    all its immediate uses. For each immediate use, it rebuilds the condition
67    expression (the predicate) that guards the use. The predicate is then
68    examined to see if the variable is always defined under that same condition.
69    This is done either by pruning the unrealizable paths that lead to the
70    default definitions or by checking if the predicate set that guards the
71    defining paths is a superset of the use predicate.  */
72
73
74 /* Pointer set of potentially undefined ssa names, i.e.,
75    ssa names that are defined by phi with operands that
76    are not defined or potentially undefined.  */
77 static hash_set<tree> *possibly_undefined_names = 0;
78
79 /* Bit mask handling macros.  */
80 #define MASK_SET_BIT(mask, pos) mask |= (1 << pos)
81 #define MASK_TEST_BIT(mask, pos) (mask & (1 << pos))
82 #define MASK_EMPTY(mask) (mask == 0)
83
84 /* Returns the first bit position (starting from LSB)
85    in mask that is non zero. Returns -1 if the mask is empty.  */
86 static int
87 get_mask_first_set_bit (unsigned mask)
88 {
89   int pos = 0;
90   if (mask == 0)
91     return -1;
92
93   while ((mask & (1 << pos)) == 0)
94     pos++;
95
96   return pos;
97 }
98 #define MASK_FIRST_SET_BIT(mask) get_mask_first_set_bit (mask)
99
100 /* Return true if T, an SSA_NAME, has an undefined value.  */
101 static bool
102 has_undefined_value_p (tree t)
103 {
104   return (ssa_undefined_value_p (t)
105           || (possibly_undefined_names
106               && possibly_undefined_names->contains (t)));
107 }
108
109
110
111 /* Like has_undefined_value_p, but don't return true if TREE_NO_WARNING
112    is set on SSA_NAME_VAR.  */
113
114 static inline bool
115 uninit_undefined_value_p (tree t) {
116   if (!has_undefined_value_p (t))
117     return false;
118   if (SSA_NAME_VAR (t) && TREE_NO_WARNING (SSA_NAME_VAR (t)))
119     return false;
120   return true;
121 }
122
123 /* Emit warnings for uninitialized variables.  This is done in two passes.
124
125    The first pass notices real uses of SSA names with undefined values.
126    Such uses are unconditionally uninitialized, and we can be certain that
127    such a use is a mistake.  This pass is run before most optimizations,
128    so that we catch as many as we can.
129
130    The second pass follows PHI nodes to find uses that are potentially
131    uninitialized.  In this case we can't necessarily prove that the use
132    is really uninitialized.  This pass is run after most optimizations,
133    so that we thread as many jumps and possible, and delete as much dead
134    code as possible, in order to reduce false positives.  We also look
135    again for plain uninitialized variables, since optimization may have
136    changed conditionally uninitialized to unconditionally uninitialized.  */
137
138 /* Emit a warning for EXPR based on variable VAR at the point in the
139    program T, an SSA_NAME, is used being uninitialized.  The exact
140    warning text is in MSGID and DATA is the gimple stmt with info about
141    the location in source code. When DATA is a GIMPLE_PHI, PHIARG_IDX
142    gives which argument of the phi node to take the location from.  WC
143    is the warning code.  */
144
145 static void
146 warn_uninit (enum opt_code wc, tree t, tree expr, tree var,
147              const char *gmsgid, void *data, location_t phiarg_loc)
148 {
149   gimple context = (gimple) data;
150   location_t location, cfun_loc;
151   expanded_location xloc, floc;
152
153   /* Ignore COMPLEX_EXPR as initializing only a part of a complex
154      turns in a COMPLEX_EXPR with the not initialized part being
155      set to its previous (undefined) value.  */
156   if (is_gimple_assign (context)
157       && gimple_assign_rhs_code (context) == COMPLEX_EXPR)
158     return;
159   if (!has_undefined_value_p (t))
160     return;
161
162   /* Anonymous SSA_NAMEs shouldn't be uninitialized, but ssa_undefined_value_p
163      can return true if the def stmt of anonymous SSA_NAME is COMPLEX_EXPR
164      created for conversion from scalar to complex.  Use the underlying var of
165      the COMPLEX_EXPRs real part in that case.  See PR71581.  */
166   if (expr == NULL_TREE
167       && var == NULL_TREE
168       && SSA_NAME_VAR (t) == NULL_TREE
169       && is_gimple_assign (SSA_NAME_DEF_STMT (t))
170       && gimple_assign_rhs_code (SSA_NAME_DEF_STMT (t)) == COMPLEX_EXPR)
171     {
172       tree v = gimple_assign_rhs1 (SSA_NAME_DEF_STMT (t));
173       if (TREE_CODE (v) == SSA_NAME
174           && has_undefined_value_p (v)
175           && (integer_zerop (gimple_assign_rhs2 (SSA_NAME_DEF_STMT (t)))
176               || real_zerop (gimple_assign_rhs2 (SSA_NAME_DEF_STMT (t)))
177               || fixed_zerop (gimple_assign_rhs2 (SSA_NAME_DEF_STMT (t)))))
178         {
179           expr = SSA_NAME_VAR (v);
180           var = expr;
181         }
182     }
183
184   if (expr == NULL_TREE)
185     return;
186
187   /* TREE_NO_WARNING either means we already warned, or the front end
188      wishes to suppress the warning.  */
189   if ((context
190        && (gimple_no_warning_p (context)
191            || (gimple_assign_single_p (context)
192                && TREE_NO_WARNING (gimple_assign_rhs1 (context)))))
193       || TREE_NO_WARNING (expr))
194     return;
195
196   if (context != NULL && gimple_has_location (context))
197     location = gimple_location (context);
198   else if (phiarg_loc != UNKNOWN_LOCATION)
199     location = phiarg_loc;
200   else
201     location = DECL_SOURCE_LOCATION (var);
202   location = linemap_resolve_location (line_table, location,
203                                        LRK_SPELLING_LOCATION,
204                                        NULL);
205   cfun_loc = DECL_SOURCE_LOCATION (cfun->decl);
206   xloc = expand_location (location);
207   floc = expand_location (cfun_loc);
208   if (warning_at (location, wc, gmsgid, expr))
209     {
210       TREE_NO_WARNING (expr) = 1;
211
212       if (location == DECL_SOURCE_LOCATION (var))
213         return;
214       if (xloc.file != floc.file
215           || linemap_location_before_p (line_table,
216                                         location, cfun_loc)
217           || linemap_location_before_p (line_table,
218                                         cfun->function_end_locus,
219                                         location))
220         inform (DECL_SOURCE_LOCATION (var), "%qD was declared here", var);
221     }
222 }
223
224 static unsigned int
225 warn_uninitialized_vars (bool warn_possibly_uninitialized)
226 {
227   gimple_stmt_iterator gsi;
228   basic_block bb;
229
230   FOR_EACH_BB_FN (bb, cfun)
231     {
232       bool always_executed = dominated_by_p (CDI_POST_DOMINATORS,
233                                              single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun)), bb);
234       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
235         {
236           gimple stmt = gsi_stmt (gsi);
237           use_operand_p use_p;
238           ssa_op_iter op_iter;
239           tree use;
240
241           if (is_gimple_debug (stmt))
242             continue;
243
244           /* We only do data flow with SSA_NAMEs, so that's all we
245              can warn about.  */
246           FOR_EACH_SSA_USE_OPERAND (use_p, stmt, op_iter, SSA_OP_USE)
247             {
248               use = USE_FROM_PTR (use_p);
249               if (always_executed)
250                 warn_uninit (OPT_Wuninitialized, use,
251                              SSA_NAME_VAR (use), SSA_NAME_VAR (use),
252                              "%qD is used uninitialized in this function",
253                              stmt, UNKNOWN_LOCATION);
254               else if (warn_possibly_uninitialized)
255                 warn_uninit (OPT_Wmaybe_uninitialized, use,
256                              SSA_NAME_VAR (use), SSA_NAME_VAR (use),
257                              "%qD may be used uninitialized in this function",
258                              stmt, UNKNOWN_LOCATION);
259             }
260
261           /* For memory the only cheap thing we can do is see if we
262              have a use of the default def of the virtual operand.
263              ???  Not so cheap would be to use the alias oracle via
264              walk_aliased_vdefs, if we don't find any aliasing vdef
265              warn as is-used-uninitialized, if we don't find an aliasing
266              vdef that kills our use (stmt_kills_ref_p), warn as
267              may-be-used-uninitialized.  But this walk is quadratic and
268              so must be limited which means we would miss warning
269              opportunities.  */
270           use = gimple_vuse (stmt);
271           if (use
272               && gimple_assign_single_p (stmt)
273               && !gimple_vdef (stmt)
274               && SSA_NAME_IS_DEFAULT_DEF (use))
275             {
276               tree rhs = gimple_assign_rhs1 (stmt);
277               tree base = get_base_address (rhs);
278
279               /* Do not warn if it can be initialized outside this function.  */
280               if (TREE_CODE (base) != VAR_DECL
281                   || DECL_HARD_REGISTER (base)
282                   || is_global_var (base))
283                 continue;
284
285               if (always_executed)
286                 warn_uninit (OPT_Wuninitialized, use,
287                              gimple_assign_rhs1 (stmt), base,
288                              "%qE is used uninitialized in this function",
289                              stmt, UNKNOWN_LOCATION);
290               else if (warn_possibly_uninitialized)
291                 warn_uninit (OPT_Wmaybe_uninitialized, use,
292                              gimple_assign_rhs1 (stmt), base,
293                              "%qE may be used uninitialized in this function",
294                              stmt, UNKNOWN_LOCATION);
295             }
296         }
297     }
298
299   return 0;
300 }
301
302 /* Checks if the operand OPND of PHI is defined by
303    another phi with one operand defined by this PHI,
304    but the rest operands are all defined. If yes,
305    returns true to skip this this operand as being
306    redundant. Can be enhanced to be more general.  */
307
308 static bool
309 can_skip_redundant_opnd (tree opnd, gimple phi)
310 {
311   gimple op_def;
312   tree phi_def;
313   int i, n;
314
315   phi_def = gimple_phi_result (phi);
316   op_def = SSA_NAME_DEF_STMT (opnd);
317   if (gimple_code (op_def) != GIMPLE_PHI)
318     return false;
319   n = gimple_phi_num_args (op_def);
320   for (i = 0; i < n; ++i)
321     {
322       tree op = gimple_phi_arg_def (op_def, i);
323       if (TREE_CODE (op) != SSA_NAME)
324         continue;
325       if (op != phi_def && uninit_undefined_value_p (op))
326         return false;
327     }
328
329   return true;
330 }
331
332 /* Returns a bit mask holding the positions of arguments in PHI
333    that have empty (or possibly empty) definitions.  */
334
335 static unsigned
336 compute_uninit_opnds_pos (gphi *phi)
337 {
338   size_t i, n;
339   unsigned uninit_opnds = 0;
340
341   n = gimple_phi_num_args (phi);
342   /* Bail out for phi with too many args.  */
343   if (n > 32)
344     return 0;
345
346   for (i = 0; i < n; ++i)
347     {
348       tree op = gimple_phi_arg_def (phi, i);
349       if (TREE_CODE (op) == SSA_NAME
350           && uninit_undefined_value_p (op)
351           && !can_skip_redundant_opnd (op, phi))
352         {
353           if (cfun->has_nonlocal_label || cfun->calls_setjmp)
354             {
355               /* Ignore SSA_NAMEs that appear on abnormal edges
356                  somewhere.  */
357               if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op))
358                 continue;
359             }
360           MASK_SET_BIT (uninit_opnds, i);
361         }
362     }
363   return uninit_opnds;
364 }
365
366 /* Find the immediate postdominator PDOM of the specified
367    basic block BLOCK.  */
368
369 static inline basic_block
370 find_pdom (basic_block block)
371 {
372    if (block == EXIT_BLOCK_PTR_FOR_FN (cfun))
373      return EXIT_BLOCK_PTR_FOR_FN (cfun);
374    else
375      {
376        basic_block bb
377            = get_immediate_dominator (CDI_POST_DOMINATORS, block);
378        if (! bb)
379          return EXIT_BLOCK_PTR_FOR_FN (cfun);
380        return bb;
381      }
382 }
383
384 /* Find the immediate DOM of the specified
385    basic block BLOCK.  */
386
387 static inline basic_block
388 find_dom (basic_block block)
389 {
390    if (block == ENTRY_BLOCK_PTR_FOR_FN (cfun))
391      return ENTRY_BLOCK_PTR_FOR_FN (cfun);
392    else
393      {
394        basic_block bb = get_immediate_dominator (CDI_DOMINATORS, block);
395        if (! bb)
396          return ENTRY_BLOCK_PTR_FOR_FN (cfun);
397        return bb;
398      }
399 }
400
401 /* Returns true if BB1 is postdominating BB2 and BB1 is
402    not a loop exit bb. The loop exit bb check is simple and does
403    not cover all cases.  */
404
405 static bool
406 is_non_loop_exit_postdominating (basic_block bb1, basic_block bb2)
407 {
408   if (!dominated_by_p (CDI_POST_DOMINATORS, bb2, bb1))
409     return false;
410
411   if (single_pred_p (bb1) && !single_succ_p (bb2))
412     return false;
413
414   return true;
415 }
416
417 /* Find the closest postdominator of a specified BB, which is control
418    equivalent to BB.  */
419
420 static inline  basic_block
421 find_control_equiv_block (basic_block bb)
422 {
423   basic_block pdom;
424
425   pdom = find_pdom (bb);
426
427   /* Skip the postdominating bb that is also loop exit.  */
428   if (!is_non_loop_exit_postdominating (pdom, bb))
429     return NULL;
430
431   if (dominated_by_p (CDI_DOMINATORS, pdom, bb))
432     return pdom;
433
434   return NULL;
435 }
436
437 #define MAX_NUM_CHAINS 8
438 #define MAX_CHAIN_LEN 5
439 #define MAX_POSTDOM_CHECK 8
440 #define MAX_SWITCH_CASES 40
441
442 /* Computes the control dependence chains (paths of edges)
443    for DEP_BB up to the dominating basic block BB (the head node of a
444    chain should be dominated by it).  CD_CHAINS is pointer to an
445    array holding the result chains.  CUR_CD_CHAIN is the current
446    chain being computed.  *NUM_CHAINS is total number of chains.  The
447    function returns true if the information is successfully computed,
448    return false if there is no control dependence or not computed.  */
449
450 static bool
451 compute_control_dep_chain (basic_block bb, basic_block dep_bb,
452                            vec<edge> *cd_chains,
453                            size_t *num_chains,
454                            vec<edge> *cur_cd_chain,
455                            int *num_calls)
456 {
457   edge_iterator ei;
458   edge e;
459   size_t i;
460   bool found_cd_chain = false;
461   size_t cur_chain_len = 0;
462
463   if (EDGE_COUNT (bb->succs) < 2)
464     return false;
465
466   if (*num_calls > PARAM_VALUE (PARAM_UNINIT_CONTROL_DEP_ATTEMPTS))
467     return false;
468   ++*num_calls;
469
470   /* Could use a set instead.  */
471   cur_chain_len = cur_cd_chain->length ();
472   if (cur_chain_len > MAX_CHAIN_LEN)
473     return false;
474
475   for (i = 0; i < cur_chain_len; i++)
476     {
477       edge e = (*cur_cd_chain)[i];
478       /* Cycle detected. */
479       if (e->src == bb)
480         return false;
481     }
482
483   FOR_EACH_EDGE (e, ei, bb->succs)
484     {
485       basic_block cd_bb;
486       int post_dom_check = 0;
487       if (e->flags & (EDGE_FAKE | EDGE_ABNORMAL))
488         continue;
489
490       cd_bb = e->dest;
491       cur_cd_chain->safe_push (e);
492       while (!is_non_loop_exit_postdominating (cd_bb, bb))
493         {
494           if (cd_bb == dep_bb)
495             {
496               /* Found a direct control dependence.  */
497               if (*num_chains < MAX_NUM_CHAINS)
498                 {
499                   cd_chains[*num_chains] = cur_cd_chain->copy ();
500                   (*num_chains)++;
501                 }
502               found_cd_chain = true;
503               /* Check path from next edge.  */
504               break;
505             }
506
507           /* Now check if DEP_BB is indirectly control dependent on BB.  */
508           if (compute_control_dep_chain (cd_bb, dep_bb, cd_chains,
509                                          num_chains, cur_cd_chain, num_calls))
510             {
511               found_cd_chain = true;
512               break;
513             }
514
515           cd_bb = find_pdom (cd_bb);
516           post_dom_check++;
517           if (cd_bb == EXIT_BLOCK_PTR_FOR_FN (cfun) || post_dom_check >
518               MAX_POSTDOM_CHECK)
519             break;
520         }
521       cur_cd_chain->pop ();
522       gcc_assert (cur_cd_chain->length () == cur_chain_len);
523     }
524   gcc_assert (cur_cd_chain->length () == cur_chain_len);
525
526   return found_cd_chain;
527 }
528
529 /* The type to represent a simple predicate  */
530
531 typedef struct use_def_pred_info
532 {
533   tree pred_lhs;
534   tree pred_rhs;
535   enum tree_code cond_code;
536   bool invert;
537 } pred_info;
538
539 /* The type to represent a sequence of predicates grouped
540   with .AND. operation.  */
541
542 typedef vec<pred_info, va_heap, vl_ptr> pred_chain;
543
544 /* The type to represent a sequence of pred_chains grouped
545   with .OR. operation.  */
546
547 typedef vec<pred_chain, va_heap, vl_ptr> pred_chain_union;
548
549 /* Converts the chains of control dependence edges into a set of
550    predicates. A control dependence chain is represented by a vector
551    edges. DEP_CHAINS points to an array of dependence chains.
552    NUM_CHAINS is the size of the chain array. One edge in a dependence
553    chain is mapped to predicate expression represented by pred_info
554    type. One dependence chain is converted to a composite predicate that
555    is the result of AND operation of pred_info mapped to each edge.
556    A composite predicate is presented by a vector of pred_info. On
557    return, *PREDS points to the resulting array of composite predicates.
558    *NUM_PREDS is the number of composite predictes.  */
559
560 static bool
561 convert_control_dep_chain_into_preds (vec<edge> *dep_chains,
562                                       size_t num_chains,
563                                       pred_chain_union *preds)
564 {
565   bool has_valid_pred = false;
566   size_t i, j;
567   if (num_chains == 0 || num_chains >= MAX_NUM_CHAINS)
568     return false;
569
570   /* Now convert the control dep chain into a set
571      of predicates.  */
572   preds->reserve (num_chains);
573
574   for (i = 0; i < num_chains; i++)
575     {
576       vec<edge> one_cd_chain = dep_chains[i];
577
578       has_valid_pred = false;
579       pred_chain t_chain = vNULL;
580       for (j = 0; j < one_cd_chain.length (); j++)
581         {
582           gimple cond_stmt;
583           gimple_stmt_iterator gsi;
584           basic_block guard_bb;
585           pred_info one_pred;
586           edge e;
587
588           e = one_cd_chain[j];
589           guard_bb = e->src;
590           gsi = gsi_last_bb (guard_bb);
591           if (gsi_end_p (gsi))
592             {
593               has_valid_pred = false;
594               break;
595             }
596           cond_stmt = gsi_stmt (gsi);
597           if (is_gimple_call (cond_stmt)
598               && EDGE_COUNT (e->src->succs) >= 2)
599             {
600               /* Ignore EH edge. Can add assertion
601                  on the other edge's flag.  */
602               continue;
603             }
604           /* Skip if there is essentially one succesor.  */
605           if (EDGE_COUNT (e->src->succs) == 2)
606             {
607               edge e1;
608               edge_iterator ei1;
609               bool skip = false;
610
611               FOR_EACH_EDGE (e1, ei1, e->src->succs)
612                 {
613                   if (EDGE_COUNT (e1->dest->succs) == 0)
614                     {
615                       skip = true;
616                       break;
617                     }
618                 }
619               if (skip)
620                 continue;
621             }
622           if (gimple_code (cond_stmt) == GIMPLE_COND)
623             {
624               one_pred.pred_lhs = gimple_cond_lhs (cond_stmt);
625               one_pred.pred_rhs = gimple_cond_rhs (cond_stmt);
626               one_pred.cond_code = gimple_cond_code (cond_stmt);
627               one_pred.invert = !!(e->flags & EDGE_FALSE_VALUE);
628               t_chain.safe_push (one_pred);
629               has_valid_pred = true;
630             }
631           else if (gswitch *gs = dyn_cast <gswitch *> (cond_stmt))
632             {
633               /* Avoid quadratic behavior.  */
634               if (gimple_switch_num_labels (gs) > MAX_SWITCH_CASES)
635                 {
636                   has_valid_pred = false;
637                   break;
638                 }
639               /* Find the case label.  */
640               tree l = NULL_TREE;
641               unsigned idx;
642               for (idx = 0; idx < gimple_switch_num_labels (gs); ++idx)
643                 {
644                   tree tl = gimple_switch_label (gs, idx);
645                   if (e->dest == label_to_block (CASE_LABEL (tl)))
646                     {
647                       if (!l)
648                         l = tl;
649                       else
650                         {
651                           l = NULL_TREE;
652                           break;
653                         }
654                     }
655                 }
656               /* If more than one label reaches this block or the case
657                  label doesn't have a single value (like the default one)
658                  fail.  */
659               if (!l
660                   || !CASE_LOW (l)
661                   || (CASE_HIGH (l) && !operand_equal_p (CASE_LOW (l),
662                                                          CASE_HIGH (l), 0)))
663                 {
664                   has_valid_pred = false;
665                   break;
666                 }
667               one_pred.pred_lhs = gimple_switch_index (gs);
668               one_pred.pred_rhs = CASE_LOW (l);
669               one_pred.cond_code = EQ_EXPR;
670               one_pred.invert = false;
671               t_chain.safe_push (one_pred);
672               has_valid_pred = true;
673             }
674           else
675             {
676               has_valid_pred = false;
677               break;
678             }
679         }
680
681       if (!has_valid_pred)
682         break;
683       else
684         preds->safe_push (t_chain);
685     }
686   return has_valid_pred;
687 }
688
689 /* Computes all control dependence chains for USE_BB. The control
690    dependence chains are then converted to an array of composite
691    predicates pointed to by PREDS.  PHI_BB is the basic block of
692    the phi whose result is used in USE_BB.  */
693
694 static bool
695 find_predicates (pred_chain_union *preds,
696                  basic_block phi_bb,
697                  basic_block use_bb)
698 {
699   size_t num_chains = 0, i;
700   int num_calls = 0;
701   vec<edge> dep_chains[MAX_NUM_CHAINS];
702   auto_vec<edge, MAX_CHAIN_LEN + 1> cur_chain;
703   bool has_valid_pred = false;
704   basic_block cd_root = 0;
705
706   /* First find the closest bb that is control equivalent to PHI_BB
707      that also dominates USE_BB.  */
708   cd_root = phi_bb;
709   while (dominated_by_p (CDI_DOMINATORS, use_bb, cd_root))
710     {
711       basic_block ctrl_eq_bb = find_control_equiv_block (cd_root);
712       if (ctrl_eq_bb && dominated_by_p (CDI_DOMINATORS, use_bb, ctrl_eq_bb))
713         cd_root = ctrl_eq_bb;
714       else
715         break;
716     }
717
718   compute_control_dep_chain (cd_root, use_bb, dep_chains, &num_chains,
719                              &cur_chain, &num_calls);
720
721   has_valid_pred
722     = convert_control_dep_chain_into_preds (dep_chains, num_chains, preds);
723   for (i = 0; i < num_chains; i++)
724     dep_chains[i].release ();
725   return has_valid_pred;
726 }
727
728 /* Computes the set of incoming edges of PHI that have non empty
729    definitions of a phi chain.  The collection will be done
730    recursively on operands that are defined by phis. CD_ROOT
731    is the control dependence root. *EDGES holds the result, and
732    VISITED_PHIS is a pointer set for detecting cycles.  */
733
734 static void
735 collect_phi_def_edges (gphi *phi, basic_block cd_root,
736                        vec<edge> *edges,
737                        hash_set<gimple> *visited_phis)
738 {
739   size_t i, n;
740   edge opnd_edge;
741   tree opnd;
742
743   if (visited_phis->add (phi))
744     return;
745
746   n = gimple_phi_num_args (phi);
747   for (i = 0; i < n; i++)
748     {
749       opnd_edge = gimple_phi_arg_edge (phi, i);
750       opnd = gimple_phi_arg_def (phi, i);
751
752       if (TREE_CODE (opnd) != SSA_NAME)
753         {
754           if (dump_file && (dump_flags & TDF_DETAILS))
755             {
756               fprintf (dump_file, "\n[CHECK] Found def edge %d in ", (int)i);
757               print_gimple_stmt (dump_file, phi, 0, 0);
758             }
759           edges->safe_push (opnd_edge);
760         }
761       else
762         {
763           gimple def = SSA_NAME_DEF_STMT (opnd);
764
765           if (gimple_code (def) == GIMPLE_PHI
766               && dominated_by_p (CDI_DOMINATORS,
767                                  gimple_bb (def), cd_root))
768             collect_phi_def_edges (as_a <gphi *> (def), cd_root, edges,
769                                    visited_phis);
770           else if (!uninit_undefined_value_p (opnd))
771             {
772               if (dump_file && (dump_flags & TDF_DETAILS))
773                 {
774                   fprintf (dump_file, "\n[CHECK] Found def edge %d in ", (int)i);
775                   print_gimple_stmt (dump_file, phi, 0, 0);
776                 }
777               edges->safe_push (opnd_edge);
778             }
779         }
780     }
781 }
782
783 /* For each use edge of PHI, computes all control dependence chains.
784    The control dependence chains are then converted to an array of
785    composite predicates pointed to by PREDS.  */
786
787 static bool
788 find_def_preds (pred_chain_union *preds, gphi *phi)
789 {
790   size_t num_chains = 0, i, n;
791   vec<edge> dep_chains[MAX_NUM_CHAINS];
792   auto_vec<edge, MAX_CHAIN_LEN + 1> cur_chain;
793   vec<edge> def_edges = vNULL;
794   bool has_valid_pred = false;
795   basic_block phi_bb, cd_root = 0;
796
797   phi_bb = gimple_bb (phi);
798   /* First find the closest dominating bb to be
799      the control dependence root  */
800   cd_root = find_dom (phi_bb);
801   if (!cd_root)
802     return false;
803
804   hash_set<gimple> visited_phis;
805   collect_phi_def_edges (phi, cd_root, &def_edges, &visited_phis);
806
807   n = def_edges.length ();
808   if (n == 0)
809     return false;
810
811   for (i = 0; i < n; i++)
812     {
813       size_t prev_nc, j;
814       int num_calls = 0;
815       edge opnd_edge;
816
817       opnd_edge = def_edges[i];
818       prev_nc = num_chains;
819       compute_control_dep_chain (cd_root, opnd_edge->src, dep_chains,
820                                  &num_chains, &cur_chain, &num_calls);
821
822       /* Now update the newly added chains with
823          the phi operand edge:  */
824       if (EDGE_COUNT (opnd_edge->src->succs) > 1)
825         {
826           if (prev_nc == num_chains && num_chains < MAX_NUM_CHAINS)
827             dep_chains[num_chains++] = vNULL;
828           for (j = prev_nc; j < num_chains; j++)
829             dep_chains[j].safe_push (opnd_edge);
830         }
831     }
832
833   has_valid_pred
834     = convert_control_dep_chain_into_preds (dep_chains, num_chains, preds);
835   for (i = 0; i < num_chains; i++)
836     dep_chains[i].release ();
837   return has_valid_pred;
838 }
839
840 /* Dumps the predicates (PREDS) for USESTMT.  */
841
842 static void
843 dump_predicates (gimple usestmt, pred_chain_union preds,
844                  const char* msg)
845 {
846   size_t i, j;
847   pred_chain one_pred_chain = vNULL;
848   fprintf (dump_file, "%s", msg);
849   print_gimple_stmt (dump_file, usestmt, 0, 0);
850   fprintf (dump_file, "is guarded by :\n\n");
851   size_t num_preds = preds.length ();
852   /* Do some dumping here:  */
853   for (i = 0; i < num_preds; i++)
854     {
855       size_t np;
856
857       one_pred_chain = preds[i];
858       np = one_pred_chain.length ();
859
860       for (j = 0; j < np; j++)
861         {
862           pred_info one_pred = one_pred_chain[j];
863           if (one_pred.invert)
864             fprintf (dump_file, " (.NOT.) ");
865           print_generic_expr (dump_file, one_pred.pred_lhs, 0);
866           fprintf (dump_file, " %s ", op_symbol_code (one_pred.cond_code));
867           print_generic_expr (dump_file, one_pred.pred_rhs, 0);
868           if (j < np - 1)
869             fprintf (dump_file, " (.AND.) ");
870           else
871             fprintf (dump_file, "\n");
872         }
873       if (i < num_preds - 1)
874         fprintf (dump_file, "(.OR.)\n");
875       else
876         fprintf (dump_file, "\n\n");
877     }
878 }
879
880 /* Destroys the predicate set *PREDS.  */
881
882 static void
883 destroy_predicate_vecs (pred_chain_union preds)
884 {
885   size_t i;
886
887   size_t n = preds.length ();
888   for (i = 0; i < n; i++)
889     preds[i].release ();
890   preds.release ();
891 }
892
893
894 /* Computes the 'normalized' conditional code with operand
895    swapping and condition inversion.  */
896
897 static enum tree_code
898 get_cmp_code (enum tree_code orig_cmp_code,
899               bool swap_cond, bool invert)
900 {
901   enum tree_code tc = orig_cmp_code;
902
903   if (swap_cond)
904     tc = swap_tree_comparison (orig_cmp_code);
905   if (invert)
906     tc = invert_tree_comparison (tc, false);
907
908   switch (tc)
909     {
910     case LT_EXPR:
911     case LE_EXPR:
912     case GT_EXPR:
913     case GE_EXPR:
914     case EQ_EXPR:
915     case NE_EXPR:
916       break;
917     default:
918       return ERROR_MARK;
919     }
920   return tc;
921 }
922
923 /* Returns true if VAL falls in the range defined by BOUNDARY and CMPC, i.e.
924    all values in the range satisfies (x CMPC BOUNDARY) == true.  */
925
926 static bool
927 is_value_included_in (tree val, tree boundary, enum tree_code cmpc)
928 {
929   bool inverted = false;
930   bool is_unsigned;
931   bool result;
932
933   /* Only handle integer constant here.  */
934   if (TREE_CODE (val) != INTEGER_CST
935       || TREE_CODE (boundary) != INTEGER_CST)
936     return true;
937
938   is_unsigned = TYPE_UNSIGNED (TREE_TYPE (val));
939
940   if (cmpc == GE_EXPR || cmpc == GT_EXPR
941       || cmpc == NE_EXPR)
942     {
943       cmpc = invert_tree_comparison (cmpc, false);
944       inverted = true;
945     }
946
947   if (is_unsigned)
948     {
949       if (cmpc == EQ_EXPR)
950         result = tree_int_cst_equal (val, boundary);
951       else if (cmpc == LT_EXPR)
952         result = tree_int_cst_lt (val, boundary);
953       else
954         {
955           gcc_assert (cmpc == LE_EXPR);
956           result = tree_int_cst_le (val, boundary);
957         }
958     }
959   else
960     {
961       if (cmpc == EQ_EXPR)
962         result = tree_int_cst_equal (val, boundary);
963       else if (cmpc == LT_EXPR)
964         result = tree_int_cst_lt (val, boundary);
965       else
966         {
967           gcc_assert (cmpc == LE_EXPR);
968           result = (tree_int_cst_equal (val, boundary)
969                     || tree_int_cst_lt (val, boundary));
970         }
971     }
972
973   if (inverted)
974     result ^= 1;
975
976   return result;
977 }
978
979 /* Returns true if PRED is common among all the predicate
980    chains (PREDS) (and therefore can be factored out).
981    NUM_PRED_CHAIN is the size of array PREDS.  */
982
983 static bool
984 find_matching_predicate_in_rest_chains (pred_info pred,
985                                         pred_chain_union preds,
986                                         size_t num_pred_chains)
987 {
988   size_t i, j, n;
989
990   /* Trival case.  */
991   if (num_pred_chains == 1)
992     return true;
993
994   for (i = 1; i < num_pred_chains; i++)
995     {
996       bool found = false;
997       pred_chain one_chain = preds[i];
998       n = one_chain.length ();
999       for (j = 0; j < n; j++)
1000         {
1001           pred_info pred2 = one_chain[j];
1002           /* Can relax the condition comparison to not
1003              use address comparison. However, the most common
1004              case is that multiple control dependent paths share
1005              a common path prefix, so address comparison should
1006              be ok.  */
1007
1008           if (operand_equal_p (pred2.pred_lhs, pred.pred_lhs, 0)
1009               && operand_equal_p (pred2.pred_rhs, pred.pred_rhs, 0)
1010               && pred2.invert == pred.invert)
1011             {
1012               found = true;
1013               break;
1014             }
1015         }
1016       if (!found)
1017         return false;
1018     }
1019   return true;
1020 }
1021
1022 /* Forward declaration.  */
1023 static bool
1024 is_use_properly_guarded (gimple use_stmt,
1025                          basic_block use_bb,
1026                          gphi *phi,
1027                          unsigned uninit_opnds,
1028                          hash_set<gphi *> *visited_phis);
1029
1030 /* Returns true if all uninitialized opnds are pruned. Returns false
1031    otherwise. PHI is the phi node with uninitialized operands,
1032    UNINIT_OPNDS is the bitmap of the uninitialize operand positions,
1033    FLAG_DEF is the statement defining the flag guarding the use of the
1034    PHI output, BOUNDARY_CST is the const value used in the predicate
1035    associated with the flag, CMP_CODE is the comparison code used in
1036    the predicate, VISITED_PHIS is the pointer set of phis visited, and
1037    VISITED_FLAG_PHIS is the pointer to the pointer set of flag definitions
1038    that are also phis.
1039
1040    Example scenario:
1041
1042    BB1:
1043    flag_1 = phi <0, 1>                  // (1)
1044    var_1  = phi <undef, some_val>
1045
1046
1047    BB2:
1048    flag_2 = phi <0,   flag_1, flag_1>   // (2)
1049    var_2  = phi <undef, var_1, var_1>
1050    if (flag_2 == 1)
1051       goto BB3;
1052
1053    BB3:
1054    use of var_2                         // (3)
1055
1056    Because some flag arg in (1) is not constant, if we do not look into the
1057    flag phis recursively, it is conservatively treated as unknown and var_1
1058    is thought to be flowed into use at (3). Since var_1 is potentially uninitialized
1059    a false warning will be emitted. Checking recursively into (1), the compiler can
1060    find out that only some_val (which is defined) can flow into (3) which is OK.
1061
1062 */
1063
1064 static bool
1065 prune_uninit_phi_opnds_in_unrealizable_paths (gphi *phi,
1066                                               unsigned uninit_opnds,
1067                                               gphi *flag_def,
1068                                               tree boundary_cst,
1069                                               enum tree_code cmp_code,
1070                                               hash_set<gphi *> *visited_phis,
1071                                               bitmap *visited_flag_phis)
1072 {
1073   unsigned i;
1074
1075   for (i = 0; i < MIN (32, gimple_phi_num_args (flag_def)); i++)
1076     {
1077       tree flag_arg;
1078
1079       if (!MASK_TEST_BIT (uninit_opnds, i))
1080         continue;
1081
1082       flag_arg = gimple_phi_arg_def (flag_def, i);
1083       if (!is_gimple_constant (flag_arg))
1084         {
1085           gphi *flag_arg_def, *phi_arg_def;
1086           tree phi_arg;
1087           unsigned uninit_opnds_arg_phi;
1088
1089           if (TREE_CODE (flag_arg) != SSA_NAME)
1090             return false;
1091           flag_arg_def = dyn_cast <gphi *> (SSA_NAME_DEF_STMT (flag_arg));
1092           if (!flag_arg_def)
1093             return false;
1094
1095           phi_arg = gimple_phi_arg_def (phi, i);
1096           if (TREE_CODE (phi_arg) != SSA_NAME)
1097             return false;
1098
1099           phi_arg_def = dyn_cast <gphi *> (SSA_NAME_DEF_STMT (phi_arg));
1100           if (!phi_arg_def)
1101             return false;
1102
1103           if (gimple_bb (phi_arg_def) != gimple_bb (flag_arg_def))
1104             return false;
1105
1106           if (!*visited_flag_phis)
1107             *visited_flag_phis = BITMAP_ALLOC (NULL);
1108
1109           if (bitmap_bit_p (*visited_flag_phis,
1110                             SSA_NAME_VERSION (gimple_phi_result (flag_arg_def))))
1111             return false;
1112
1113           bitmap_set_bit (*visited_flag_phis,
1114                           SSA_NAME_VERSION (gimple_phi_result (flag_arg_def)));
1115
1116           /* Now recursively prune the uninitialized phi args.  */
1117           uninit_opnds_arg_phi = compute_uninit_opnds_pos (phi_arg_def);
1118           if (!prune_uninit_phi_opnds_in_unrealizable_paths
1119                  (phi_arg_def, uninit_opnds_arg_phi, flag_arg_def,
1120                   boundary_cst, cmp_code, visited_phis, visited_flag_phis))
1121             return false;
1122
1123           bitmap_clear_bit (*visited_flag_phis,
1124                             SSA_NAME_VERSION (gimple_phi_result (flag_arg_def)));
1125           continue;
1126         }
1127
1128       /* Now check if the constant is in the guarded range.  */
1129       if (is_value_included_in (flag_arg, boundary_cst, cmp_code))
1130         {
1131           tree opnd;
1132           gimple opnd_def;
1133
1134           /* Now that we know that this undefined edge is not
1135              pruned. If the operand is defined by another phi,
1136              we can further prune the incoming edges of that
1137              phi by checking the predicates of this operands.  */
1138
1139           opnd = gimple_phi_arg_def (phi, i);
1140           opnd_def = SSA_NAME_DEF_STMT (opnd);
1141           if (gphi *opnd_def_phi = dyn_cast <gphi *> (opnd_def))
1142             {
1143               edge opnd_edge;
1144               unsigned uninit_opnds2
1145                   = compute_uninit_opnds_pos (opnd_def_phi);
1146               if (!MASK_EMPTY (uninit_opnds2))
1147                 {
1148                   opnd_edge = gimple_phi_arg_edge (phi, i);
1149                   if (!is_use_properly_guarded (phi,
1150                                                 opnd_edge->src,
1151                                                 opnd_def_phi,
1152                                                 uninit_opnds2,
1153                                                 visited_phis))
1154                     return false;
1155                 }
1156             }
1157           else
1158             return false;
1159         }
1160     }
1161
1162   return true;
1163 }
1164
1165 /* A helper function that determines if the predicate set
1166    of the use is not overlapping with that of the uninit paths.
1167    The most common senario of guarded use is in Example 1:
1168      Example 1:
1169            if (some_cond)
1170            {
1171               x = ...;
1172               flag = true;
1173            }
1174
1175             ... some code ...
1176
1177            if (flag)
1178               use (x);
1179
1180      The real world examples are usually more complicated, but similar
1181      and usually result from inlining:
1182
1183          bool init_func (int * x)
1184          {
1185              if (some_cond)
1186                 return false;
1187              *x  =  ..
1188              return true;
1189          }
1190
1191          void foo(..)
1192          {
1193              int x;
1194
1195              if (!init_func(&x))
1196                 return;
1197
1198              .. some_code ...
1199              use (x);
1200          }
1201
1202      Another possible use scenario is in the following trivial example:
1203
1204      Example 2:
1205           if (n > 0)
1206              x = 1;
1207           ...
1208           if (n > 0)
1209             {
1210               if (m < 2)
1211                  .. = x;
1212             }
1213
1214      Predicate analysis needs to compute the composite predicate:
1215
1216        1) 'x' use predicate: (n > 0) .AND. (m < 2)
1217        2) 'x' default value  (non-def) predicate: .NOT. (n > 0)
1218        (the predicate chain for phi operand defs can be computed
1219        starting from a bb that is control equivalent to the phi's
1220        bb and is dominating the operand def.)
1221
1222        and check overlapping:
1223           (n > 0) .AND. (m < 2) .AND. (.NOT. (n > 0))
1224         <==> false
1225
1226      This implementation provides framework that can handle
1227      scenarios. (Note that many simple cases are handled properly
1228      without the predicate analysis -- this is due to jump threading
1229      transformation which eliminates the merge point thus makes
1230      path sensitive analysis unnecessary.)
1231
1232      NUM_PREDS is the number is the number predicate chains, PREDS is
1233      the array of chains, PHI is the phi node whose incoming (undefined)
1234      paths need to be pruned, and UNINIT_OPNDS is the bitmap holding
1235      uninit operand positions. VISITED_PHIS is the pointer set of phi
1236      stmts being checked.  */
1237
1238
1239 static bool
1240 use_pred_not_overlap_with_undef_path_pred (pred_chain_union preds,
1241                                            gphi *phi, unsigned uninit_opnds,
1242                                            hash_set<gphi *> *visited_phis)
1243 {
1244   unsigned int i, n;
1245   gimple flag_def = 0;
1246   tree  boundary_cst = 0;
1247   enum tree_code cmp_code;
1248   bool swap_cond = false;
1249   bool invert = false;
1250   pred_chain the_pred_chain = vNULL;
1251   bitmap visited_flag_phis = NULL;
1252   bool all_pruned = false;
1253   size_t num_preds = preds.length ();
1254
1255   gcc_assert (num_preds > 0);
1256   /* Find within the common prefix of multiple predicate chains
1257      a predicate that is a comparison of a flag variable against
1258      a constant.  */
1259   the_pred_chain = preds[0];
1260   n = the_pred_chain.length ();
1261   for (i = 0; i < n; i++)
1262     {
1263       tree cond_lhs, cond_rhs, flag = 0;
1264
1265       pred_info the_pred = the_pred_chain[i];
1266
1267       invert = the_pred.invert;
1268       cond_lhs = the_pred.pred_lhs;
1269       cond_rhs = the_pred.pred_rhs;
1270       cmp_code = the_pred.cond_code;
1271
1272       if (cond_lhs != NULL_TREE && TREE_CODE (cond_lhs) == SSA_NAME
1273           && cond_rhs != NULL_TREE && is_gimple_constant (cond_rhs))
1274         {
1275           boundary_cst = cond_rhs;
1276           flag = cond_lhs;
1277         }
1278       else if (cond_rhs != NULL_TREE && TREE_CODE (cond_rhs) == SSA_NAME
1279                && cond_lhs != NULL_TREE && is_gimple_constant (cond_lhs))
1280         {
1281           boundary_cst = cond_lhs;
1282           flag = cond_rhs;
1283           swap_cond = true;
1284         }
1285
1286       if (!flag)
1287         continue;
1288
1289       flag_def = SSA_NAME_DEF_STMT (flag);
1290
1291       if (!flag_def)
1292         continue;
1293
1294       if ((gimple_code (flag_def) == GIMPLE_PHI)
1295           && (gimple_bb (flag_def) == gimple_bb (phi))
1296           && find_matching_predicate_in_rest_chains (the_pred, preds,
1297                                                      num_preds))
1298         break;
1299
1300       flag_def = 0;
1301     }
1302
1303   if (!flag_def)
1304     return false;
1305
1306   /* Now check all the uninit incoming edge has a constant flag value
1307      that is in conflict with the use guard/predicate.  */
1308   cmp_code = get_cmp_code (cmp_code, swap_cond, invert);
1309
1310   if (cmp_code == ERROR_MARK)
1311     return false;
1312
1313   all_pruned = prune_uninit_phi_opnds_in_unrealizable_paths (phi,
1314                                                              uninit_opnds,
1315                                                              as_a <gphi *> (flag_def),
1316                                                              boundary_cst,
1317                                                              cmp_code,
1318                                                              visited_phis,
1319                                                              &visited_flag_phis);
1320
1321   if (visited_flag_phis)
1322     BITMAP_FREE (visited_flag_phis);
1323
1324   return all_pruned;
1325 }
1326
1327 /* The helper function returns true if two predicates X1 and X2
1328    are equivalent. It assumes the expressions have already
1329    properly re-associated.  */
1330
1331 static inline bool
1332 pred_equal_p (pred_info x1, pred_info x2)
1333 {
1334   enum tree_code c1, c2;
1335   if (!operand_equal_p (x1.pred_lhs, x2.pred_lhs, 0)
1336       || !operand_equal_p (x1.pred_rhs, x2.pred_rhs, 0))
1337     return false;
1338
1339   c1 = x1.cond_code;
1340   if (x1.invert != x2.invert
1341       && TREE_CODE_CLASS (x2.cond_code) == tcc_comparison)
1342     c2 = invert_tree_comparison (x2.cond_code, false);
1343   else
1344     c2 = x2.cond_code;
1345
1346   return c1 == c2;
1347 }
1348
1349 /* Returns true if the predication is testing !=.  */
1350
1351 static inline bool
1352 is_neq_relop_p (pred_info pred)
1353 {
1354
1355   return (pred.cond_code == NE_EXPR && !pred.invert) 
1356           || (pred.cond_code == EQ_EXPR && pred.invert);
1357 }
1358
1359 /* Returns true if pred is of the form X != 0.  */
1360
1361 static inline bool 
1362 is_neq_zero_form_p (pred_info pred)
1363 {
1364   if (!is_neq_relop_p (pred) || !integer_zerop (pred.pred_rhs)
1365       || TREE_CODE (pred.pred_lhs) != SSA_NAME)
1366     return false;
1367   return true;
1368 }
1369
1370 /* The helper function returns true if two predicates X1
1371    is equivalent to X2 != 0.  */
1372
1373 static inline bool
1374 pred_expr_equal_p (pred_info x1, tree x2)
1375 {
1376   if (!is_neq_zero_form_p (x1))
1377     return false;
1378
1379   return operand_equal_p (x1.pred_lhs, x2, 0);
1380 }
1381
1382 /* Returns true of the domain of single predicate expression
1383    EXPR1 is a subset of that of EXPR2. Returns false if it
1384    can not be proved.  */
1385
1386 static bool
1387 is_pred_expr_subset_of (pred_info expr1, pred_info expr2)
1388 {
1389   enum tree_code code1, code2;
1390
1391   if (pred_equal_p (expr1, expr2))
1392     return true;
1393
1394   if ((TREE_CODE (expr1.pred_rhs) != INTEGER_CST)
1395       || (TREE_CODE (expr2.pred_rhs) != INTEGER_CST))
1396     return false;
1397
1398   if (!operand_equal_p (expr1.pred_lhs, expr2.pred_lhs, 0))
1399     return false;
1400
1401   code1 = expr1.cond_code;
1402   if (expr1.invert)
1403     code1 = invert_tree_comparison (code1, false);
1404   code2 = expr2.cond_code;
1405   if (expr2.invert)
1406     code2 = invert_tree_comparison (code2, false);
1407
1408   if ((code1 == EQ_EXPR || code1 == BIT_AND_EXPR)
1409       && code2 == BIT_AND_EXPR)
1410     return wi::eq_p (expr1.pred_rhs,
1411                      wi::bit_and (expr1.pred_rhs, expr2.pred_rhs));
1412
1413   if (code1 != code2 && code2 != NE_EXPR)
1414     return false;
1415
1416   if (is_value_included_in (expr1.pred_rhs, expr2.pred_rhs, code2))
1417     return true;
1418
1419   return false;
1420 }
1421
1422 /* Returns true if the domain of PRED1 is a subset
1423    of that of PRED2. Returns false if it can not be proved so.  */
1424
1425 static bool
1426 is_pred_chain_subset_of (pred_chain pred1,
1427                          pred_chain pred2)
1428 {
1429   size_t np1, np2, i1, i2;
1430
1431   np1 = pred1.length ();
1432   np2 = pred2.length ();
1433
1434   for (i2 = 0; i2 < np2; i2++)
1435     {
1436       bool found = false;
1437       pred_info info2 = pred2[i2];
1438       for (i1 = 0; i1 < np1; i1++)
1439         {
1440           pred_info info1 = pred1[i1];
1441           if (is_pred_expr_subset_of (info1, info2))
1442             {
1443               found = true;
1444               break;
1445             }
1446         }
1447       if (!found)
1448         return false;
1449     }
1450   return true;
1451 }
1452
1453 /* Returns true if the domain defined by
1454    one pred chain ONE_PRED is a subset of the domain
1455    of *PREDS. It returns false if ONE_PRED's domain is
1456    not a subset of any of the sub-domains of PREDS
1457    (corresponding to each individual chains in it), even
1458    though it may be still be a subset of whole domain
1459    of PREDS which is the union (ORed) of all its subdomains.
1460    In other words, the result is conservative.  */
1461
1462 static bool
1463 is_included_in (pred_chain one_pred, pred_chain_union preds)
1464 {
1465   size_t i;
1466   size_t n = preds.length ();
1467
1468   for (i = 0; i < n; i++)
1469     {
1470       if (is_pred_chain_subset_of (one_pred, preds[i]))
1471         return true;
1472     }
1473
1474   return false;
1475 }
1476
1477 /* Compares two predicate sets PREDS1 and PREDS2 and returns
1478    true if the domain defined by PREDS1 is a superset
1479    of PREDS2's domain. N1 and N2 are array sizes of PREDS1 and
1480    PREDS2 respectively. The implementation chooses not to build
1481    generic trees (and relying on the folding capability of the
1482    compiler), but instead performs brute force comparison of
1483    individual predicate chains (won't be a compile time problem
1484    as the chains are pretty short). When the function returns
1485    false, it does not necessarily mean *PREDS1 is not a superset
1486    of *PREDS2, but mean it may not be so since the analysis can
1487    not prove it. In such cases, false warnings may still be
1488    emitted.  */
1489
1490 static bool
1491 is_superset_of (pred_chain_union preds1, pred_chain_union preds2)
1492 {
1493   size_t i, n2;
1494   pred_chain one_pred_chain = vNULL;
1495
1496   n2 = preds2.length ();
1497
1498   for (i = 0; i < n2; i++)
1499     {
1500       one_pred_chain = preds2[i];
1501       if (!is_included_in (one_pred_chain, preds1))
1502         return false;
1503     }
1504
1505   return true;
1506 }
1507
1508 /* Returns true if TC is AND or OR.  */
1509
1510 static inline bool
1511 is_and_or_or_p (enum tree_code tc, tree type)
1512 {
1513   return (tc == BIT_IOR_EXPR
1514           || (tc == BIT_AND_EXPR
1515               && (type == 0 || TREE_CODE (type) == BOOLEAN_TYPE)));
1516 }
1517
1518 /* Returns true if X1 is the negate of X2.  */
1519
1520 static inline bool
1521 pred_neg_p (pred_info x1, pred_info x2)
1522 {
1523   enum tree_code c1, c2;
1524   if (!operand_equal_p (x1.pred_lhs, x2.pred_lhs, 0)
1525       || !operand_equal_p (x1.pred_rhs, x2.pred_rhs, 0))
1526     return false;
1527       
1528   c1 = x1.cond_code;
1529   if (x1.invert == x2.invert)
1530     c2 = invert_tree_comparison (x2.cond_code, false);
1531   else
1532     c2 = x2.cond_code;
1533
1534   return c1 == c2;
1535 }
1536
1537 /* 1) ((x IOR y) != 0) AND (x != 0) is equivalent to (x != 0);
1538    2) (X AND Y) OR (!X AND Y) is equivalent to Y;
1539    3) X OR (!X AND Y) is equivalent to (X OR Y);
1540    4) ((x IAND y) != 0) || (x != 0 AND y != 0)) is equivalent to
1541       (x != 0 AND y != 0)
1542    5) (X AND Y) OR (!X AND Z) OR (!Y AND Z) is equivalent to
1543       (X AND Y) OR Z 
1544
1545    PREDS is the predicate chains, and N is the number of chains.  */
1546
1547 /* Helper function to implement rule 1 above.  ONE_CHAIN is
1548    the AND predication to be simplified.  */
1549
1550 static void
1551 simplify_pred (pred_chain *one_chain)
1552 {
1553   size_t i, j, n;
1554   bool simplified = false;
1555   pred_chain s_chain = vNULL;
1556
1557   n = one_chain->length ();
1558
1559   for (i = 0; i < n; i++)
1560     {
1561       pred_info *a_pred = &(*one_chain)[i];
1562
1563       if (!a_pred->pred_lhs)
1564         continue;
1565       if (!is_neq_zero_form_p (*a_pred))
1566         continue;
1567
1568       gimple def_stmt = SSA_NAME_DEF_STMT (a_pred->pred_lhs);
1569       if (gimple_code (def_stmt) != GIMPLE_ASSIGN)
1570         continue;
1571       if (gimple_assign_rhs_code (def_stmt) == BIT_IOR_EXPR)
1572         {
1573           for (j = 0; j < n; j++)
1574             {
1575               pred_info *b_pred = &(*one_chain)[j];
1576
1577               if (!b_pred->pred_lhs)
1578                 continue;
1579               if (!is_neq_zero_form_p (*b_pred))
1580                 continue;
1581
1582               if (pred_expr_equal_p (*b_pred, gimple_assign_rhs1 (def_stmt))
1583                   || pred_expr_equal_p (*b_pred, gimple_assign_rhs2 (def_stmt)))
1584                  {
1585                    /* Mark a_pred for removal.  */
1586                    a_pred->pred_lhs = NULL;
1587                    a_pred->pred_rhs = NULL;
1588                    simplified = true;
1589                    break;
1590                  }
1591             }
1592         }
1593     }
1594
1595   if (!simplified)
1596      return;
1597
1598   for (i = 0; i < n; i++)
1599     {
1600       pred_info *a_pred = &(*one_chain)[i];
1601       if (!a_pred->pred_lhs)
1602         continue;
1603       s_chain.safe_push (*a_pred);
1604     }
1605
1606    one_chain->release ();
1607    *one_chain = s_chain;
1608 }
1609
1610 /* The helper function implements the rule 2 for the
1611    OR predicate PREDS.
1612
1613    2) (X AND Y) OR (!X AND Y) is equivalent to Y.  */
1614
1615 static bool
1616 simplify_preds_2 (pred_chain_union *preds)
1617 {
1618   size_t i, j, n;
1619   bool simplified = false;
1620   pred_chain_union s_preds = vNULL;
1621
1622   /* (X AND Y) OR (!X AND Y) is equivalent to Y.  
1623      (X AND Y) OR (X AND !Y) is equivalent to X.  */
1624
1625   n = preds->length ();
1626   for (i = 0; i < n; i++)
1627     {
1628       pred_info x, y;
1629       pred_chain *a_chain = &(*preds)[i];
1630
1631       if (a_chain->length () != 2)
1632         continue;
1633
1634       x = (*a_chain)[0];
1635       y = (*a_chain)[1];
1636
1637       for (j = 0; j < n; j++)
1638         {
1639           pred_chain *b_chain;
1640           pred_info x2, y2;
1641
1642           if (j == i)
1643             continue;
1644
1645           b_chain = &(*preds)[j];
1646           if (b_chain->length () != 2)
1647             continue;
1648
1649           x2 = (*b_chain)[0];
1650           y2 = (*b_chain)[1];
1651
1652           if (pred_equal_p (x, x2) && pred_neg_p (y, y2))
1653             {
1654               /* Kill a_chain.  */
1655               a_chain->release ();
1656               b_chain->release ();
1657               b_chain->safe_push (x);
1658               simplified = true;
1659               break;
1660             }
1661           if (pred_neg_p (x, x2) && pred_equal_p (y, y2))
1662             {
1663               /* Kill a_chain.  */
1664               a_chain->release ();
1665               b_chain->release ();
1666               b_chain->safe_push (y);
1667               simplified = true;
1668               break;
1669             }
1670         }
1671     }
1672   /* Now clean up the chain.  */
1673   if (simplified)
1674     {
1675       for (i = 0; i < n; i++)
1676         {
1677           if ((*preds)[i].is_empty ())
1678             continue;
1679           s_preds.safe_push ((*preds)[i]);
1680         }
1681       preds->release ();
1682       (*preds) = s_preds;
1683       s_preds = vNULL;
1684     }
1685
1686   return simplified;
1687 }
1688
1689 /* The helper function implements the rule 2 for the
1690    OR predicate PREDS.
1691
1692    3) x OR (!x AND y) is equivalent to x OR y.  */
1693
1694 static bool
1695 simplify_preds_3 (pred_chain_union *preds)
1696 {
1697   size_t i, j, n;
1698   bool simplified = false;
1699
1700   /* Now iteratively simplify X OR (!X AND Z ..)
1701        into X OR (Z ...).  */
1702
1703   n = preds->length ();
1704   if (n < 2)
1705     return false;
1706
1707   for (i = 0; i < n; i++)
1708     {
1709       pred_info x;
1710       pred_chain *a_chain = &(*preds)[i];
1711
1712       if (a_chain->length () != 1)
1713         continue;
1714
1715       x = (*a_chain)[0];
1716
1717       for (j = 0; j < n; j++)
1718         {
1719           pred_chain *b_chain;
1720           pred_info x2;
1721           size_t k;
1722
1723           if (j == i)
1724             continue;
1725
1726           b_chain = &(*preds)[j];
1727           if (b_chain->length () < 2)
1728             continue;
1729
1730           for (k = 0; k < b_chain->length (); k++)
1731             {
1732               x2 = (*b_chain)[k];
1733               if (pred_neg_p (x, x2))
1734                 {
1735                   b_chain->unordered_remove (k);
1736                   simplified = true;
1737                   break;
1738                 }
1739             }
1740         }
1741     }
1742   return simplified;
1743 }
1744
1745 /* The helper function implements the rule 4 for the
1746    OR predicate PREDS.
1747
1748    2) ((x AND y) != 0) OR (x != 0 AND y != 0) is equivalent to
1749        (x != 0 ANd y != 0).   */
1750
1751 static bool
1752 simplify_preds_4 (pred_chain_union *preds)
1753 {
1754   size_t i, j, n;
1755   bool simplified = false;
1756   pred_chain_union s_preds = vNULL;
1757   gimple def_stmt;
1758
1759   n = preds->length ();
1760   for (i = 0; i < n; i++)
1761     {
1762       pred_info z;
1763       pred_chain *a_chain = &(*preds)[i];
1764
1765       if (a_chain->length () != 1)
1766         continue;
1767
1768       z = (*a_chain)[0];
1769
1770       if (!is_neq_zero_form_p (z))
1771         continue;
1772
1773       def_stmt = SSA_NAME_DEF_STMT (z.pred_lhs);
1774       if (gimple_code (def_stmt) != GIMPLE_ASSIGN)
1775         continue;
1776
1777       if (gimple_assign_rhs_code (def_stmt) != BIT_AND_EXPR)
1778         continue;
1779
1780       for (j = 0; j < n; j++)
1781         {
1782           pred_chain *b_chain;
1783           pred_info x2, y2;
1784
1785           if (j == i)
1786             continue;
1787
1788           b_chain = &(*preds)[j];
1789           if (b_chain->length () != 2)
1790             continue;
1791
1792           x2 = (*b_chain)[0];
1793           y2 = (*b_chain)[1];
1794           if (!is_neq_zero_form_p (x2)
1795               || !is_neq_zero_form_p (y2))
1796             continue;
1797
1798           if ((pred_expr_equal_p (x2, gimple_assign_rhs1 (def_stmt))
1799                && pred_expr_equal_p (y2, gimple_assign_rhs2 (def_stmt)))
1800               || (pred_expr_equal_p (x2, gimple_assign_rhs2 (def_stmt))
1801                   && pred_expr_equal_p (y2, gimple_assign_rhs1 (def_stmt))))
1802             {
1803               /* Kill a_chain.  */
1804               a_chain->release ();
1805               simplified = true;
1806               break;
1807             }
1808         }
1809     }
1810   /* Now clean up the chain.  */
1811   if (simplified)
1812     {
1813       for (i = 0; i < n; i++)
1814         {
1815           if ((*preds)[i].is_empty ())
1816             continue;
1817           s_preds.safe_push ((*preds)[i]);
1818         }
1819       preds->release ();
1820       (*preds) = s_preds;
1821       s_preds = vNULL;
1822     }
1823
1824   return simplified;
1825 }
1826
1827
1828 /* This function simplifies predicates in PREDS.  */
1829
1830 static void
1831 simplify_preds (pred_chain_union *preds, gimple use_or_def, bool is_use)
1832 {
1833   size_t i, n;
1834   bool changed = false;
1835
1836   if (dump_file && dump_flags & TDF_DETAILS)
1837     {
1838       fprintf (dump_file, "[BEFORE SIMPLICATION -- ");
1839       dump_predicates (use_or_def, *preds, is_use ? "[USE]:\n" : "[DEF]:\n");
1840     }
1841
1842   for (i = 0; i < preds->length (); i++)
1843     simplify_pred (&(*preds)[i]);
1844
1845   n = preds->length ();
1846   if (n < 2)
1847     return;
1848
1849   do
1850     {
1851       changed = false;
1852       if (simplify_preds_2 (preds))
1853         changed = true;
1854
1855       /* Now iteratively simplify X OR (!X AND Z ..)
1856        into X OR (Z ...).  */
1857       if (simplify_preds_3 (preds))
1858         changed = true;
1859
1860       if (simplify_preds_4 (preds))
1861         changed = true;
1862
1863     } while (changed);
1864
1865   return;
1866 }
1867
1868 /* This is a helper function which attempts to normalize predicate chains
1869   by following UD chains. It basically builds up a big tree of either IOR
1870   operations or AND operations, and convert the IOR tree into a 
1871   pred_chain_union or BIT_AND tree into a pred_chain.
1872   Example:
1873
1874   _3 = _2 RELOP1 _1;
1875   _6 = _5 RELOP2 _4;
1876   _9 = _8 RELOP3 _7;
1877   _10 = _3 | _6;
1878   _12 = _9 | _0;
1879   _t = _10 | _12;
1880
1881  then _t != 0 will be normalized into a pred_chain_union
1882
1883    (_2 RELOP1 _1) OR (_5 RELOP2 _4) OR (_8 RELOP3 _7) OR (_0 != 0)
1884
1885  Similarly given,
1886
1887   _3 = _2 RELOP1 _1;
1888   _6 = _5 RELOP2 _4;
1889   _9 = _8 RELOP3 _7;
1890   _10 = _3 & _6;
1891   _12 = _9 & _0;
1892
1893  then _t != 0 will be normalized into a pred_chain:
1894    (_2 RELOP1 _1) AND (_5 RELOP2 _4) AND (_8 RELOP3 _7) AND (_0 != 0)
1895    
1896   */
1897
1898 /* This is a helper function that stores a PRED into NORM_PREDS.  */
1899
1900 inline static void
1901 push_pred (pred_chain_union *norm_preds, pred_info pred)
1902 {
1903   pred_chain pred_chain = vNULL;
1904   pred_chain.safe_push (pred);
1905   norm_preds->safe_push (pred_chain);
1906 }
1907
1908 /* A helper function that creates a predicate of the form
1909    OP != 0 and push it WORK_LIST.  */
1910
1911 inline static void
1912 push_to_worklist (tree op, vec<pred_info, va_heap, vl_ptr> *work_list,
1913                   hash_set<tree> *mark_set)
1914 {
1915   if (mark_set->contains (op))
1916     return;
1917   mark_set->add (op);
1918
1919   pred_info arg_pred;
1920   arg_pred.pred_lhs = op;
1921   arg_pred.pred_rhs = integer_zero_node;
1922   arg_pred.cond_code = NE_EXPR;
1923   arg_pred.invert = false;
1924   work_list->safe_push (arg_pred);
1925 }
1926
1927 /* A helper that generates a pred_info from a gimple assignment
1928    CMP_ASSIGN with comparison rhs.  */
1929
1930 static pred_info
1931 get_pred_info_from_cmp (gimple cmp_assign)
1932 {
1933   pred_info n_pred;
1934   n_pred.pred_lhs = gimple_assign_rhs1 (cmp_assign);
1935   n_pred.pred_rhs = gimple_assign_rhs2 (cmp_assign);
1936   n_pred.cond_code = gimple_assign_rhs_code (cmp_assign);
1937   n_pred.invert = false;
1938   return n_pred;
1939 }
1940
1941 /* Returns true if the PHI is a degenerated phi with
1942    all args with the same value (relop). In that case, *PRED
1943    will be updated to that value.  */
1944
1945 static bool
1946 is_degenerated_phi (gimple phi, pred_info *pred_p)
1947 {
1948   int i, n;
1949   tree op0;
1950   gimple def0;
1951   pred_info pred0;
1952
1953   n = gimple_phi_num_args (phi);
1954   op0 = gimple_phi_arg_def (phi, 0);
1955
1956   if (TREE_CODE (op0) != SSA_NAME)
1957     return false;
1958
1959   def0 = SSA_NAME_DEF_STMT (op0);
1960   if (gimple_code (def0) != GIMPLE_ASSIGN)
1961     return false;
1962   if (TREE_CODE_CLASS (gimple_assign_rhs_code (def0))
1963       != tcc_comparison)
1964     return false;
1965   pred0 = get_pred_info_from_cmp (def0);
1966
1967   for (i = 1; i < n; ++i)
1968     {
1969       gimple def;
1970       pred_info pred;
1971       tree op = gimple_phi_arg_def (phi, i);
1972
1973       if (TREE_CODE (op) != SSA_NAME)
1974         return false;
1975
1976       def = SSA_NAME_DEF_STMT (op);
1977       if (gimple_code (def) != GIMPLE_ASSIGN)
1978         return false;
1979       if (TREE_CODE_CLASS (gimple_assign_rhs_code (def))
1980           != tcc_comparison)
1981         return false;
1982       pred = get_pred_info_from_cmp (def);
1983       if (!pred_equal_p (pred, pred0))
1984         return false;
1985     }
1986
1987   *pred_p = pred0;
1988   return true;
1989 }
1990
1991 /* Normalize one predicate PRED  
1992    1) if PRED can no longer be normlized, put it into NORM_PREDS.
1993    2) otherwise if PRED is of the form x != 0, follow x's definition
1994       and put normalized predicates into WORK_LIST.  */
1995  
1996 static void
1997 normalize_one_pred_1 (pred_chain_union *norm_preds, 
1998                       pred_chain *norm_chain,
1999                       pred_info pred,
2000                       enum tree_code and_or_code,
2001                       vec<pred_info, va_heap, vl_ptr> *work_list,
2002                       hash_set<tree> *mark_set)
2003 {
2004   if (!is_neq_zero_form_p (pred))
2005     {
2006       if (and_or_code == BIT_IOR_EXPR)
2007         push_pred (norm_preds, pred);
2008       else
2009         norm_chain->safe_push (pred);
2010       return;
2011     }
2012
2013   gimple def_stmt = SSA_NAME_DEF_STMT (pred.pred_lhs);
2014  
2015   if (gimple_code (def_stmt) == GIMPLE_PHI
2016       && is_degenerated_phi (def_stmt, &pred))
2017     work_list->safe_push (pred);
2018   else if (gimple_code (def_stmt) == GIMPLE_PHI
2019            && and_or_code == BIT_IOR_EXPR)
2020     {
2021       int i, n;
2022       n = gimple_phi_num_args (def_stmt);
2023
2024       /* If we see non zero constant, we should punt. The predicate
2025        * should be one guarding the phi edge.  */
2026       for (i = 0; i < n; ++i)
2027         {
2028           tree op = gimple_phi_arg_def (def_stmt, i);
2029           if (TREE_CODE (op) == INTEGER_CST && !integer_zerop (op))
2030             {
2031               push_pred (norm_preds, pred);
2032               return;
2033             }
2034         }
2035
2036       for (i = 0; i < n; ++i)
2037         {
2038           tree op = gimple_phi_arg_def (def_stmt, i);
2039           if (integer_zerop (op))
2040             continue;
2041
2042           push_to_worklist (op, work_list, mark_set);
2043         }
2044     }
2045   else if (gimple_code (def_stmt) != GIMPLE_ASSIGN)
2046     {
2047       if (and_or_code == BIT_IOR_EXPR)
2048         push_pred (norm_preds, pred);
2049       else
2050         norm_chain->safe_push (pred);
2051     }
2052   else if (gimple_assign_rhs_code (def_stmt) == and_or_code)
2053     {
2054       /* Avoid splitting up bit manipulations like x & 3 or y | 1.  */
2055       if (is_gimple_min_invariant (gimple_assign_rhs2 (def_stmt)))
2056         {
2057           /* But treat x & 3 as condition.  */
2058           if (and_or_code == BIT_AND_EXPR)
2059             {
2060               pred_info n_pred;
2061               n_pred.pred_lhs = gimple_assign_rhs1 (def_stmt);
2062               n_pred.pred_rhs = gimple_assign_rhs2 (def_stmt);
2063               n_pred.cond_code = and_or_code;
2064               n_pred.invert = false;
2065               norm_chain->safe_push (n_pred);
2066             }
2067         }
2068       else
2069         {
2070           push_to_worklist (gimple_assign_rhs1 (def_stmt), work_list, mark_set);
2071           push_to_worklist (gimple_assign_rhs2 (def_stmt), work_list, mark_set);
2072         }
2073     }
2074   else if (TREE_CODE_CLASS (gimple_assign_rhs_code (def_stmt))
2075            == tcc_comparison)
2076     {
2077       pred_info n_pred = get_pred_info_from_cmp (def_stmt);
2078       if (and_or_code == BIT_IOR_EXPR)
2079         push_pred (norm_preds, n_pred);
2080       else
2081         norm_chain->safe_push (n_pred);
2082     }
2083   else
2084     {
2085       if (and_or_code == BIT_IOR_EXPR)
2086         push_pred (norm_preds, pred);
2087       else
2088         norm_chain->safe_push (pred);
2089     }
2090 }
2091
2092 /* Normalize PRED and store the normalized predicates into NORM_PREDS.  */
2093
2094 static void
2095 normalize_one_pred (pred_chain_union *norm_preds,
2096                     pred_info pred)
2097 {
2098   vec<pred_info, va_heap, vl_ptr> work_list = vNULL;
2099   enum tree_code and_or_code = ERROR_MARK;
2100   pred_chain norm_chain = vNULL;
2101
2102   if (!is_neq_zero_form_p (pred))
2103     {
2104       push_pred (norm_preds, pred);
2105       return;
2106     }
2107
2108   gimple def_stmt = SSA_NAME_DEF_STMT (pred.pred_lhs);
2109   if (gimple_code (def_stmt) == GIMPLE_ASSIGN)
2110     and_or_code = gimple_assign_rhs_code (def_stmt);
2111   if (and_or_code != BIT_IOR_EXPR
2112       && and_or_code != BIT_AND_EXPR)
2113     {
2114       if (TREE_CODE_CLASS (and_or_code)
2115           == tcc_comparison)
2116         {
2117           pred_info n_pred = get_pred_info_from_cmp (def_stmt);
2118           push_pred (norm_preds, n_pred);
2119         } 
2120        else
2121           push_pred (norm_preds, pred);
2122       return;
2123     }
2124
2125   work_list.safe_push (pred);
2126   hash_set<tree> mark_set;
2127
2128   while (!work_list.is_empty ())
2129     {
2130       pred_info a_pred = work_list.pop ();
2131       normalize_one_pred_1 (norm_preds, &norm_chain, a_pred,
2132                             and_or_code, &work_list, &mark_set);
2133     }
2134   if (and_or_code == BIT_AND_EXPR)
2135     norm_preds->safe_push (norm_chain);
2136
2137   work_list.release ();
2138 }
2139
2140 static void
2141 normalize_one_pred_chain (pred_chain_union *norm_preds,
2142                           pred_chain one_chain)
2143 {
2144   vec<pred_info, va_heap, vl_ptr> work_list = vNULL;
2145   hash_set<tree> mark_set;
2146   pred_chain norm_chain = vNULL;
2147   size_t i;
2148
2149   for (i = 0; i < one_chain.length (); i++)
2150     {
2151       work_list.safe_push (one_chain[i]);
2152       mark_set.add (one_chain[i].pred_lhs);
2153     }
2154
2155   while (!work_list.is_empty ())
2156     {
2157       pred_info a_pred = work_list.pop ();
2158       normalize_one_pred_1 (0, &norm_chain, a_pred,
2159                             BIT_AND_EXPR, &work_list, &mark_set);
2160     }
2161
2162   norm_preds->safe_push (norm_chain);
2163   work_list.release ();
2164 }
2165
2166 /* Normalize predicate chains PREDS and returns the normalized one.  */
2167
2168 static pred_chain_union
2169 normalize_preds (pred_chain_union preds, gimple use_or_def, bool is_use)
2170 {
2171   pred_chain_union norm_preds = vNULL;
2172   size_t n = preds.length ();
2173   size_t i;
2174
2175   if (dump_file && dump_flags & TDF_DETAILS)
2176     {
2177       fprintf (dump_file, "[BEFORE NORMALIZATION --");
2178       dump_predicates (use_or_def, preds, is_use ? "[USE]:\n" : "[DEF]:\n");
2179     }
2180
2181   for (i = 0; i < n; i++)
2182     {
2183       if (preds[i].length () != 1)
2184         normalize_one_pred_chain (&norm_preds, preds[i]);
2185       else
2186         {
2187           normalize_one_pred (&norm_preds, preds[i][0]);
2188           preds[i].release ();
2189         }
2190     }
2191
2192   if (dump_file)
2193     {
2194       fprintf (dump_file, "[AFTER NORMALIZATION -- ");
2195       dump_predicates (use_or_def, norm_preds, is_use ? "[USE]:\n" : "[DEF]:\n");
2196     }
2197
2198   preds.release ();
2199   return norm_preds;
2200 }
2201
2202
2203 /* Computes the predicates that guard the use and checks
2204    if the incoming paths that have empty (or possibly
2205    empty) definition can be pruned/filtered. The function returns
2206    true if it can be determined that the use of PHI's def in
2207    USE_STMT is guarded with a predicate set not overlapping with
2208    predicate sets of all runtime paths that do not have a definition.
2209    Returns false if it is not or it can not be determined. USE_BB is
2210    the bb of the use (for phi operand use, the bb is not the bb of
2211    the phi stmt, but the src bb of the operand edge). UNINIT_OPNDS
2212    is a bit vector. If an operand of PHI is uninitialized, the
2213    corresponding bit in the vector is 1.  VISIED_PHIS is a pointer
2214    set of phis being visted.  */
2215
2216 static bool
2217 is_use_properly_guarded (gimple use_stmt,
2218                          basic_block use_bb,
2219                          gphi *phi,
2220                          unsigned uninit_opnds,
2221                          hash_set<gphi *> *visited_phis)
2222 {
2223   basic_block phi_bb;
2224   pred_chain_union preds = vNULL;
2225   pred_chain_union def_preds = vNULL;
2226   bool has_valid_preds = false;
2227   bool is_properly_guarded = false;
2228
2229   if (visited_phis->add (phi))
2230     return false;
2231
2232   phi_bb = gimple_bb (phi);
2233
2234   if (is_non_loop_exit_postdominating (use_bb, phi_bb))
2235     return false;
2236
2237   has_valid_preds = find_predicates (&preds, phi_bb, use_bb);
2238
2239   if (!has_valid_preds)
2240     {
2241       destroy_predicate_vecs (preds);
2242       return false;
2243     }
2244
2245   /* Try to prune the dead incoming phi edges. */
2246   is_properly_guarded
2247     = use_pred_not_overlap_with_undef_path_pred (preds, phi, uninit_opnds,
2248                                                  visited_phis);
2249
2250   if (is_properly_guarded)
2251     {
2252       destroy_predicate_vecs (preds);
2253       return true;
2254     }
2255
2256   has_valid_preds = find_def_preds (&def_preds, phi);
2257
2258   if (!has_valid_preds)
2259     {
2260       destroy_predicate_vecs (preds);
2261       destroy_predicate_vecs (def_preds);
2262       return false;
2263     }
2264
2265   simplify_preds (&preds, use_stmt, true);
2266   preds = normalize_preds (preds, use_stmt, true);
2267
2268   simplify_preds (&def_preds, phi, false);
2269   def_preds = normalize_preds (def_preds, phi, false);
2270
2271   is_properly_guarded = is_superset_of (def_preds, preds);
2272
2273   destroy_predicate_vecs (preds);
2274   destroy_predicate_vecs (def_preds);
2275   return is_properly_guarded;
2276 }
2277
2278 /* Searches through all uses of a potentially
2279    uninitialized variable defined by PHI and returns a use
2280    statement if the use is not properly guarded. It returns
2281    NULL if all uses are guarded. UNINIT_OPNDS is a bitvector
2282    holding the position(s) of uninit PHI operands. WORKLIST
2283    is the vector of candidate phis that may be updated by this
2284    function. ADDED_TO_WORKLIST is the pointer set tracking
2285    if the new phi is already in the worklist.  */
2286
2287 static gimple
2288 find_uninit_use (gphi *phi, unsigned uninit_opnds,
2289                  vec<gphi *> *worklist,
2290                  hash_set<gphi *> *added_to_worklist)
2291 {
2292   tree phi_result;
2293   use_operand_p use_p;
2294   gimple use_stmt;
2295   imm_use_iterator iter;
2296
2297   phi_result = gimple_phi_result (phi);
2298
2299   FOR_EACH_IMM_USE_FAST (use_p, iter, phi_result)
2300     {
2301       basic_block use_bb;
2302
2303       use_stmt = USE_STMT (use_p);
2304       if (is_gimple_debug (use_stmt))
2305         continue;
2306
2307       if (gphi *use_phi = dyn_cast <gphi *> (use_stmt))
2308         use_bb = gimple_phi_arg_edge (use_phi,
2309                                       PHI_ARG_INDEX_FROM_USE (use_p))->src;
2310       else
2311         use_bb = gimple_bb (use_stmt);
2312
2313       hash_set<gphi *> visited_phis;
2314       if (is_use_properly_guarded (use_stmt, use_bb, phi, uninit_opnds,
2315                                    &visited_phis))
2316         continue;
2317
2318       if (dump_file && (dump_flags & TDF_DETAILS))
2319         {
2320           fprintf (dump_file, "[CHECK]: Found unguarded use: ");
2321           print_gimple_stmt (dump_file, use_stmt, 0, 0);
2322         }
2323       /* Found one real use, return.  */
2324       if (gimple_code (use_stmt) != GIMPLE_PHI)
2325         return use_stmt;
2326
2327       /* Found a phi use that is not guarded,
2328          add the phi to the worklist.  */
2329       if (!added_to_worklist->add (as_a <gphi *> (use_stmt)))
2330         {
2331           if (dump_file && (dump_flags & TDF_DETAILS))
2332             {
2333               fprintf (dump_file, "[WORKLIST]: Update worklist with phi: ");
2334               print_gimple_stmt (dump_file, use_stmt, 0, 0);
2335             }
2336
2337           worklist->safe_push (as_a <gphi *> (use_stmt));
2338           possibly_undefined_names->add (phi_result);
2339         }
2340     }
2341
2342   return NULL;
2343 }
2344
2345 /* Look for inputs to PHI that are SSA_NAMEs that have empty definitions
2346    and gives warning if there exists a runtime path from the entry to a
2347    use of the PHI def that does not contain a definition. In other words,
2348    the warning is on the real use. The more dead paths that can be pruned
2349    by the compiler, the fewer false positives the warning is. WORKLIST
2350    is a vector of candidate phis to be examined. ADDED_TO_WORKLIST is
2351    a pointer set tracking if the new phi is added to the worklist or not.  */
2352
2353 static void
2354 warn_uninitialized_phi (gphi *phi, vec<gphi *> *worklist,
2355                         hash_set<gphi *> *added_to_worklist)
2356 {
2357   unsigned uninit_opnds;
2358   gimple uninit_use_stmt = 0;
2359   tree uninit_op;
2360   int phiarg_index;
2361   location_t loc;
2362
2363   /* Don't look at virtual operands.  */
2364   if (virtual_operand_p (gimple_phi_result (phi)))
2365     return;
2366
2367   uninit_opnds = compute_uninit_opnds_pos (phi);
2368
2369   if  (MASK_EMPTY (uninit_opnds))
2370     return;
2371
2372   if (dump_file && (dump_flags & TDF_DETAILS))
2373     {
2374       fprintf (dump_file, "[CHECK]: examining phi: ");
2375       print_gimple_stmt (dump_file, phi, 0, 0);
2376     }
2377
2378   /* Now check if we have any use of the value without proper guard.  */
2379   uninit_use_stmt = find_uninit_use (phi, uninit_opnds,
2380                                      worklist, added_to_worklist);
2381
2382   /* All uses are properly guarded.  */
2383   if (!uninit_use_stmt)
2384     return;
2385
2386   phiarg_index = MASK_FIRST_SET_BIT (uninit_opnds);
2387   uninit_op = gimple_phi_arg_def (phi, phiarg_index);
2388   if (SSA_NAME_VAR (uninit_op) == NULL_TREE)
2389     return;
2390   if (gimple_phi_arg_has_location (phi, phiarg_index))
2391     loc = gimple_phi_arg_location (phi, phiarg_index);
2392   else
2393     loc = UNKNOWN_LOCATION;
2394   warn_uninit (OPT_Wmaybe_uninitialized, uninit_op, SSA_NAME_VAR (uninit_op),
2395                SSA_NAME_VAR (uninit_op),
2396                "%qD may be used uninitialized in this function",
2397                uninit_use_stmt, loc);
2398
2399 }
2400
2401 static bool
2402 gate_warn_uninitialized (void)
2403 {
2404   return warn_uninitialized || warn_maybe_uninitialized;
2405 }
2406
2407 namespace {
2408
2409 const pass_data pass_data_late_warn_uninitialized =
2410 {
2411   GIMPLE_PASS, /* type */
2412   "uninit", /* name */
2413   OPTGROUP_NONE, /* optinfo_flags */
2414   TV_NONE, /* tv_id */
2415   PROP_ssa, /* properties_required */
2416   0, /* properties_provided */
2417   0, /* properties_destroyed */
2418   0, /* todo_flags_start */
2419   0, /* todo_flags_finish */
2420 };
2421
2422 class pass_late_warn_uninitialized : public gimple_opt_pass
2423 {
2424 public:
2425   pass_late_warn_uninitialized (gcc::context *ctxt)
2426     : gimple_opt_pass (pass_data_late_warn_uninitialized, ctxt)
2427   {}
2428
2429   /* opt_pass methods: */
2430   opt_pass * clone () { return new pass_late_warn_uninitialized (m_ctxt); }
2431   virtual bool gate (function *) { return gate_warn_uninitialized (); }
2432   virtual unsigned int execute (function *);
2433
2434 }; // class pass_late_warn_uninitialized
2435
2436 unsigned int
2437 pass_late_warn_uninitialized::execute (function *fun)
2438 {
2439   basic_block bb;
2440   gphi_iterator gsi;
2441   vec<gphi *> worklist = vNULL;
2442
2443   calculate_dominance_info (CDI_DOMINATORS);
2444   calculate_dominance_info (CDI_POST_DOMINATORS);
2445   /* Re-do the plain uninitialized variable check, as optimization may have
2446      straightened control flow.  Do this first so that we don't accidentally
2447      get a "may be" warning when we'd have seen an "is" warning later.  */
2448   warn_uninitialized_vars (/*warn_possibly_uninitialized=*/1);
2449
2450   timevar_push (TV_TREE_UNINIT);
2451
2452   possibly_undefined_names = new hash_set<tree>;
2453   hash_set<gphi *> added_to_worklist;
2454
2455   /* Initialize worklist  */
2456   FOR_EACH_BB_FN (bb, fun)
2457     for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
2458       {
2459         gphi *phi = gsi.phi ();
2460         size_t n, i;
2461
2462         n = gimple_phi_num_args (phi);
2463
2464         /* Don't look at virtual operands.  */
2465         if (virtual_operand_p (gimple_phi_result (phi)))
2466           continue;
2467
2468         for (i = 0; i < n; ++i)
2469           {
2470             tree op = gimple_phi_arg_def (phi, i);
2471             if (TREE_CODE (op) == SSA_NAME
2472                 && uninit_undefined_value_p (op))
2473               {
2474                 worklist.safe_push (phi);
2475                 added_to_worklist.add (phi);
2476                 if (dump_file && (dump_flags & TDF_DETAILS))
2477                   {
2478                     fprintf (dump_file, "[WORKLIST]: add to initial list: ");
2479                     print_gimple_stmt (dump_file, phi, 0, 0);
2480                   }
2481                 break;
2482               }
2483           }
2484       }
2485
2486   while (worklist.length () != 0)
2487     {
2488       gphi *cur_phi = 0;
2489       cur_phi = worklist.pop ();
2490       warn_uninitialized_phi (cur_phi, &worklist, &added_to_worklist);
2491     }
2492
2493   worklist.release ();
2494   delete possibly_undefined_names;
2495   possibly_undefined_names = NULL;
2496   free_dominance_info (CDI_POST_DOMINATORS);
2497   timevar_pop (TV_TREE_UNINIT);
2498   return 0;
2499 }
2500
2501 } // anon namespace
2502
2503 gimple_opt_pass *
2504 make_pass_late_warn_uninitialized (gcc::context *ctxt)
2505 {
2506   return new pass_late_warn_uninitialized (ctxt);
2507 }
2508
2509
2510 static unsigned int
2511 execute_early_warn_uninitialized (void)
2512 {
2513   /* Currently, this pass runs always but
2514      execute_late_warn_uninitialized only runs with optimization. With
2515      optimization we want to warn about possible uninitialized as late
2516      as possible, thus don't do it here.  However, without
2517      optimization we need to warn here about "may be uninitialized".  */
2518   calculate_dominance_info (CDI_POST_DOMINATORS);
2519
2520   warn_uninitialized_vars (/*warn_possibly_uninitialized=*/!optimize);
2521
2522   /* Post-dominator information can not be reliably updated. Free it
2523      after the use.  */
2524
2525   free_dominance_info (CDI_POST_DOMINATORS);
2526   return 0;
2527 }
2528
2529
2530 namespace {
2531
2532 const pass_data pass_data_early_warn_uninitialized =
2533 {
2534   GIMPLE_PASS, /* type */
2535   "*early_warn_uninitialized", /* name */
2536   OPTGROUP_NONE, /* optinfo_flags */
2537   TV_TREE_UNINIT, /* tv_id */
2538   PROP_ssa, /* properties_required */
2539   0, /* properties_provided */
2540   0, /* properties_destroyed */
2541   0, /* todo_flags_start */
2542   0, /* todo_flags_finish */
2543 };
2544
2545 class pass_early_warn_uninitialized : public gimple_opt_pass
2546 {
2547 public:
2548   pass_early_warn_uninitialized (gcc::context *ctxt)
2549     : gimple_opt_pass (pass_data_early_warn_uninitialized, ctxt)
2550   {}
2551
2552   /* opt_pass methods: */
2553   virtual bool gate (function *) { return gate_warn_uninitialized (); }
2554   virtual unsigned int execute (function *)
2555     {
2556       return execute_early_warn_uninitialized ();
2557     }
2558
2559 }; // class pass_early_warn_uninitialized
2560
2561 } // anon namespace
2562
2563 gimple_opt_pass *
2564 make_pass_early_warn_uninitialized (gcc::context *ctxt)
2565 {
2566   return new pass_early_warn_uninitialized (ctxt);
2567 }