tree-if-conv.c revision 1.10
1/* If-conversion for vectorizer.
2   Copyright (C) 2004-2019 Free Software Foundation, Inc.
3   Contributed by Devang Patel <dpatel@apple.com>
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 3, or (at your option) any later
10version.
11
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15for more details.
16
17You should have received a copy of the GNU General Public License
18along with GCC; see the file COPYING3.  If not see
19<http://www.gnu.org/licenses/>.  */
20
21/* This pass implements a tree level if-conversion of loops.  Its
22   initial goal is to help the vectorizer to vectorize loops with
23   conditions.
24
25   A short description of if-conversion:
26
27     o Decide if a loop is if-convertible or not.
28     o Walk all loop basic blocks in breadth first order (BFS order).
29       o Remove conditional statements (at the end of basic block)
30         and propagate condition into destination basic blocks'
31	 predicate list.
32       o Replace modify expression with conditional modify expression
33         using current basic block's condition.
34     o Merge all basic blocks
35       o Replace phi nodes with conditional modify expr
36       o Merge all basic blocks into header
37
38     Sample transformation:
39
40     INPUT
41     -----
42
43     # i_23 = PHI <0(0), i_18(10)>;
44     <L0>:;
45     j_15 = A[i_23];
46     if (j_15 > 41) goto <L1>; else goto <L17>;
47
48     <L17>:;
49     goto <bb 3> (<L3>);
50
51     <L1>:;
52
53     # iftmp.2_4 = PHI <0(8), 42(2)>;
54     <L3>:;
55     A[i_23] = iftmp.2_4;
56     i_18 = i_23 + 1;
57     if (i_18 <= 15) goto <L19>; else goto <L18>;
58
59     <L19>:;
60     goto <bb 1> (<L0>);
61
62     <L18>:;
63
64     OUTPUT
65     ------
66
67     # i_23 = PHI <0(0), i_18(10)>;
68     <L0>:;
69     j_15 = A[i_23];
70
71     <L3>:;
72     iftmp.2_4 = j_15 > 41 ? 42 : 0;
73     A[i_23] = iftmp.2_4;
74     i_18 = i_23 + 1;
75     if (i_18 <= 15) goto <L19>; else goto <L18>;
76
77     <L19>:;
78     goto <bb 1> (<L0>);
79
80     <L18>:;
81*/
82
83#include "config.h"
84#include "system.h"
85#include "coretypes.h"
86#include "backend.h"
87#include "rtl.h"
88#include "tree.h"
89#include "gimple.h"
90#include "cfghooks.h"
91#include "tree-pass.h"
92#include "ssa.h"
93#include "expmed.h"
94#include "optabs-query.h"
95#include "gimple-pretty-print.h"
96#include "alias.h"
97#include "fold-const.h"
98#include "stor-layout.h"
99#include "gimple-fold.h"
100#include "gimplify.h"
101#include "gimple-iterator.h"
102#include "gimplify-me.h"
103#include "tree-cfg.h"
104#include "tree-into-ssa.h"
105#include "tree-ssa.h"
106#include "cfgloop.h"
107#include "tree-data-ref.h"
108#include "tree-scalar-evolution.h"
109#include "tree-ssa-loop.h"
110#include "tree-ssa-loop-niter.h"
111#include "tree-ssa-loop-ivopts.h"
112#include "tree-ssa-address.h"
113#include "dbgcnt.h"
114#include "tree-hash-traits.h"
115#include "varasm.h"
116#include "builtins.h"
117#include "params.h"
118#include "cfganal.h"
119#include "internal-fn.h"
120#include "fold-const.h"
121#include "tree-ssa-sccvn.h"
122#include "tree-cfgcleanup.h"
123
124/* Only handle PHIs with no more arguments unless we are asked to by
125   simd pragma.  */
126#define MAX_PHI_ARG_NUM \
127  ((unsigned) PARAM_VALUE (PARAM_MAX_TREE_IF_CONVERSION_PHI_ARGS))
128
129/* True if we've converted a statement that was only executed when some
130   condition C was true, and if for correctness we need to predicate the
131   statement to ensure that it is a no-op when C is false.  See
132   predicate_statements for the kinds of predication we support.  */
133static bool need_to_predicate;
134
135/* Indicate if there are any complicated PHIs that need to be handled in
136   if-conversion.  Complicated PHI has more than two arguments and can't
137   be degenerated to two arguments PHI.  See more information in comment
138   before phi_convertible_by_degenerating_args.  */
139static bool any_complicated_phi;
140
141/* Hash for struct innermost_loop_behavior.  It depends on the user to
142   free the memory.  */
143
144struct innermost_loop_behavior_hash : nofree_ptr_hash <innermost_loop_behavior>
145{
146  static inline hashval_t hash (const value_type &);
147  static inline bool equal (const value_type &,
148			    const compare_type &);
149};
150
151inline hashval_t
152innermost_loop_behavior_hash::hash (const value_type &e)
153{
154  hashval_t hash;
155
156  hash = iterative_hash_expr (e->base_address, 0);
157  hash = iterative_hash_expr (e->offset, hash);
158  hash = iterative_hash_expr (e->init, hash);
159  return iterative_hash_expr (e->step, hash);
160}
161
162inline bool
163innermost_loop_behavior_hash::equal (const value_type &e1,
164				     const compare_type &e2)
165{
166  if ((e1->base_address && !e2->base_address)
167      || (!e1->base_address && e2->base_address)
168      || (!e1->offset && e2->offset)
169      || (e1->offset && !e2->offset)
170      || (!e1->init && e2->init)
171      || (e1->init && !e2->init)
172      || (!e1->step && e2->step)
173      || (e1->step && !e2->step))
174    return false;
175
176  if (e1->base_address && e2->base_address
177      && !operand_equal_p (e1->base_address, e2->base_address, 0))
178    return false;
179  if (e1->offset && e2->offset
180      && !operand_equal_p (e1->offset, e2->offset, 0))
181    return false;
182  if (e1->init && e2->init
183      && !operand_equal_p (e1->init, e2->init, 0))
184    return false;
185  if (e1->step && e2->step
186      && !operand_equal_p (e1->step, e2->step, 0))
187    return false;
188
189  return true;
190}
191
192/* List of basic blocks in if-conversion-suitable order.  */
193static basic_block *ifc_bbs;
194
195/* Hash table to store <DR's innermost loop behavior, DR> pairs.  */
196static hash_map<innermost_loop_behavior_hash,
197		data_reference_p> *innermost_DR_map;
198
199/* Hash table to store <base reference, DR> pairs.  */
200static hash_map<tree_operand_hash, data_reference_p> *baseref_DR_map;
201
202/* List of redundant SSA names: the first should be replaced by the second.  */
203static vec< std::pair<tree, tree> > redundant_ssa_names;
204
205/* Structure used to predicate basic blocks.  This is attached to the
206   ->aux field of the BBs in the loop to be if-converted.  */
207struct bb_predicate {
208
209  /* The condition under which this basic block is executed.  */
210  tree predicate;
211
212  /* PREDICATE is gimplified, and the sequence of statements is
213     recorded here, in order to avoid the duplication of computations
214     that occur in previous conditions.  See PR44483.  */
215  gimple_seq predicate_gimplified_stmts;
216};
217
218/* Returns true when the basic block BB has a predicate.  */
219
220static inline bool
221bb_has_predicate (basic_block bb)
222{
223  return bb->aux != NULL;
224}
225
226/* Returns the gimplified predicate for basic block BB.  */
227
228static inline tree
229bb_predicate (basic_block bb)
230{
231  return ((struct bb_predicate *) bb->aux)->predicate;
232}
233
234/* Sets the gimplified predicate COND for basic block BB.  */
235
236static inline void
237set_bb_predicate (basic_block bb, tree cond)
238{
239  gcc_assert ((TREE_CODE (cond) == TRUTH_NOT_EXPR
240	       && is_gimple_condexpr (TREE_OPERAND (cond, 0)))
241	      || is_gimple_condexpr (cond));
242  ((struct bb_predicate *) bb->aux)->predicate = cond;
243}
244
245/* Returns the sequence of statements of the gimplification of the
246   predicate for basic block BB.  */
247
248static inline gimple_seq
249bb_predicate_gimplified_stmts (basic_block bb)
250{
251  return ((struct bb_predicate *) bb->aux)->predicate_gimplified_stmts;
252}
253
254/* Sets the sequence of statements STMTS of the gimplification of the
255   predicate for basic block BB.  */
256
257static inline void
258set_bb_predicate_gimplified_stmts (basic_block bb, gimple_seq stmts)
259{
260  ((struct bb_predicate *) bb->aux)->predicate_gimplified_stmts = stmts;
261}
262
263/* Adds the sequence of statements STMTS to the sequence of statements
264   of the predicate for basic block BB.  */
265
266static inline void
267add_bb_predicate_gimplified_stmts (basic_block bb, gimple_seq stmts)
268{
269  /* We might have updated some stmts in STMTS via force_gimple_operand
270     calling fold_stmt and that producing multiple stmts.  Delink immediate
271     uses so update_ssa after loop versioning doesn't get confused for
272     the not yet inserted predicates.
273     ???  This should go away once we reliably avoid updating stmts
274     not in any BB.  */
275  for (gimple_stmt_iterator gsi = gsi_start (stmts);
276       !gsi_end_p (gsi); gsi_next (&gsi))
277    {
278      gimple *stmt = gsi_stmt (gsi);
279      delink_stmt_imm_use (stmt);
280      gimple_set_modified (stmt, true);
281    }
282  gimple_seq_add_seq_without_update
283    (&(((struct bb_predicate *) bb->aux)->predicate_gimplified_stmts), stmts);
284}
285
286/* Initializes to TRUE the predicate of basic block BB.  */
287
288static inline void
289init_bb_predicate (basic_block bb)
290{
291  bb->aux = XNEW (struct bb_predicate);
292  set_bb_predicate_gimplified_stmts (bb, NULL);
293  set_bb_predicate (bb, boolean_true_node);
294}
295
296/* Release the SSA_NAMEs associated with the predicate of basic block BB.  */
297
298static inline void
299release_bb_predicate (basic_block bb)
300{
301  gimple_seq stmts = bb_predicate_gimplified_stmts (bb);
302  if (stmts)
303    {
304      /* Ensure that these stmts haven't yet been added to a bb.  */
305      if (flag_checking)
306	for (gimple_stmt_iterator i = gsi_start (stmts);
307	     !gsi_end_p (i); gsi_next (&i))
308	  gcc_assert (! gimple_bb (gsi_stmt (i)));
309
310      /* Discard them.  */
311      gimple_seq_discard (stmts);
312      set_bb_predicate_gimplified_stmts (bb, NULL);
313    }
314}
315
316/* Free the predicate of basic block BB.  */
317
318static inline void
319free_bb_predicate (basic_block bb)
320{
321  if (!bb_has_predicate (bb))
322    return;
323
324  release_bb_predicate (bb);
325  free (bb->aux);
326  bb->aux = NULL;
327}
328
329/* Reinitialize predicate of BB with the true predicate.  */
330
331static inline void
332reset_bb_predicate (basic_block bb)
333{
334  if (!bb_has_predicate (bb))
335    init_bb_predicate (bb);
336  else
337    {
338      release_bb_predicate (bb);
339      set_bb_predicate (bb, boolean_true_node);
340    }
341}
342
343/* Returns a new SSA_NAME of type TYPE that is assigned the value of
344   the expression EXPR.  Inserts the statement created for this
345   computation before GSI and leaves the iterator GSI at the same
346   statement.  */
347
348static tree
349ifc_temp_var (tree type, tree expr, gimple_stmt_iterator *gsi)
350{
351  tree new_name = make_temp_ssa_name (type, NULL, "_ifc_");
352  gimple *stmt = gimple_build_assign (new_name, expr);
353  gimple_set_vuse (stmt, gimple_vuse (gsi_stmt (*gsi)));
354  gsi_insert_before (gsi, stmt, GSI_SAME_STMT);
355  return new_name;
356}
357
358/* Return true when COND is a false predicate.  */
359
360static inline bool
361is_false_predicate (tree cond)
362{
363  return (cond != NULL_TREE
364	  && (cond == boolean_false_node
365	      || integer_zerop (cond)));
366}
367
368/* Return true when COND is a true predicate.  */
369
370static inline bool
371is_true_predicate (tree cond)
372{
373  return (cond == NULL_TREE
374	  || cond == boolean_true_node
375	  || integer_onep (cond));
376}
377
378/* Returns true when BB has a predicate that is not trivial: true or
379   NULL_TREE.  */
380
381static inline bool
382is_predicated (basic_block bb)
383{
384  return !is_true_predicate (bb_predicate (bb));
385}
386
387/* Parses the predicate COND and returns its comparison code and
388   operands OP0 and OP1.  */
389
390static enum tree_code
391parse_predicate (tree cond, tree *op0, tree *op1)
392{
393  gimple *s;
394
395  if (TREE_CODE (cond) == SSA_NAME
396      && is_gimple_assign (s = SSA_NAME_DEF_STMT (cond)))
397    {
398      if (TREE_CODE_CLASS (gimple_assign_rhs_code (s)) == tcc_comparison)
399	{
400	  *op0 = gimple_assign_rhs1 (s);
401	  *op1 = gimple_assign_rhs2 (s);
402	  return gimple_assign_rhs_code (s);
403	}
404
405      else if (gimple_assign_rhs_code (s) == TRUTH_NOT_EXPR)
406	{
407	  tree op = gimple_assign_rhs1 (s);
408	  tree type = TREE_TYPE (op);
409	  enum tree_code code = parse_predicate (op, op0, op1);
410
411	  return code == ERROR_MARK ? ERROR_MARK
412	    : invert_tree_comparison (code, HONOR_NANS (type));
413	}
414
415      return ERROR_MARK;
416    }
417
418  if (COMPARISON_CLASS_P (cond))
419    {
420      *op0 = TREE_OPERAND (cond, 0);
421      *op1 = TREE_OPERAND (cond, 1);
422      return TREE_CODE (cond);
423    }
424
425  return ERROR_MARK;
426}
427
428/* Returns the fold of predicate C1 OR C2 at location LOC.  */
429
430static tree
431fold_or_predicates (location_t loc, tree c1, tree c2)
432{
433  tree op1a, op1b, op2a, op2b;
434  enum tree_code code1 = parse_predicate (c1, &op1a, &op1b);
435  enum tree_code code2 = parse_predicate (c2, &op2a, &op2b);
436
437  if (code1 != ERROR_MARK && code2 != ERROR_MARK)
438    {
439      tree t = maybe_fold_or_comparisons (code1, op1a, op1b,
440					  code2, op2a, op2b);
441      if (t)
442	return t;
443    }
444
445  return fold_build2_loc (loc, TRUTH_OR_EXPR, boolean_type_node, c1, c2);
446}
447
448/* Returns either a COND_EXPR or the folded expression if the folded
449   expression is a MIN_EXPR, a MAX_EXPR, an ABS_EXPR,
450   a constant or a SSA_NAME. */
451
452static tree
453fold_build_cond_expr (tree type, tree cond, tree rhs, tree lhs)
454{
455  tree rhs1, lhs1, cond_expr;
456
457  /* If COND is comparison r != 0 and r has boolean type, convert COND
458     to SSA_NAME to accept by vect bool pattern.  */
459  if (TREE_CODE (cond) == NE_EXPR)
460    {
461      tree op0 = TREE_OPERAND (cond, 0);
462      tree op1 = TREE_OPERAND (cond, 1);
463      if (TREE_CODE (op0) == SSA_NAME
464	  && TREE_CODE (TREE_TYPE (op0)) == BOOLEAN_TYPE
465	  && (integer_zerop (op1)))
466	cond = op0;
467    }
468  cond_expr = fold_ternary (COND_EXPR, type, cond, rhs, lhs);
469
470  if (cond_expr == NULL_TREE)
471    return build3 (COND_EXPR, type, cond, rhs, lhs);
472
473  STRIP_USELESS_TYPE_CONVERSION (cond_expr);
474
475  if (is_gimple_val (cond_expr))
476    return cond_expr;
477
478  if (TREE_CODE (cond_expr) == ABS_EXPR)
479    {
480      rhs1 = TREE_OPERAND (cond_expr, 1);
481      STRIP_USELESS_TYPE_CONVERSION (rhs1);
482      if (is_gimple_val (rhs1))
483	return build1 (ABS_EXPR, type, rhs1);
484    }
485
486  if (TREE_CODE (cond_expr) == MIN_EXPR
487      || TREE_CODE (cond_expr) == MAX_EXPR)
488    {
489      lhs1 = TREE_OPERAND (cond_expr, 0);
490      STRIP_USELESS_TYPE_CONVERSION (lhs1);
491      rhs1 = TREE_OPERAND (cond_expr, 1);
492      STRIP_USELESS_TYPE_CONVERSION (rhs1);
493      if (is_gimple_val (rhs1) && is_gimple_val (lhs1))
494	return build2 (TREE_CODE (cond_expr), type, lhs1, rhs1);
495    }
496  return build3 (COND_EXPR, type, cond, rhs, lhs);
497}
498
499/* Add condition NC to the predicate list of basic block BB.  LOOP is
500   the loop to be if-converted. Use predicate of cd-equivalent block
501   for join bb if it exists: we call basic blocks bb1 and bb2
502   cd-equivalent if they are executed under the same condition.  */
503
504static inline void
505add_to_predicate_list (struct loop *loop, basic_block bb, tree nc)
506{
507  tree bc, *tp;
508  basic_block dom_bb;
509
510  if (is_true_predicate (nc))
511    return;
512
513  /* If dominance tells us this basic block is always executed,
514     don't record any predicates for it.  */
515  if (dominated_by_p (CDI_DOMINATORS, loop->latch, bb))
516    return;
517
518  dom_bb = get_immediate_dominator (CDI_DOMINATORS, bb);
519  /* We use notion of cd equivalence to get simpler predicate for
520     join block, e.g. if join block has 2 predecessors with predicates
521     p1 & p2 and p1 & !p2, we'd like to get p1 for it instead of
522     p1 & p2 | p1 & !p2.  */
523  if (dom_bb != loop->header
524      && get_immediate_dominator (CDI_POST_DOMINATORS, dom_bb) == bb)
525    {
526      gcc_assert (flow_bb_inside_loop_p (loop, dom_bb));
527      bc = bb_predicate (dom_bb);
528      if (!is_true_predicate (bc))
529	set_bb_predicate (bb, bc);
530      else
531	gcc_assert (is_true_predicate (bb_predicate (bb)));
532      if (dump_file && (dump_flags & TDF_DETAILS))
533	fprintf (dump_file, "Use predicate of bb#%d for bb#%d\n",
534		 dom_bb->index, bb->index);
535      return;
536    }
537
538  if (!is_predicated (bb))
539    bc = nc;
540  else
541    {
542      bc = bb_predicate (bb);
543      bc = fold_or_predicates (EXPR_LOCATION (bc), nc, bc);
544      if (is_true_predicate (bc))
545	{
546	  reset_bb_predicate (bb);
547	  return;
548	}
549    }
550
551  /* Allow a TRUTH_NOT_EXPR around the main predicate.  */
552  if (TREE_CODE (bc) == TRUTH_NOT_EXPR)
553    tp = &TREE_OPERAND (bc, 0);
554  else
555    tp = &bc;
556  if (!is_gimple_condexpr (*tp))
557    {
558      gimple_seq stmts;
559      *tp = force_gimple_operand_1 (*tp, &stmts, is_gimple_condexpr, NULL_TREE);
560      add_bb_predicate_gimplified_stmts (bb, stmts);
561    }
562  set_bb_predicate (bb, bc);
563}
564
565/* Add the condition COND to the previous condition PREV_COND, and add
566   this to the predicate list of the destination of edge E.  LOOP is
567   the loop to be if-converted.  */
568
569static void
570add_to_dst_predicate_list (struct loop *loop, edge e,
571			   tree prev_cond, tree cond)
572{
573  if (!flow_bb_inside_loop_p (loop, e->dest))
574    return;
575
576  if (!is_true_predicate (prev_cond))
577    cond = fold_build2 (TRUTH_AND_EXPR, boolean_type_node,
578			prev_cond, cond);
579
580  if (!dominated_by_p (CDI_DOMINATORS, loop->latch, e->dest))
581    add_to_predicate_list (loop, e->dest, cond);
582}
583
584/* Return true if one of the successor edges of BB exits LOOP.  */
585
586static bool
587bb_with_exit_edge_p (struct loop *loop, basic_block bb)
588{
589  edge e;
590  edge_iterator ei;
591
592  FOR_EACH_EDGE (e, ei, bb->succs)
593    if (loop_exit_edge_p (loop, e))
594      return true;
595
596  return false;
597}
598
599/* Given PHI which has more than two arguments, this function checks if
600   it's if-convertible by degenerating its arguments.  Specifically, if
601   below two conditions are satisfied:
602
603     1) Number of PHI arguments with different values equals to 2 and one
604	argument has the only occurrence.
605     2) The edge corresponding to the unique argument isn't critical edge.
606
607   Such PHI can be handled as PHIs have only two arguments.  For example,
608   below PHI:
609
610     res = PHI <A_1(e1), A_1(e2), A_2(e3)>;
611
612   can be transformed into:
613
614     res = (predicate of e3) ? A_2 : A_1;
615
616   Return TRUE if it is the case, FALSE otherwise.  */
617
618static bool
619phi_convertible_by_degenerating_args (gphi *phi)
620{
621  edge e;
622  tree arg, t1 = NULL, t2 = NULL;
623  unsigned int i, i1 = 0, i2 = 0, n1 = 0, n2 = 0;
624  unsigned int num_args = gimple_phi_num_args (phi);
625
626  gcc_assert (num_args > 2);
627
628  for (i = 0; i < num_args; i++)
629    {
630      arg = gimple_phi_arg_def (phi, i);
631      if (t1 == NULL || operand_equal_p (t1, arg, 0))
632	{
633	  n1++;
634	  i1 = i;
635	  t1 = arg;
636	}
637      else if (t2 == NULL || operand_equal_p (t2, arg, 0))
638	{
639	  n2++;
640	  i2 = i;
641	  t2 = arg;
642	}
643      else
644	return false;
645    }
646
647  if (n1 != 1 && n2 != 1)
648    return false;
649
650  /* Check if the edge corresponding to the unique arg is critical.  */
651  e = gimple_phi_arg_edge (phi, (n1 == 1) ? i1 : i2);
652  if (EDGE_COUNT (e->src->succs) > 1)
653    return false;
654
655  return true;
656}
657
658/* Return true when PHI is if-convertible.  PHI is part of loop LOOP
659   and it belongs to basic block BB.  Note at this point, it is sure
660   that PHI is if-convertible.  This function updates global variable
661   ANY_COMPLICATED_PHI if PHI is complicated.  */
662
663static bool
664if_convertible_phi_p (struct loop *loop, basic_block bb, gphi *phi)
665{
666  if (dump_file && (dump_flags & TDF_DETAILS))
667    {
668      fprintf (dump_file, "-------------------------\n");
669      print_gimple_stmt (dump_file, phi, 0, TDF_SLIM);
670    }
671
672  if (bb != loop->header
673      && gimple_phi_num_args (phi) > 2
674      && !phi_convertible_by_degenerating_args (phi))
675    any_complicated_phi = true;
676
677  return true;
678}
679
680/* Records the status of a data reference.  This struct is attached to
681   each DR->aux field.  */
682
683struct ifc_dr {
684  bool rw_unconditionally;
685  bool w_unconditionally;
686  bool written_at_least_once;
687
688  tree rw_predicate;
689  tree w_predicate;
690  tree base_w_predicate;
691};
692
693#define IFC_DR(DR) ((struct ifc_dr *) (DR)->aux)
694#define DR_BASE_W_UNCONDITIONALLY(DR) (IFC_DR (DR)->written_at_least_once)
695#define DR_RW_UNCONDITIONALLY(DR) (IFC_DR (DR)->rw_unconditionally)
696#define DR_W_UNCONDITIONALLY(DR) (IFC_DR (DR)->w_unconditionally)
697
698/* Iterates over DR's and stores refs, DR and base refs, DR pairs in
699   HASH tables.  While storing them in HASH table, it checks if the
700   reference is unconditionally read or written and stores that as a flag
701   information.  For base reference it checks if it is written atlest once
702   unconditionally and stores it as flag information along with DR.
703   In other words for every data reference A in STMT there exist other
704   accesses to a data reference with the same base with predicates that
705   add up (OR-up) to the true predicate: this ensures that the data
706   reference A is touched (read or written) on every iteration of the
707   if-converted loop.  */
708static void
709hash_memrefs_baserefs_and_store_DRs_read_written_info (data_reference_p a)
710{
711
712  data_reference_p *master_dr, *base_master_dr;
713  tree base_ref = DR_BASE_OBJECT (a);
714  innermost_loop_behavior *innermost = &DR_INNERMOST (a);
715  tree ca = bb_predicate (gimple_bb (DR_STMT (a)));
716  bool exist1, exist2;
717
718  master_dr = &innermost_DR_map->get_or_insert (innermost, &exist1);
719  if (!exist1)
720    *master_dr = a;
721
722  if (DR_IS_WRITE (a))
723    {
724      IFC_DR (*master_dr)->w_predicate
725	= fold_or_predicates (UNKNOWN_LOCATION, ca,
726			      IFC_DR (*master_dr)->w_predicate);
727      if (is_true_predicate (IFC_DR (*master_dr)->w_predicate))
728	DR_W_UNCONDITIONALLY (*master_dr) = true;
729    }
730  IFC_DR (*master_dr)->rw_predicate
731    = fold_or_predicates (UNKNOWN_LOCATION, ca,
732			  IFC_DR (*master_dr)->rw_predicate);
733  if (is_true_predicate (IFC_DR (*master_dr)->rw_predicate))
734    DR_RW_UNCONDITIONALLY (*master_dr) = true;
735
736  if (DR_IS_WRITE (a))
737    {
738      base_master_dr = &baseref_DR_map->get_or_insert (base_ref, &exist2);
739      if (!exist2)
740	*base_master_dr = a;
741      IFC_DR (*base_master_dr)->base_w_predicate
742	= fold_or_predicates (UNKNOWN_LOCATION, ca,
743			      IFC_DR (*base_master_dr)->base_w_predicate);
744      if (is_true_predicate (IFC_DR (*base_master_dr)->base_w_predicate))
745	DR_BASE_W_UNCONDITIONALLY (*base_master_dr) = true;
746    }
747}
748
749/* Return TRUE if can prove the index IDX of an array reference REF is
750   within array bound.  Return false otherwise.  */
751
752static bool
753idx_within_array_bound (tree ref, tree *idx, void *dta)
754{
755  wi::overflow_type overflow;
756  widest_int niter, valid_niter, delta, wi_step;
757  tree ev, init, step;
758  tree low, high;
759  struct loop *loop = (struct loop*) dta;
760
761  /* Only support within-bound access for array references.  */
762  if (TREE_CODE (ref) != ARRAY_REF)
763    return false;
764
765  /* For arrays at the end of the structure, we are not guaranteed that they
766     do not really extend over their declared size.  However, for arrays of
767     size greater than one, this is unlikely to be intended.  */
768  if (array_at_struct_end_p (ref))
769    return false;
770
771  ev = analyze_scalar_evolution (loop, *idx);
772  ev = instantiate_parameters (loop, ev);
773  init = initial_condition (ev);
774  step = evolution_part_in_loop_num (ev, loop->num);
775
776  if (!init || TREE_CODE (init) != INTEGER_CST
777      || (step && TREE_CODE (step) != INTEGER_CST))
778    return false;
779
780  low = array_ref_low_bound (ref);
781  high = array_ref_up_bound (ref);
782
783  /* The case of nonconstant bounds could be handled, but it would be
784     complicated.  */
785  if (TREE_CODE (low) != INTEGER_CST
786      || !high || TREE_CODE (high) != INTEGER_CST)
787    return false;
788
789  /* Check if the intial idx is within bound.  */
790  if (wi::to_widest (init) < wi::to_widest (low)
791      || wi::to_widest (init) > wi::to_widest (high))
792    return false;
793
794  /* The idx is always within bound.  */
795  if (!step || integer_zerop (step))
796    return true;
797
798  if (!max_loop_iterations (loop, &niter))
799    return false;
800
801  if (wi::to_widest (step) < 0)
802    {
803      delta = wi::to_widest (init) - wi::to_widest (low);
804      wi_step = -wi::to_widest (step);
805    }
806  else
807    {
808      delta = wi::to_widest (high) - wi::to_widest (init);
809      wi_step = wi::to_widest (step);
810    }
811
812  valid_niter = wi::div_floor (delta, wi_step, SIGNED, &overflow);
813  /* The iteration space of idx is within array bound.  */
814  if (!overflow && niter <= valid_niter)
815    return true;
816
817  return false;
818}
819
820/* Return TRUE if ref is a within bound array reference.  */
821
822static bool
823ref_within_array_bound (gimple *stmt, tree ref)
824{
825  struct loop *loop = loop_containing_stmt (stmt);
826
827  gcc_assert (loop != NULL);
828  return for_each_index (&ref, idx_within_array_bound, loop);
829}
830
831
832/* Given a memory reference expression T, return TRUE if base object
833   it refers to is writable.  The base object of a memory reference
834   is the main object being referenced, which is returned by function
835   get_base_address.  */
836
837static bool
838base_object_writable (tree ref)
839{
840  tree base_tree = get_base_address (ref);
841
842  return (base_tree
843	  && DECL_P (base_tree)
844	  && decl_binds_to_current_def_p (base_tree)
845	  && !TREE_READONLY (base_tree));
846}
847
848/* Return true when the memory references of STMT won't trap in the
849   if-converted code.  There are two things that we have to check for:
850
851   - writes to memory occur to writable memory: if-conversion of
852   memory writes transforms the conditional memory writes into
853   unconditional writes, i.e. "if (cond) A[i] = foo" is transformed
854   into "A[i] = cond ? foo : A[i]", and as the write to memory may not
855   be executed at all in the original code, it may be a readonly
856   memory.  To check that A is not const-qualified, we check that
857   there exists at least an unconditional write to A in the current
858   function.
859
860   - reads or writes to memory are valid memory accesses for every
861   iteration.  To check that the memory accesses are correctly formed
862   and that we are allowed to read and write in these locations, we
863   check that the memory accesses to be if-converted occur at every
864   iteration unconditionally.
865
866   Returns true for the memory reference in STMT, same memory reference
867   is read or written unconditionally atleast once and the base memory
868   reference is written unconditionally once.  This is to check reference
869   will not write fault.  Also retuns true if the memory reference is
870   unconditionally read once then we are conditionally writing to memory
871   which is defined as read and write and is bound to the definition
872   we are seeing.  */
873static bool
874ifcvt_memrefs_wont_trap (gimple *stmt, vec<data_reference_p> drs)
875{
876  /* If DR didn't see a reference here we can't use it to tell
877     whether the ref traps or not.  */
878  if (gimple_uid (stmt) == 0)
879    return false;
880
881  data_reference_p *master_dr, *base_master_dr;
882  data_reference_p a = drs[gimple_uid (stmt) - 1];
883
884  tree base = DR_BASE_OBJECT (a);
885  innermost_loop_behavior *innermost = &DR_INNERMOST (a);
886
887  gcc_assert (DR_STMT (a) == stmt);
888  gcc_assert (DR_BASE_ADDRESS (a) || DR_OFFSET (a)
889              || DR_INIT (a) || DR_STEP (a));
890
891  master_dr = innermost_DR_map->get (innermost);
892  gcc_assert (master_dr != NULL);
893
894  base_master_dr = baseref_DR_map->get (base);
895
896  /* If a is unconditionally written to it doesn't trap.  */
897  if (DR_W_UNCONDITIONALLY (*master_dr))
898    return true;
899
900  /* If a is unconditionally accessed then ...
901
902     Even a is conditional access, we can treat it as an unconditional
903     one if it's an array reference and all its index are within array
904     bound.  */
905  if (DR_RW_UNCONDITIONALLY (*master_dr)
906      || ref_within_array_bound (stmt, DR_REF (a)))
907    {
908      /* an unconditional read won't trap.  */
909      if (DR_IS_READ (a))
910	return true;
911
912      /* an unconditionaly write won't trap if the base is written
913         to unconditionally.  */
914      if (base_master_dr
915	  && DR_BASE_W_UNCONDITIONALLY (*base_master_dr))
916	return PARAM_VALUE (PARAM_ALLOW_STORE_DATA_RACES);
917      /* or the base is known to be not readonly.  */
918      else if (base_object_writable (DR_REF (a)))
919	return PARAM_VALUE (PARAM_ALLOW_STORE_DATA_RACES);
920    }
921
922  return false;
923}
924
925/* Return true if STMT could be converted into a masked load or store
926   (conditional load or store based on a mask computed from bb predicate).  */
927
928static bool
929ifcvt_can_use_mask_load_store (gimple *stmt)
930{
931  /* Check whether this is a load or store.  */
932  tree lhs = gimple_assign_lhs (stmt);
933  bool is_load;
934  tree ref;
935  if (gimple_store_p (stmt))
936    {
937      if (!is_gimple_val (gimple_assign_rhs1 (stmt)))
938	return false;
939      is_load = false;
940      ref = lhs;
941    }
942  else if (gimple_assign_load_p (stmt))
943    {
944      is_load = true;
945      ref = gimple_assign_rhs1 (stmt);
946    }
947  else
948    return false;
949
950  if (may_be_nonaddressable_p (ref))
951    return false;
952
953  /* Mask should be integer mode of the same size as the load/store
954     mode.  */
955  machine_mode mode = TYPE_MODE (TREE_TYPE (lhs));
956  if (!int_mode_for_mode (mode).exists () || VECTOR_MODE_P (mode))
957    return false;
958
959  if (can_vec_mask_load_store_p (mode, VOIDmode, is_load))
960    return true;
961
962  return false;
963}
964
965/* Return true if STMT could be converted from an operation that is
966   unconditional to one that is conditional on a bb predicate mask.  */
967
968static bool
969ifcvt_can_predicate (gimple *stmt)
970{
971  basic_block bb = gimple_bb (stmt);
972
973  if (!(flag_tree_loop_vectorize || bb->loop_father->force_vectorize)
974      || bb->loop_father->dont_vectorize
975      || gimple_has_volatile_ops (stmt))
976    return false;
977
978  if (gimple_assign_single_p (stmt))
979    return ifcvt_can_use_mask_load_store (stmt);
980
981  tree_code code = gimple_assign_rhs_code (stmt);
982  tree lhs_type = TREE_TYPE (gimple_assign_lhs (stmt));
983  tree rhs_type = TREE_TYPE (gimple_assign_rhs1 (stmt));
984  if (!types_compatible_p (lhs_type, rhs_type))
985    return false;
986  internal_fn cond_fn = get_conditional_internal_fn (code);
987  return (cond_fn != IFN_LAST
988	  && vectorized_internal_fn_supported_p (cond_fn, lhs_type));
989}
990
991/* Return true when STMT is if-convertible.
992
993   GIMPLE_ASSIGN statement is not if-convertible if,
994   - it is not movable,
995   - it could trap,
996   - LHS is not var decl.  */
997
998static bool
999if_convertible_gimple_assign_stmt_p (gimple *stmt,
1000				     vec<data_reference_p> refs)
1001{
1002  tree lhs = gimple_assign_lhs (stmt);
1003
1004  if (dump_file && (dump_flags & TDF_DETAILS))
1005    {
1006      fprintf (dump_file, "-------------------------\n");
1007      print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
1008    }
1009
1010  if (!is_gimple_reg_type (TREE_TYPE (lhs)))
1011    return false;
1012
1013  /* Some of these constrains might be too conservative.  */
1014  if (stmt_ends_bb_p (stmt)
1015      || gimple_has_volatile_ops (stmt)
1016      || (TREE_CODE (lhs) == SSA_NAME
1017          && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs))
1018      || gimple_has_side_effects (stmt))
1019    {
1020      if (dump_file && (dump_flags & TDF_DETAILS))
1021        fprintf (dump_file, "stmt not suitable for ifcvt\n");
1022      return false;
1023    }
1024
1025  /* tree-into-ssa.c uses GF_PLF_1, so avoid it, because
1026     in between if_convertible_loop_p and combine_blocks
1027     we can perform loop versioning.  */
1028  gimple_set_plf (stmt, GF_PLF_2, false);
1029
1030  if ((! gimple_vuse (stmt)
1031       || gimple_could_trap_p_1 (stmt, false, false)
1032       || ! ifcvt_memrefs_wont_trap (stmt, refs))
1033      && gimple_could_trap_p (stmt))
1034    {
1035      if (ifcvt_can_predicate (stmt))
1036	{
1037	  gimple_set_plf (stmt, GF_PLF_2, true);
1038	  need_to_predicate = true;
1039	  return true;
1040	}
1041      if (dump_file && (dump_flags & TDF_DETAILS))
1042	fprintf (dump_file, "tree could trap...\n");
1043      return false;
1044    }
1045
1046  /* When if-converting stores force versioning, likewise if we
1047     ended up generating store data races.  */
1048  if (gimple_vdef (stmt))
1049    need_to_predicate = true;
1050
1051  return true;
1052}
1053
1054/* Return true when STMT is if-convertible.
1055
1056   A statement is if-convertible if:
1057   - it is an if-convertible GIMPLE_ASSIGN,
1058   - it is a GIMPLE_LABEL or a GIMPLE_COND,
1059   - it is builtins call.  */
1060
1061static bool
1062if_convertible_stmt_p (gimple *stmt, vec<data_reference_p> refs)
1063{
1064  switch (gimple_code (stmt))
1065    {
1066    case GIMPLE_LABEL:
1067    case GIMPLE_DEBUG:
1068    case GIMPLE_COND:
1069      return true;
1070
1071    case GIMPLE_ASSIGN:
1072      return if_convertible_gimple_assign_stmt_p (stmt, refs);
1073
1074    case GIMPLE_CALL:
1075      {
1076	tree fndecl = gimple_call_fndecl (stmt);
1077	if (fndecl)
1078	  {
1079	    int flags = gimple_call_flags (stmt);
1080	    if ((flags & ECF_CONST)
1081		&& !(flags & ECF_LOOPING_CONST_OR_PURE)
1082		/* We can only vectorize some builtins at the moment,
1083		   so restrict if-conversion to those.  */
1084		&& fndecl_built_in_p (fndecl))
1085	      return true;
1086	  }
1087	return false;
1088      }
1089
1090    default:
1091      /* Don't know what to do with 'em so don't do anything.  */
1092      if (dump_file && (dump_flags & TDF_DETAILS))
1093	{
1094	  fprintf (dump_file, "don't know what to do\n");
1095	  print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
1096	}
1097      return false;
1098    }
1099
1100  return true;
1101}
1102
1103/* Assumes that BB has more than 1 predecessors.
1104   Returns false if at least one successor is not on critical edge
1105   and true otherwise.  */
1106
1107static inline bool
1108all_preds_critical_p (basic_block bb)
1109{
1110  edge e;
1111  edge_iterator ei;
1112
1113  FOR_EACH_EDGE (e, ei, bb->preds)
1114    if (EDGE_COUNT (e->src->succs) == 1)
1115      return false;
1116  return true;
1117}
1118
1119/* Return true when BB is if-convertible.  This routine does not check
1120   basic block's statements and phis.
1121
1122   A basic block is not if-convertible if:
1123   - it is non-empty and it is after the exit block (in BFS order),
1124   - it is after the exit block but before the latch,
1125   - its edges are not normal.
1126
1127   EXIT_BB is the basic block containing the exit of the LOOP.  BB is
1128   inside LOOP.  */
1129
1130static bool
1131if_convertible_bb_p (struct loop *loop, basic_block bb, basic_block exit_bb)
1132{
1133  edge e;
1134  edge_iterator ei;
1135
1136  if (dump_file && (dump_flags & TDF_DETAILS))
1137    fprintf (dump_file, "----------[%d]-------------\n", bb->index);
1138
1139  if (EDGE_COUNT (bb->succs) > 2)
1140    return false;
1141
1142  if (exit_bb)
1143    {
1144      if (bb != loop->latch)
1145	{
1146	  if (dump_file && (dump_flags & TDF_DETAILS))
1147	    fprintf (dump_file, "basic block after exit bb but before latch\n");
1148	  return false;
1149	}
1150      else if (!empty_block_p (bb))
1151	{
1152	  if (dump_file && (dump_flags & TDF_DETAILS))
1153	    fprintf (dump_file, "non empty basic block after exit bb\n");
1154	  return false;
1155	}
1156      else if (bb == loop->latch
1157	       && bb != exit_bb
1158	       && !dominated_by_p (CDI_DOMINATORS, bb, exit_bb))
1159	  {
1160	    if (dump_file && (dump_flags & TDF_DETAILS))
1161	      fprintf (dump_file, "latch is not dominated by exit_block\n");
1162	    return false;
1163	  }
1164    }
1165
1166  /* Be less adventurous and handle only normal edges.  */
1167  FOR_EACH_EDGE (e, ei, bb->succs)
1168    if (e->flags & (EDGE_EH | EDGE_ABNORMAL | EDGE_IRREDUCIBLE_LOOP))
1169      {
1170	if (dump_file && (dump_flags & TDF_DETAILS))
1171	  fprintf (dump_file, "Difficult to handle edges\n");
1172	return false;
1173      }
1174
1175  return true;
1176}
1177
1178/* Return true when all predecessor blocks of BB are visited.  The
1179   VISITED bitmap keeps track of the visited blocks.  */
1180
1181static bool
1182pred_blocks_visited_p (basic_block bb, bitmap *visited)
1183{
1184  edge e;
1185  edge_iterator ei;
1186  FOR_EACH_EDGE (e, ei, bb->preds)
1187    if (!bitmap_bit_p (*visited, e->src->index))
1188      return false;
1189
1190  return true;
1191}
1192
1193/* Get body of a LOOP in suitable order for if-conversion.  It is
1194   caller's responsibility to deallocate basic block list.
1195   If-conversion suitable order is, breadth first sort (BFS) order
1196   with an additional constraint: select a block only if all its
1197   predecessors are already selected.  */
1198
1199static basic_block *
1200get_loop_body_in_if_conv_order (const struct loop *loop)
1201{
1202  basic_block *blocks, *blocks_in_bfs_order;
1203  basic_block bb;
1204  bitmap visited;
1205  unsigned int index = 0;
1206  unsigned int visited_count = 0;
1207
1208  gcc_assert (loop->num_nodes);
1209  gcc_assert (loop->latch != EXIT_BLOCK_PTR_FOR_FN (cfun));
1210
1211  blocks = XCNEWVEC (basic_block, loop->num_nodes);
1212  visited = BITMAP_ALLOC (NULL);
1213
1214  blocks_in_bfs_order = get_loop_body_in_bfs_order (loop);
1215
1216  index = 0;
1217  while (index < loop->num_nodes)
1218    {
1219      bb = blocks_in_bfs_order [index];
1220
1221      if (bb->flags & BB_IRREDUCIBLE_LOOP)
1222	{
1223	  free (blocks_in_bfs_order);
1224	  BITMAP_FREE (visited);
1225	  free (blocks);
1226	  return NULL;
1227	}
1228
1229      if (!bitmap_bit_p (visited, bb->index))
1230	{
1231	  if (pred_blocks_visited_p (bb, &visited)
1232	      || bb == loop->header)
1233	    {
1234	      /* This block is now visited.  */
1235	      bitmap_set_bit (visited, bb->index);
1236	      blocks[visited_count++] = bb;
1237	    }
1238	}
1239
1240      index++;
1241
1242      if (index == loop->num_nodes
1243	  && visited_count != loop->num_nodes)
1244	/* Not done yet.  */
1245	index = 0;
1246    }
1247  free (blocks_in_bfs_order);
1248  BITMAP_FREE (visited);
1249  return blocks;
1250}
1251
1252/* Returns true when the analysis of the predicates for all the basic
1253   blocks in LOOP succeeded.
1254
1255   predicate_bbs first allocates the predicates of the basic blocks.
1256   These fields are then initialized with the tree expressions
1257   representing the predicates under which a basic block is executed
1258   in the LOOP.  As the loop->header is executed at each iteration, it
1259   has the "true" predicate.  Other statements executed under a
1260   condition are predicated with that condition, for example
1261
1262   | if (x)
1263   |   S1;
1264   | else
1265   |   S2;
1266
1267   S1 will be predicated with "x", and
1268   S2 will be predicated with "!x".  */
1269
1270static void
1271predicate_bbs (loop_p loop)
1272{
1273  unsigned int i;
1274
1275  for (i = 0; i < loop->num_nodes; i++)
1276    init_bb_predicate (ifc_bbs[i]);
1277
1278  for (i = 0; i < loop->num_nodes; i++)
1279    {
1280      basic_block bb = ifc_bbs[i];
1281      tree cond;
1282      gimple *stmt;
1283
1284      /* The loop latch and loop exit block are always executed and
1285	 have no extra conditions to be processed: skip them.  */
1286      if (bb == loop->latch
1287	  || bb_with_exit_edge_p (loop, bb))
1288	{
1289	  reset_bb_predicate (bb);
1290	  continue;
1291	}
1292
1293      cond = bb_predicate (bb);
1294      stmt = last_stmt (bb);
1295      if (stmt && gimple_code (stmt) == GIMPLE_COND)
1296	{
1297	  tree c2;
1298	  edge true_edge, false_edge;
1299	  location_t loc = gimple_location (stmt);
1300	  tree c = build2_loc (loc, gimple_cond_code (stmt),
1301				    boolean_type_node,
1302				    gimple_cond_lhs (stmt),
1303				    gimple_cond_rhs (stmt));
1304
1305	  /* Add new condition into destination's predicate list.  */
1306	  extract_true_false_edges_from_block (gimple_bb (stmt),
1307					       &true_edge, &false_edge);
1308
1309	  /* If C is true, then TRUE_EDGE is taken.  */
1310	  add_to_dst_predicate_list (loop, true_edge, unshare_expr (cond),
1311				     unshare_expr (c));
1312
1313	  /* If C is false, then FALSE_EDGE is taken.  */
1314	  c2 = build1_loc (loc, TRUTH_NOT_EXPR, boolean_type_node,
1315			   unshare_expr (c));
1316	  add_to_dst_predicate_list (loop, false_edge,
1317				     unshare_expr (cond), c2);
1318
1319	  cond = NULL_TREE;
1320	}
1321
1322      /* If current bb has only one successor, then consider it as an
1323	 unconditional goto.  */
1324      if (single_succ_p (bb))
1325	{
1326	  basic_block bb_n = single_succ (bb);
1327
1328	  /* The successor bb inherits the predicate of its
1329	     predecessor.  If there is no predicate in the predecessor
1330	     bb, then consider the successor bb as always executed.  */
1331	  if (cond == NULL_TREE)
1332	    cond = boolean_true_node;
1333
1334	  add_to_predicate_list (loop, bb_n, cond);
1335	}
1336    }
1337
1338  /* The loop header is always executed.  */
1339  reset_bb_predicate (loop->header);
1340  gcc_assert (bb_predicate_gimplified_stmts (loop->header) == NULL
1341	      && bb_predicate_gimplified_stmts (loop->latch) == NULL);
1342}
1343
1344/* Build region by adding loop pre-header and post-header blocks.  */
1345
1346static vec<basic_block>
1347build_region (struct loop *loop)
1348{
1349  vec<basic_block> region = vNULL;
1350  basic_block exit_bb = NULL;
1351
1352  gcc_assert (ifc_bbs);
1353  /* The first element is loop pre-header.  */
1354  region.safe_push (loop_preheader_edge (loop)->src);
1355
1356  for (unsigned int i = 0; i < loop->num_nodes; i++)
1357    {
1358      basic_block bb = ifc_bbs[i];
1359      region.safe_push (bb);
1360      /* Find loop postheader.  */
1361      edge e;
1362      edge_iterator ei;
1363      FOR_EACH_EDGE (e, ei, bb->succs)
1364	if (loop_exit_edge_p (loop, e))
1365	  {
1366	      exit_bb = e->dest;
1367	      break;
1368	  }
1369    }
1370  /* The last element is loop post-header.  */
1371  gcc_assert (exit_bb);
1372  region.safe_push (exit_bb);
1373  return region;
1374}
1375
1376/* Return true when LOOP is if-convertible.  This is a helper function
1377   for if_convertible_loop_p.  REFS and DDRS are initialized and freed
1378   in if_convertible_loop_p.  */
1379
1380static bool
1381if_convertible_loop_p_1 (struct loop *loop, vec<data_reference_p> *refs)
1382{
1383  unsigned int i;
1384  basic_block exit_bb = NULL;
1385  vec<basic_block> region;
1386
1387  if (find_data_references_in_loop (loop, refs) == chrec_dont_know)
1388    return false;
1389
1390  calculate_dominance_info (CDI_DOMINATORS);
1391
1392  /* Allow statements that can be handled during if-conversion.  */
1393  ifc_bbs = get_loop_body_in_if_conv_order (loop);
1394  if (!ifc_bbs)
1395    {
1396      if (dump_file && (dump_flags & TDF_DETAILS))
1397	fprintf (dump_file, "Irreducible loop\n");
1398      return false;
1399    }
1400
1401  for (i = 0; i < loop->num_nodes; i++)
1402    {
1403      basic_block bb = ifc_bbs[i];
1404
1405      if (!if_convertible_bb_p (loop, bb, exit_bb))
1406	return false;
1407
1408      if (bb_with_exit_edge_p (loop, bb))
1409	exit_bb = bb;
1410    }
1411
1412  for (i = 0; i < loop->num_nodes; i++)
1413    {
1414      basic_block bb = ifc_bbs[i];
1415      gimple_stmt_iterator gsi;
1416
1417      for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1418	switch (gimple_code (gsi_stmt (gsi)))
1419	  {
1420	  case GIMPLE_LABEL:
1421	  case GIMPLE_ASSIGN:
1422	  case GIMPLE_CALL:
1423	  case GIMPLE_DEBUG:
1424	  case GIMPLE_COND:
1425	    gimple_set_uid (gsi_stmt (gsi), 0);
1426	    break;
1427	  default:
1428	    return false;
1429	  }
1430    }
1431
1432  data_reference_p dr;
1433
1434  innermost_DR_map
1435	  = new hash_map<innermost_loop_behavior_hash, data_reference_p>;
1436  baseref_DR_map = new hash_map<tree_operand_hash, data_reference_p>;
1437
1438  /* Compute post-dominator tree locally.  */
1439  region = build_region (loop);
1440  calculate_dominance_info_for_region (CDI_POST_DOMINATORS, region);
1441
1442  predicate_bbs (loop);
1443
1444  /* Free post-dominator tree since it is not used after predication.  */
1445  free_dominance_info_for_region (cfun, CDI_POST_DOMINATORS, region);
1446  region.release ();
1447
1448  for (i = 0; refs->iterate (i, &dr); i++)
1449    {
1450      tree ref = DR_REF (dr);
1451
1452      dr->aux = XNEW (struct ifc_dr);
1453      DR_BASE_W_UNCONDITIONALLY (dr) = false;
1454      DR_RW_UNCONDITIONALLY (dr) = false;
1455      DR_W_UNCONDITIONALLY (dr) = false;
1456      IFC_DR (dr)->rw_predicate = boolean_false_node;
1457      IFC_DR (dr)->w_predicate = boolean_false_node;
1458      IFC_DR (dr)->base_w_predicate = boolean_false_node;
1459      if (gimple_uid (DR_STMT (dr)) == 0)
1460	gimple_set_uid (DR_STMT (dr), i + 1);
1461
1462      /* If DR doesn't have innermost loop behavior or it's a compound
1463         memory reference, we synthesize its innermost loop behavior
1464         for hashing.  */
1465      if (TREE_CODE (ref) == COMPONENT_REF
1466          || TREE_CODE (ref) == IMAGPART_EXPR
1467          || TREE_CODE (ref) == REALPART_EXPR
1468          || !(DR_BASE_ADDRESS (dr) || DR_OFFSET (dr)
1469	       || DR_INIT (dr) || DR_STEP (dr)))
1470        {
1471          while (TREE_CODE (ref) == COMPONENT_REF
1472	         || TREE_CODE (ref) == IMAGPART_EXPR
1473	         || TREE_CODE (ref) == REALPART_EXPR)
1474	    ref = TREE_OPERAND (ref, 0);
1475
1476	  memset (&DR_INNERMOST (dr), 0, sizeof (DR_INNERMOST (dr)));
1477	  DR_BASE_ADDRESS (dr) = ref;
1478        }
1479      hash_memrefs_baserefs_and_store_DRs_read_written_info (dr);
1480    }
1481
1482  for (i = 0; i < loop->num_nodes; i++)
1483    {
1484      basic_block bb = ifc_bbs[i];
1485      gimple_stmt_iterator itr;
1486
1487      /* Check the if-convertibility of statements in predicated BBs.  */
1488      if (!dominated_by_p (CDI_DOMINATORS, loop->latch, bb))
1489	for (itr = gsi_start_bb (bb); !gsi_end_p (itr); gsi_next (&itr))
1490	  if (!if_convertible_stmt_p (gsi_stmt (itr), *refs))
1491	    return false;
1492    }
1493
1494  /* Checking PHIs needs to be done after stmts, as the fact whether there
1495     are any masked loads or stores affects the tests.  */
1496  for (i = 0; i < loop->num_nodes; i++)
1497    {
1498      basic_block bb = ifc_bbs[i];
1499      gphi_iterator itr;
1500
1501      for (itr = gsi_start_phis (bb); !gsi_end_p (itr); gsi_next (&itr))
1502	if (!if_convertible_phi_p (loop, bb, itr.phi ()))
1503	  return false;
1504    }
1505
1506  if (dump_file)
1507    fprintf (dump_file, "Applying if-conversion\n");
1508
1509  return true;
1510}
1511
1512/* Return true when LOOP is if-convertible.
1513   LOOP is if-convertible if:
1514   - it is innermost,
1515   - it has two or more basic blocks,
1516   - it has only one exit,
1517   - loop header is not the exit edge,
1518   - if its basic blocks and phi nodes are if convertible.  */
1519
1520static bool
1521if_convertible_loop_p (struct loop *loop)
1522{
1523  edge e;
1524  edge_iterator ei;
1525  bool res = false;
1526  vec<data_reference_p> refs;
1527
1528  /* Handle only innermost loop.  */
1529  if (!loop || loop->inner)
1530    {
1531      if (dump_file && (dump_flags & TDF_DETAILS))
1532	fprintf (dump_file, "not innermost loop\n");
1533      return false;
1534    }
1535
1536  /* If only one block, no need for if-conversion.  */
1537  if (loop->num_nodes <= 2)
1538    {
1539      if (dump_file && (dump_flags & TDF_DETAILS))
1540	fprintf (dump_file, "less than 2 basic blocks\n");
1541      return false;
1542    }
1543
1544  /* More than one loop exit is too much to handle.  */
1545  if (!single_exit (loop))
1546    {
1547      if (dump_file && (dump_flags & TDF_DETAILS))
1548	fprintf (dump_file, "multiple exits\n");
1549      return false;
1550    }
1551
1552  /* If one of the loop header's edge is an exit edge then do not
1553     apply if-conversion.  */
1554  FOR_EACH_EDGE (e, ei, loop->header->succs)
1555    if (loop_exit_edge_p (loop, e))
1556      return false;
1557
1558  refs.create (5);
1559  res = if_convertible_loop_p_1 (loop, &refs);
1560
1561  data_reference_p dr;
1562  unsigned int i;
1563  for (i = 0; refs.iterate (i, &dr); i++)
1564    free (dr->aux);
1565
1566  free_data_refs (refs);
1567
1568  delete innermost_DR_map;
1569  innermost_DR_map = NULL;
1570
1571  delete baseref_DR_map;
1572  baseref_DR_map = NULL;
1573
1574  return res;
1575}
1576
1577/* Returns true if def-stmt for phi argument ARG is simple increment/decrement
1578   which is in predicated basic block.
1579   In fact, the following PHI pattern is searching:
1580      loop-header:
1581	reduc_1 = PHI <..., reduc_2>
1582      ...
1583	if (...)
1584	  reduc_3 = ...
1585	reduc_2 = PHI <reduc_1, reduc_3>
1586
1587   ARG_0 and ARG_1 are correspondent PHI arguments.
1588   REDUC, OP0 and OP1 contain reduction stmt and its operands.
1589   EXTENDED is true if PHI has > 2 arguments.  */
1590
1591static bool
1592is_cond_scalar_reduction (gimple *phi, gimple **reduc, tree arg_0, tree arg_1,
1593			  tree *op0, tree *op1, bool extended)
1594{
1595  tree lhs, r_op1, r_op2;
1596  gimple *stmt;
1597  gimple *header_phi = NULL;
1598  enum tree_code reduction_op;
1599  basic_block bb = gimple_bb (phi);
1600  struct loop *loop = bb->loop_father;
1601  edge latch_e = loop_latch_edge (loop);
1602  imm_use_iterator imm_iter;
1603  use_operand_p use_p;
1604  edge e;
1605  edge_iterator ei;
1606  bool result = false;
1607  if (TREE_CODE (arg_0) != SSA_NAME || TREE_CODE (arg_1) != SSA_NAME)
1608    return false;
1609
1610  if (!extended && gimple_code (SSA_NAME_DEF_STMT (arg_0)) == GIMPLE_PHI)
1611    {
1612      lhs = arg_1;
1613      header_phi = SSA_NAME_DEF_STMT (arg_0);
1614      stmt = SSA_NAME_DEF_STMT (arg_1);
1615    }
1616  else if (gimple_code (SSA_NAME_DEF_STMT (arg_1)) == GIMPLE_PHI)
1617    {
1618      lhs = arg_0;
1619      header_phi = SSA_NAME_DEF_STMT (arg_1);
1620      stmt = SSA_NAME_DEF_STMT (arg_0);
1621    }
1622  else
1623    return false;
1624  if (gimple_bb (header_phi) != loop->header)
1625    return false;
1626
1627  if (PHI_ARG_DEF_FROM_EDGE (header_phi, latch_e) != PHI_RESULT (phi))
1628    return false;
1629
1630  if (gimple_code (stmt) != GIMPLE_ASSIGN
1631      || gimple_has_volatile_ops (stmt))
1632    return false;
1633
1634  if (!flow_bb_inside_loop_p (loop, gimple_bb (stmt)))
1635    return false;
1636
1637  if (!is_predicated (gimple_bb (stmt)))
1638    return false;
1639
1640  /* Check that stmt-block is predecessor of phi-block.  */
1641  FOR_EACH_EDGE (e, ei, gimple_bb (stmt)->succs)
1642    if (e->dest == bb)
1643      {
1644	result = true;
1645	break;
1646      }
1647  if (!result)
1648    return false;
1649
1650  if (!has_single_use (lhs))
1651    return false;
1652
1653  reduction_op = gimple_assign_rhs_code (stmt);
1654  if (reduction_op != PLUS_EXPR && reduction_op != MINUS_EXPR)
1655    return false;
1656  r_op1 = gimple_assign_rhs1 (stmt);
1657  r_op2 = gimple_assign_rhs2 (stmt);
1658
1659  /* Make R_OP1 to hold reduction variable.  */
1660  if (r_op2 == PHI_RESULT (header_phi)
1661      && reduction_op == PLUS_EXPR)
1662    std::swap (r_op1, r_op2);
1663  else if (r_op1 != PHI_RESULT (header_phi))
1664    return false;
1665
1666  /* Check that R_OP1 is used in reduction stmt or in PHI only.  */
1667  FOR_EACH_IMM_USE_FAST (use_p, imm_iter, r_op1)
1668    {
1669      gimple *use_stmt = USE_STMT (use_p);
1670      if (is_gimple_debug (use_stmt))
1671	continue;
1672      if (use_stmt == stmt)
1673	continue;
1674      if (gimple_code (use_stmt) != GIMPLE_PHI)
1675	return false;
1676    }
1677
1678  *op0 = r_op1; *op1 = r_op2;
1679  *reduc = stmt;
1680  return true;
1681}
1682
1683/* Converts conditional scalar reduction into unconditional form, e.g.
1684     bb_4
1685       if (_5 != 0) goto bb_5 else goto bb_6
1686     end_bb_4
1687     bb_5
1688       res_6 = res_13 + 1;
1689     end_bb_5
1690     bb_6
1691       # res_2 = PHI <res_13(4), res_6(5)>
1692     end_bb_6
1693
1694   will be converted into sequence
1695    _ifc__1 = _5 != 0 ? 1 : 0;
1696    res_2 = res_13 + _ifc__1;
1697  Argument SWAP tells that arguments of conditional expression should be
1698  swapped.
1699  Returns rhs of resulting PHI assignment.  */
1700
1701static tree
1702convert_scalar_cond_reduction (gimple *reduc, gimple_stmt_iterator *gsi,
1703			       tree cond, tree op0, tree op1, bool swap)
1704{
1705  gimple_stmt_iterator stmt_it;
1706  gimple *new_assign;
1707  tree rhs;
1708  tree rhs1 = gimple_assign_rhs1 (reduc);
1709  tree tmp = make_temp_ssa_name (TREE_TYPE (rhs1), NULL, "_ifc_");
1710  tree c;
1711  tree zero = build_zero_cst (TREE_TYPE (rhs1));
1712
1713  if (dump_file && (dump_flags & TDF_DETAILS))
1714    {
1715      fprintf (dump_file, "Found cond scalar reduction.\n");
1716      print_gimple_stmt (dump_file, reduc, 0, TDF_SLIM);
1717    }
1718
1719  /* Build cond expression using COND and constant operand
1720     of reduction rhs.  */
1721  c = fold_build_cond_expr (TREE_TYPE (rhs1),
1722			    unshare_expr (cond),
1723			    swap ? zero : op1,
1724			    swap ? op1 : zero);
1725
1726  /* Create assignment stmt and insert it at GSI.  */
1727  new_assign = gimple_build_assign (tmp, c);
1728  gsi_insert_before (gsi, new_assign, GSI_SAME_STMT);
1729  /* Build rhs for unconditional increment/decrement.  */
1730  rhs = fold_build2 (gimple_assign_rhs_code (reduc),
1731		     TREE_TYPE (rhs1), op0, tmp);
1732
1733  /* Delete original reduction stmt.  */
1734  stmt_it = gsi_for_stmt (reduc);
1735  gsi_remove (&stmt_it, true);
1736  release_defs (reduc);
1737  return rhs;
1738}
1739
1740/* Produce condition for all occurrences of ARG in PHI node.  */
1741
1742static tree
1743gen_phi_arg_condition (gphi *phi, vec<int> *occur,
1744		       gimple_stmt_iterator *gsi)
1745{
1746  int len;
1747  int i;
1748  tree cond = NULL_TREE;
1749  tree c;
1750  edge e;
1751
1752  len = occur->length ();
1753  gcc_assert (len > 0);
1754  for (i = 0; i < len; i++)
1755    {
1756      e = gimple_phi_arg_edge (phi, (*occur)[i]);
1757      c = bb_predicate (e->src);
1758      if (is_true_predicate (c))
1759	{
1760	  cond = c;
1761	  break;
1762	}
1763      c = force_gimple_operand_gsi_1 (gsi, unshare_expr (c),
1764				      is_gimple_condexpr, NULL_TREE,
1765				      true, GSI_SAME_STMT);
1766      if (cond != NULL_TREE)
1767	{
1768	  /* Must build OR expression.  */
1769	  cond = fold_or_predicates (EXPR_LOCATION (c), c, cond);
1770	  cond = force_gimple_operand_gsi_1 (gsi, unshare_expr (cond),
1771					     is_gimple_condexpr, NULL_TREE,
1772					     true, GSI_SAME_STMT);
1773	}
1774      else
1775	cond = c;
1776    }
1777  gcc_assert (cond != NULL_TREE);
1778  return cond;
1779}
1780
1781/* Local valueization callback that follows all-use SSA edges.  */
1782
1783static tree
1784ifcvt_follow_ssa_use_edges (tree val)
1785{
1786  return val;
1787}
1788
1789/* Replace a scalar PHI node with a COND_EXPR using COND as condition.
1790   This routine can handle PHI nodes with more than two arguments.
1791
1792   For example,
1793     S1: A = PHI <x1(1), x2(5)>
1794   is converted into,
1795     S2: A = cond ? x1 : x2;
1796
1797   The generated code is inserted at GSI that points to the top of
1798   basic block's statement list.
1799   If PHI node has more than two arguments a chain of conditional
1800   expression is produced.  */
1801
1802
1803static void
1804predicate_scalar_phi (gphi *phi, gimple_stmt_iterator *gsi)
1805{
1806  gimple *new_stmt = NULL, *reduc;
1807  tree rhs, res, arg0, arg1, op0, op1, scev;
1808  tree cond;
1809  unsigned int index0;
1810  unsigned int max, args_len;
1811  edge e;
1812  basic_block bb;
1813  unsigned int i;
1814
1815  res = gimple_phi_result (phi);
1816  if (virtual_operand_p (res))
1817    return;
1818
1819  if ((rhs = degenerate_phi_result (phi))
1820      || ((scev = analyze_scalar_evolution (gimple_bb (phi)->loop_father,
1821					    res))
1822	  && !chrec_contains_undetermined (scev)
1823	  && scev != res
1824	  && (rhs = gimple_phi_arg_def (phi, 0))))
1825    {
1826      if (dump_file && (dump_flags & TDF_DETAILS))
1827	{
1828	  fprintf (dump_file, "Degenerate phi!\n");
1829	  print_gimple_stmt (dump_file, phi, 0, TDF_SLIM);
1830	}
1831      new_stmt = gimple_build_assign (res, rhs);
1832      gsi_insert_before (gsi, new_stmt, GSI_SAME_STMT);
1833      update_stmt (new_stmt);
1834      return;
1835    }
1836
1837  bb = gimple_bb (phi);
1838  if (EDGE_COUNT (bb->preds) == 2)
1839    {
1840      /* Predicate ordinary PHI node with 2 arguments.  */
1841      edge first_edge, second_edge;
1842      basic_block true_bb;
1843      first_edge = EDGE_PRED (bb, 0);
1844      second_edge = EDGE_PRED (bb, 1);
1845      cond = bb_predicate (first_edge->src);
1846      if (TREE_CODE (cond) == TRUTH_NOT_EXPR)
1847	std::swap (first_edge, second_edge);
1848      if (EDGE_COUNT (first_edge->src->succs) > 1)
1849	{
1850	  cond = bb_predicate (second_edge->src);
1851	  if (TREE_CODE (cond) == TRUTH_NOT_EXPR)
1852	    cond = TREE_OPERAND (cond, 0);
1853	  else
1854	    first_edge = second_edge;
1855	}
1856      else
1857	cond = bb_predicate (first_edge->src);
1858      /* Gimplify the condition to a valid cond-expr conditonal operand.  */
1859      cond = force_gimple_operand_gsi_1 (gsi, unshare_expr (cond),
1860					 is_gimple_condexpr, NULL_TREE,
1861					 true, GSI_SAME_STMT);
1862      true_bb = first_edge->src;
1863      if (EDGE_PRED (bb, 1)->src == true_bb)
1864	{
1865	  arg0 = gimple_phi_arg_def (phi, 1);
1866	  arg1 = gimple_phi_arg_def (phi, 0);
1867	}
1868      else
1869	{
1870	  arg0 = gimple_phi_arg_def (phi, 0);
1871	  arg1 = gimple_phi_arg_def (phi, 1);
1872	}
1873      if (is_cond_scalar_reduction (phi, &reduc, arg0, arg1,
1874				    &op0, &op1, false))
1875	/* Convert reduction stmt into vectorizable form.  */
1876	rhs = convert_scalar_cond_reduction (reduc, gsi, cond, op0, op1,
1877					     true_bb != gimple_bb (reduc));
1878      else
1879	/* Build new RHS using selected condition and arguments.  */
1880	rhs = fold_build_cond_expr (TREE_TYPE (res), unshare_expr (cond),
1881				    arg0, arg1);
1882      new_stmt = gimple_build_assign (res, rhs);
1883      gsi_insert_before (gsi, new_stmt, GSI_SAME_STMT);
1884      gimple_stmt_iterator new_gsi = gsi_for_stmt (new_stmt);
1885      if (fold_stmt (&new_gsi, ifcvt_follow_ssa_use_edges))
1886	{
1887	  new_stmt = gsi_stmt (new_gsi);
1888	  update_stmt (new_stmt);
1889	}
1890
1891      if (dump_file && (dump_flags & TDF_DETAILS))
1892	{
1893	  fprintf (dump_file, "new phi replacement stmt\n");
1894	  print_gimple_stmt (dump_file, new_stmt, 0, TDF_SLIM);
1895	}
1896      return;
1897    }
1898
1899  /* Create hashmap for PHI node which contain vector of argument indexes
1900     having the same value.  */
1901  bool swap = false;
1902  hash_map<tree_operand_hash, auto_vec<int> > phi_arg_map;
1903  unsigned int num_args = gimple_phi_num_args (phi);
1904  int max_ind = -1;
1905  /* Vector of different PHI argument values.  */
1906  auto_vec<tree> args (num_args);
1907
1908  /* Compute phi_arg_map.  */
1909  for (i = 0; i < num_args; i++)
1910    {
1911      tree arg;
1912
1913      arg = gimple_phi_arg_def (phi, i);
1914      if (!phi_arg_map.get (arg))
1915	args.quick_push (arg);
1916      phi_arg_map.get_or_insert (arg).safe_push (i);
1917    }
1918
1919  /* Determine element with max number of occurrences.  */
1920  max_ind = -1;
1921  max = 1;
1922  args_len = args.length ();
1923  for (i = 0; i < args_len; i++)
1924    {
1925      unsigned int len;
1926      if ((len = phi_arg_map.get (args[i])->length ()) > max)
1927	{
1928	  max_ind = (int) i;
1929	  max = len;
1930	}
1931    }
1932
1933  /* Put element with max number of occurences to the end of ARGS.  */
1934  if (max_ind != -1 && max_ind +1 != (int) args_len)
1935    std::swap (args[args_len - 1], args[max_ind]);
1936
1937  /* Handle one special case when number of arguments with different values
1938     is equal 2 and one argument has the only occurrence.  Such PHI can be
1939     handled as if would have only 2 arguments.  */
1940  if (args_len == 2 && phi_arg_map.get (args[0])->length () == 1)
1941    {
1942      vec<int> *indexes;
1943      indexes = phi_arg_map.get (args[0]);
1944      index0 = (*indexes)[0];
1945      arg0 = args[0];
1946      arg1 = args[1];
1947      e = gimple_phi_arg_edge (phi, index0);
1948      cond = bb_predicate (e->src);
1949      if (TREE_CODE (cond) == TRUTH_NOT_EXPR)
1950	{
1951	  swap = true;
1952	  cond = TREE_OPERAND (cond, 0);
1953	}
1954      /* Gimplify the condition to a valid cond-expr conditonal operand.  */
1955      cond = force_gimple_operand_gsi_1 (gsi, unshare_expr (cond),
1956					 is_gimple_condexpr, NULL_TREE,
1957					 true, GSI_SAME_STMT);
1958      if (!(is_cond_scalar_reduction (phi, &reduc, arg0 , arg1,
1959				      &op0, &op1, true)))
1960	rhs = fold_build_cond_expr (TREE_TYPE (res), unshare_expr (cond),
1961				    swap? arg1 : arg0,
1962				    swap? arg0 : arg1);
1963      else
1964	/* Convert reduction stmt into vectorizable form.  */
1965	rhs = convert_scalar_cond_reduction (reduc, gsi, cond, op0, op1,
1966					     swap);
1967      new_stmt = gimple_build_assign (res, rhs);
1968      gsi_insert_before (gsi, new_stmt, GSI_SAME_STMT);
1969      update_stmt (new_stmt);
1970    }
1971  else
1972    {
1973      /* Common case.  */
1974      vec<int> *indexes;
1975      tree type = TREE_TYPE (gimple_phi_result (phi));
1976      tree lhs;
1977      arg1 = args[1];
1978      for (i = 0; i < args_len; i++)
1979	{
1980	  arg0 = args[i];
1981	  indexes = phi_arg_map.get (args[i]);
1982	  if (i != args_len - 1)
1983	    lhs = make_temp_ssa_name (type, NULL, "_ifc_");
1984	  else
1985	    lhs = res;
1986	  cond = gen_phi_arg_condition (phi, indexes, gsi);
1987	  rhs = fold_build_cond_expr (type, unshare_expr (cond),
1988				      arg0, arg1);
1989	  new_stmt = gimple_build_assign (lhs, rhs);
1990	  gsi_insert_before (gsi, new_stmt, GSI_SAME_STMT);
1991	  update_stmt (new_stmt);
1992	  arg1 = lhs;
1993	}
1994    }
1995
1996  if (dump_file && (dump_flags & TDF_DETAILS))
1997    {
1998      fprintf (dump_file, "new extended phi replacement stmt\n");
1999      print_gimple_stmt (dump_file, new_stmt, 0, TDF_SLIM);
2000    }
2001}
2002
2003/* Replaces in LOOP all the scalar phi nodes other than those in the
2004   LOOP->header block with conditional modify expressions.  */
2005
2006static void
2007predicate_all_scalar_phis (struct loop *loop)
2008{
2009  basic_block bb;
2010  unsigned int orig_loop_num_nodes = loop->num_nodes;
2011  unsigned int i;
2012
2013  for (i = 1; i < orig_loop_num_nodes; i++)
2014    {
2015      gphi *phi;
2016      gimple_stmt_iterator gsi;
2017      gphi_iterator phi_gsi;
2018      bb = ifc_bbs[i];
2019
2020      if (bb == loop->header)
2021	continue;
2022
2023      phi_gsi = gsi_start_phis (bb);
2024      if (gsi_end_p (phi_gsi))
2025	continue;
2026
2027      gsi = gsi_after_labels (bb);
2028      while (!gsi_end_p (phi_gsi))
2029	{
2030	  phi = phi_gsi.phi ();
2031	  if (virtual_operand_p (gimple_phi_result (phi)))
2032	    gsi_next (&phi_gsi);
2033	  else
2034	    {
2035	      predicate_scalar_phi (phi, &gsi);
2036	      remove_phi_node (&phi_gsi, false);
2037	    }
2038	}
2039    }
2040}
2041
2042/* Insert in each basic block of LOOP the statements produced by the
2043   gimplification of the predicates.  */
2044
2045static void
2046insert_gimplified_predicates (loop_p loop)
2047{
2048  unsigned int i;
2049
2050  for (i = 0; i < loop->num_nodes; i++)
2051    {
2052      basic_block bb = ifc_bbs[i];
2053      gimple_seq stmts;
2054      if (!is_predicated (bb))
2055	gcc_assert (bb_predicate_gimplified_stmts (bb) == NULL);
2056      if (!is_predicated (bb))
2057	{
2058	  /* Do not insert statements for a basic block that is not
2059	     predicated.  Also make sure that the predicate of the
2060	     basic block is set to true.  */
2061	  reset_bb_predicate (bb);
2062	  continue;
2063	}
2064
2065      stmts = bb_predicate_gimplified_stmts (bb);
2066      if (stmts)
2067	{
2068	  if (need_to_predicate)
2069	    {
2070	      /* Insert the predicate of the BB just after the label,
2071		 as the if-conversion of memory writes will use this
2072		 predicate.  */
2073	      gimple_stmt_iterator gsi = gsi_after_labels (bb);
2074	      gsi_insert_seq_before (&gsi, stmts, GSI_SAME_STMT);
2075	    }
2076	  else
2077	    {
2078	      /* Insert the predicate of the BB at the end of the BB
2079		 as this would reduce the register pressure: the only
2080		 use of this predicate will be in successor BBs.  */
2081	      gimple_stmt_iterator gsi = gsi_last_bb (bb);
2082
2083	      if (gsi_end_p (gsi)
2084		  || stmt_ends_bb_p (gsi_stmt (gsi)))
2085		gsi_insert_seq_before (&gsi, stmts, GSI_SAME_STMT);
2086	      else
2087		gsi_insert_seq_after (&gsi, stmts, GSI_SAME_STMT);
2088	    }
2089
2090	  /* Once the sequence is code generated, set it to NULL.  */
2091	  set_bb_predicate_gimplified_stmts (bb, NULL);
2092	}
2093    }
2094}
2095
2096/* Helper function for predicate_statements. Returns index of existent
2097   mask if it was created for given SIZE and -1 otherwise.  */
2098
2099static int
2100mask_exists (int size, vec<int> vec)
2101{
2102  unsigned int ix;
2103  int v;
2104  FOR_EACH_VEC_ELT (vec, ix, v)
2105    if (v == size)
2106      return (int) ix;
2107  return -1;
2108}
2109
2110/* Helper function for predicate_statements.  STMT is a memory read or
2111   write and it needs to be predicated by MASK.  Return a statement
2112   that does so.  */
2113
2114static gimple *
2115predicate_load_or_store (gimple_stmt_iterator *gsi, gassign *stmt, tree mask)
2116{
2117  gcall *new_stmt;
2118
2119  tree lhs = gimple_assign_lhs (stmt);
2120  tree rhs = gimple_assign_rhs1 (stmt);
2121  tree ref = TREE_CODE (lhs) == SSA_NAME ? rhs : lhs;
2122  mark_addressable (ref);
2123  tree addr = force_gimple_operand_gsi (gsi, build_fold_addr_expr (ref),
2124					true, NULL_TREE, true, GSI_SAME_STMT);
2125  tree ptr = build_int_cst (reference_alias_ptr_type (ref),
2126			    get_object_alignment (ref));
2127  /* Copy points-to info if possible.  */
2128  if (TREE_CODE (addr) == SSA_NAME && !SSA_NAME_PTR_INFO (addr))
2129    copy_ref_info (build2 (MEM_REF, TREE_TYPE (ref), addr, ptr),
2130		   ref);
2131  if (TREE_CODE (lhs) == SSA_NAME)
2132    {
2133      new_stmt
2134	= gimple_build_call_internal (IFN_MASK_LOAD, 3, addr,
2135				      ptr, mask);
2136      gimple_call_set_lhs (new_stmt, lhs);
2137      gimple_set_vuse (new_stmt, gimple_vuse (stmt));
2138    }
2139  else
2140    {
2141      new_stmt
2142	= gimple_build_call_internal (IFN_MASK_STORE, 4, addr, ptr,
2143				      mask, rhs);
2144      gimple_set_vuse (new_stmt, gimple_vuse (stmt));
2145      gimple_set_vdef (new_stmt, gimple_vdef (stmt));
2146      SSA_NAME_DEF_STMT (gimple_vdef (new_stmt)) = new_stmt;
2147    }
2148  gimple_call_set_nothrow (new_stmt, true);
2149  return new_stmt;
2150}
2151
2152/* STMT uses OP_LHS.  Check whether it is equivalent to:
2153
2154     ... = OP_MASK ? OP_LHS : X;
2155
2156   Return X if so, otherwise return null.  OP_MASK is an SSA_NAME that is
2157   known to have value OP_COND.  */
2158
2159static tree
2160check_redundant_cond_expr (gimple *stmt, tree op_mask, tree op_cond,
2161			   tree op_lhs)
2162{
2163  gassign *assign = dyn_cast <gassign *> (stmt);
2164  if (!assign || gimple_assign_rhs_code (assign) != COND_EXPR)
2165    return NULL_TREE;
2166
2167  tree use_cond = gimple_assign_rhs1 (assign);
2168  tree if_true = gimple_assign_rhs2 (assign);
2169  tree if_false = gimple_assign_rhs3 (assign);
2170
2171  if ((use_cond == op_mask || operand_equal_p (use_cond, op_cond, 0))
2172      && if_true == op_lhs)
2173    return if_false;
2174
2175  if (inverse_conditions_p (use_cond, op_cond) && if_false == op_lhs)
2176    return if_true;
2177
2178  return NULL_TREE;
2179}
2180
2181/* Return true if VALUE is available for use at STMT.  SSA_NAMES is
2182   the set of SSA names defined earlier in STMT's block.  */
2183
2184static bool
2185value_available_p (gimple *stmt, hash_set<tree_ssa_name_hash> *ssa_names,
2186		   tree value)
2187{
2188  if (is_gimple_min_invariant (value))
2189    return true;
2190
2191  if (TREE_CODE (value) == SSA_NAME)
2192    {
2193      if (SSA_NAME_IS_DEFAULT_DEF (value))
2194	return true;
2195
2196      basic_block def_bb = gimple_bb (SSA_NAME_DEF_STMT (value));
2197      basic_block use_bb = gimple_bb (stmt);
2198      return (def_bb == use_bb
2199	      ? ssa_names->contains (value)
2200	      : dominated_by_p (CDI_DOMINATORS, use_bb, def_bb));
2201    }
2202
2203  return false;
2204}
2205
2206/* Helper function for predicate_statements.  STMT is a potentially-trapping
2207   arithmetic operation that needs to be predicated by MASK, an SSA_NAME that
2208   has value COND.  Return a statement that does so.  SSA_NAMES is the set of
2209   SSA names defined earlier in STMT's block.  */
2210
2211static gimple *
2212predicate_rhs_code (gassign *stmt, tree mask, tree cond,
2213		    hash_set<tree_ssa_name_hash> *ssa_names)
2214{
2215  tree lhs = gimple_assign_lhs (stmt);
2216  tree_code code = gimple_assign_rhs_code (stmt);
2217  unsigned int nops = gimple_num_ops (stmt);
2218  internal_fn cond_fn = get_conditional_internal_fn (code);
2219
2220  /* Construct the arguments to the conditional internal function.   */
2221  auto_vec<tree, 8> args;
2222  args.safe_grow (nops + 1);
2223  args[0] = mask;
2224  for (unsigned int i = 1; i < nops; ++i)
2225    args[i] = gimple_op (stmt, i);
2226  args[nops] = NULL_TREE;
2227
2228  /* Look for uses of the result to see whether they are COND_EXPRs that can
2229     be folded into the conditional call.  */
2230  imm_use_iterator imm_iter;
2231  gimple *use_stmt;
2232  FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, lhs)
2233    {
2234      tree new_else = check_redundant_cond_expr (use_stmt, mask, cond, lhs);
2235      if (new_else && value_available_p (stmt, ssa_names, new_else))
2236	{
2237	  if (!args[nops])
2238	    args[nops] = new_else;
2239	  if (operand_equal_p (new_else, args[nops], 0))
2240	    {
2241	      /* We have:
2242
2243		   LHS = IFN_COND (MASK, ..., ELSE);
2244		   X = MASK ? LHS : ELSE;
2245
2246		 which makes X equivalent to LHS.  */
2247	      tree use_lhs = gimple_assign_lhs (use_stmt);
2248	      redundant_ssa_names.safe_push (std::make_pair (use_lhs, lhs));
2249	    }
2250	}
2251    }
2252  if (!args[nops])
2253    args[nops] = targetm.preferred_else_value (cond_fn, TREE_TYPE (lhs),
2254					       nops - 1, &args[1]);
2255
2256  /* Create and insert the call.  */
2257  gcall *new_stmt = gimple_build_call_internal_vec (cond_fn, args);
2258  gimple_call_set_lhs (new_stmt, lhs);
2259  gimple_call_set_nothrow (new_stmt, true);
2260
2261  return new_stmt;
2262}
2263
2264/* Predicate each write to memory in LOOP.
2265
2266   This function transforms control flow constructs containing memory
2267   writes of the form:
2268
2269   | for (i = 0; i < N; i++)
2270   |   if (cond)
2271   |     A[i] = expr;
2272
2273   into the following form that does not contain control flow:
2274
2275   | for (i = 0; i < N; i++)
2276   |   A[i] = cond ? expr : A[i];
2277
2278   The original CFG looks like this:
2279
2280   | bb_0
2281   |   i = 0
2282   | end_bb_0
2283   |
2284   | bb_1
2285   |   if (i < N) goto bb_5 else goto bb_2
2286   | end_bb_1
2287   |
2288   | bb_2
2289   |   cond = some_computation;
2290   |   if (cond) goto bb_3 else goto bb_4
2291   | end_bb_2
2292   |
2293   | bb_3
2294   |   A[i] = expr;
2295   |   goto bb_4
2296   | end_bb_3
2297   |
2298   | bb_4
2299   |   goto bb_1
2300   | end_bb_4
2301
2302   insert_gimplified_predicates inserts the computation of the COND
2303   expression at the beginning of the destination basic block:
2304
2305   | bb_0
2306   |   i = 0
2307   | end_bb_0
2308   |
2309   | bb_1
2310   |   if (i < N) goto bb_5 else goto bb_2
2311   | end_bb_1
2312   |
2313   | bb_2
2314   |   cond = some_computation;
2315   |   if (cond) goto bb_3 else goto bb_4
2316   | end_bb_2
2317   |
2318   | bb_3
2319   |   cond = some_computation;
2320   |   A[i] = expr;
2321   |   goto bb_4
2322   | end_bb_3
2323   |
2324   | bb_4
2325   |   goto bb_1
2326   | end_bb_4
2327
2328   predicate_statements is then predicating the memory write as follows:
2329
2330   | bb_0
2331   |   i = 0
2332   | end_bb_0
2333   |
2334   | bb_1
2335   |   if (i < N) goto bb_5 else goto bb_2
2336   | end_bb_1
2337   |
2338   | bb_2
2339   |   if (cond) goto bb_3 else goto bb_4
2340   | end_bb_2
2341   |
2342   | bb_3
2343   |   cond = some_computation;
2344   |   A[i] = cond ? expr : A[i];
2345   |   goto bb_4
2346   | end_bb_3
2347   |
2348   | bb_4
2349   |   goto bb_1
2350   | end_bb_4
2351
2352   and finally combine_blocks removes the basic block boundaries making
2353   the loop vectorizable:
2354
2355   | bb_0
2356   |   i = 0
2357   |   if (i < N) goto bb_5 else goto bb_1
2358   | end_bb_0
2359   |
2360   | bb_1
2361   |   cond = some_computation;
2362   |   A[i] = cond ? expr : A[i];
2363   |   if (i < N) goto bb_5 else goto bb_4
2364   | end_bb_1
2365   |
2366   | bb_4
2367   |   goto bb_1
2368   | end_bb_4
2369*/
2370
2371static void
2372predicate_statements (loop_p loop)
2373{
2374  unsigned int i, orig_loop_num_nodes = loop->num_nodes;
2375  auto_vec<int, 1> vect_sizes;
2376  auto_vec<tree, 1> vect_masks;
2377  hash_set<tree_ssa_name_hash> ssa_names;
2378
2379  for (i = 1; i < orig_loop_num_nodes; i++)
2380    {
2381      gimple_stmt_iterator gsi;
2382      basic_block bb = ifc_bbs[i];
2383      tree cond = bb_predicate (bb);
2384      bool swap;
2385      int index;
2386
2387      if (is_true_predicate (cond))
2388	continue;
2389
2390      swap = false;
2391      if (TREE_CODE (cond) == TRUTH_NOT_EXPR)
2392	{
2393	  swap = true;
2394	  cond = TREE_OPERAND (cond, 0);
2395	}
2396
2397      vect_sizes.truncate (0);
2398      vect_masks.truncate (0);
2399
2400      for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi);)
2401	{
2402	  gassign *stmt = dyn_cast <gassign *> (gsi_stmt (gsi));
2403	  if (!stmt)
2404	    ;
2405	  else if (is_false_predicate (cond)
2406		   && gimple_vdef (stmt))
2407	    {
2408	      unlink_stmt_vdef (stmt);
2409	      gsi_remove (&gsi, true);
2410	      release_defs (stmt);
2411	      continue;
2412	    }
2413	  else if (gimple_plf (stmt, GF_PLF_2))
2414	    {
2415	      tree lhs = gimple_assign_lhs (stmt);
2416	      tree mask;
2417	      gimple *new_stmt;
2418	      gimple_seq stmts = NULL;
2419	      machine_mode mode = TYPE_MODE (TREE_TYPE (lhs));
2420	      /* We checked before setting GF_PLF_2 that an equivalent
2421		 integer mode exists.  */
2422	      int bitsize = GET_MODE_BITSIZE (mode).to_constant ();
2423	      if (!vect_sizes.is_empty ()
2424		  && (index = mask_exists (bitsize, vect_sizes)) != -1)
2425		/* Use created mask.  */
2426		mask = vect_masks[index];
2427	      else
2428		{
2429		  if (COMPARISON_CLASS_P (cond))
2430		    mask = gimple_build (&stmts, TREE_CODE (cond),
2431					 boolean_type_node,
2432					 TREE_OPERAND (cond, 0),
2433					 TREE_OPERAND (cond, 1));
2434		  else
2435		    mask = cond;
2436
2437		  if (swap)
2438		    {
2439		      tree true_val
2440			= constant_boolean_node (true, TREE_TYPE (mask));
2441		      mask = gimple_build (&stmts, BIT_XOR_EXPR,
2442					   TREE_TYPE (mask), mask, true_val);
2443		    }
2444		  gsi_insert_seq_before (&gsi, stmts, GSI_SAME_STMT);
2445
2446		  /* Save mask and its size for further use.  */
2447		  vect_sizes.safe_push (bitsize);
2448		  vect_masks.safe_push (mask);
2449		}
2450	      if (gimple_assign_single_p (stmt))
2451		new_stmt = predicate_load_or_store (&gsi, stmt, mask);
2452	      else
2453		new_stmt = predicate_rhs_code (stmt, mask, cond, &ssa_names);
2454
2455	      gsi_replace (&gsi, new_stmt, true);
2456	    }
2457	  else if (gimple_vdef (stmt))
2458	    {
2459	      tree lhs = gimple_assign_lhs (stmt);
2460	      tree rhs = gimple_assign_rhs1 (stmt);
2461	      tree type = TREE_TYPE (lhs);
2462
2463	      lhs = ifc_temp_var (type, unshare_expr (lhs), &gsi);
2464	      rhs = ifc_temp_var (type, unshare_expr (rhs), &gsi);
2465	      if (swap)
2466		std::swap (lhs, rhs);
2467	      cond = force_gimple_operand_gsi_1 (&gsi, unshare_expr (cond),
2468						 is_gimple_condexpr, NULL_TREE,
2469						 true, GSI_SAME_STMT);
2470	      rhs = fold_build_cond_expr (type, unshare_expr (cond), rhs, lhs);
2471	      gimple_assign_set_rhs1 (stmt, ifc_temp_var (type, rhs, &gsi));
2472	      update_stmt (stmt);
2473	    }
2474	  tree lhs = gimple_get_lhs (gsi_stmt (gsi));
2475	  if (lhs && TREE_CODE (lhs) == SSA_NAME)
2476	    ssa_names.add (lhs);
2477	  gsi_next (&gsi);
2478	}
2479      ssa_names.empty ();
2480    }
2481}
2482
2483/* Remove all GIMPLE_CONDs and GIMPLE_LABELs of all the basic blocks
2484   other than the exit and latch of the LOOP.  Also resets the
2485   GIMPLE_DEBUG information.  */
2486
2487static void
2488remove_conditions_and_labels (loop_p loop)
2489{
2490  gimple_stmt_iterator gsi;
2491  unsigned int i;
2492
2493  for (i = 0; i < loop->num_nodes; i++)
2494    {
2495      basic_block bb = ifc_bbs[i];
2496
2497      if (bb_with_exit_edge_p (loop, bb)
2498        || bb == loop->latch)
2499      continue;
2500
2501      for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); )
2502	switch (gimple_code (gsi_stmt (gsi)))
2503	  {
2504	  case GIMPLE_COND:
2505	  case GIMPLE_LABEL:
2506	    gsi_remove (&gsi, true);
2507	    break;
2508
2509	  case GIMPLE_DEBUG:
2510	    /* ??? Should there be conditional GIMPLE_DEBUG_BINDs?  */
2511	    if (gimple_debug_bind_p (gsi_stmt (gsi)))
2512	      {
2513		gimple_debug_bind_reset_value (gsi_stmt (gsi));
2514		update_stmt (gsi_stmt (gsi));
2515	      }
2516	    gsi_next (&gsi);
2517	    break;
2518
2519	  default:
2520	    gsi_next (&gsi);
2521	  }
2522    }
2523}
2524
2525/* Combine all the basic blocks from LOOP into one or two super basic
2526   blocks.  Replace PHI nodes with conditional modify expressions.  */
2527
2528static void
2529combine_blocks (struct loop *loop)
2530{
2531  basic_block bb, exit_bb, merge_target_bb;
2532  unsigned int orig_loop_num_nodes = loop->num_nodes;
2533  unsigned int i;
2534  edge e;
2535  edge_iterator ei;
2536
2537  remove_conditions_and_labels (loop);
2538  insert_gimplified_predicates (loop);
2539  predicate_all_scalar_phis (loop);
2540
2541  if (need_to_predicate)
2542    predicate_statements (loop);
2543
2544  /* Merge basic blocks: first remove all the edges in the loop,
2545     except for those from the exit block.  */
2546  exit_bb = NULL;
2547  bool *predicated = XNEWVEC (bool, orig_loop_num_nodes);
2548  for (i = 0; i < orig_loop_num_nodes; i++)
2549    {
2550      bb = ifc_bbs[i];
2551      predicated[i] = !is_true_predicate (bb_predicate (bb));
2552      free_bb_predicate (bb);
2553      if (bb_with_exit_edge_p (loop, bb))
2554	{
2555	  gcc_assert (exit_bb == NULL);
2556	  exit_bb = bb;
2557	}
2558    }
2559  gcc_assert (exit_bb != loop->latch);
2560
2561  for (i = 1; i < orig_loop_num_nodes; i++)
2562    {
2563      bb = ifc_bbs[i];
2564
2565      for (ei = ei_start (bb->preds); (e = ei_safe_edge (ei));)
2566	{
2567	  if (e->src == exit_bb)
2568	    ei_next (&ei);
2569	  else
2570	    remove_edge (e);
2571	}
2572    }
2573
2574  if (exit_bb != NULL)
2575    {
2576      if (exit_bb != loop->header)
2577	{
2578	  /* Connect this node to loop header.  */
2579	  make_single_succ_edge (loop->header, exit_bb, EDGE_FALLTHRU);
2580	  set_immediate_dominator (CDI_DOMINATORS, exit_bb, loop->header);
2581	}
2582
2583      /* Redirect non-exit edges to loop->latch.  */
2584      FOR_EACH_EDGE (e, ei, exit_bb->succs)
2585	{
2586	  if (!loop_exit_edge_p (loop, e))
2587	    redirect_edge_and_branch (e, loop->latch);
2588	}
2589      set_immediate_dominator (CDI_DOMINATORS, loop->latch, exit_bb);
2590    }
2591  else
2592    {
2593      /* If the loop does not have an exit, reconnect header and latch.  */
2594      make_edge (loop->header, loop->latch, EDGE_FALLTHRU);
2595      set_immediate_dominator (CDI_DOMINATORS, loop->latch, loop->header);
2596    }
2597
2598  merge_target_bb = loop->header;
2599
2600  /* Get at the virtual def valid for uses starting at the first block
2601     we merge into the header.  Without a virtual PHI the loop has the
2602     same virtual use on all stmts.  */
2603  gphi *vphi = get_virtual_phi (loop->header);
2604  tree last_vdef = NULL_TREE;
2605  if (vphi)
2606    {
2607      last_vdef = gimple_phi_result (vphi);
2608      for (gimple_stmt_iterator gsi = gsi_start_bb (loop->header);
2609	   ! gsi_end_p (gsi); gsi_next (&gsi))
2610	if (gimple_vdef (gsi_stmt (gsi)))
2611	  last_vdef = gimple_vdef (gsi_stmt (gsi));
2612    }
2613  for (i = 1; i < orig_loop_num_nodes; i++)
2614    {
2615      gimple_stmt_iterator gsi;
2616      gimple_stmt_iterator last;
2617
2618      bb = ifc_bbs[i];
2619
2620      if (bb == exit_bb || bb == loop->latch)
2621	continue;
2622
2623      /* We release virtual PHIs late because we have to propagate them
2624         out using the current VUSE.  The def might be the one used
2625	 after the loop.  */
2626      vphi = get_virtual_phi (bb);
2627      if (vphi)
2628	{
2629	  /* When there's just loads inside the loop a stray virtual
2630	     PHI merging the uses can appear, update last_vdef from
2631	     it.  */
2632	  if (!last_vdef)
2633	    last_vdef = gimple_phi_arg_def (vphi, 0);
2634	  imm_use_iterator iter;
2635	  use_operand_p use_p;
2636	  gimple *use_stmt;
2637	  FOR_EACH_IMM_USE_STMT (use_stmt, iter, gimple_phi_result (vphi))
2638	    {
2639	      FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
2640		SET_USE (use_p, last_vdef);
2641	    }
2642	  if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (gimple_phi_result (vphi)))
2643	    SSA_NAME_OCCURS_IN_ABNORMAL_PHI (last_vdef) = 1;
2644	  gsi = gsi_for_stmt (vphi);
2645	  remove_phi_node (&gsi, true);
2646	}
2647
2648      /* Make stmts member of loop->header and clear range info from all stmts
2649	 in BB which is now no longer executed conditional on a predicate we
2650	 could have derived it from.  */
2651      for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
2652	{
2653	  gimple *stmt = gsi_stmt (gsi);
2654	  gimple_set_bb (stmt, merge_target_bb);
2655	  /* Update virtual operands.  */
2656	  if (last_vdef)
2657	    {
2658	      use_operand_p use_p = ssa_vuse_operand (stmt);
2659	      if (use_p
2660		  && USE_FROM_PTR (use_p) != last_vdef)
2661		SET_USE (use_p, last_vdef);
2662	      if (gimple_vdef (stmt))
2663		last_vdef = gimple_vdef (stmt);
2664	    }
2665	  else
2666	    /* If this is the first load we arrive at update last_vdef
2667	       so we handle stray PHIs correctly.  */
2668	    last_vdef = gimple_vuse (stmt);
2669	  if (predicated[i])
2670	    {
2671	      ssa_op_iter i;
2672	      tree op;
2673	      FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_DEF)
2674		reset_flow_sensitive_info (op);
2675	    }
2676	}
2677
2678      /* Update stmt list.  */
2679      last = gsi_last_bb (merge_target_bb);
2680      gsi_insert_seq_after_without_update (&last, bb_seq (bb), GSI_NEW_STMT);
2681      set_bb_seq (bb, NULL);
2682
2683      delete_basic_block (bb);
2684    }
2685
2686  /* If possible, merge loop header to the block with the exit edge.
2687     This reduces the number of basic blocks to two, to please the
2688     vectorizer that handles only loops with two nodes.  */
2689  if (exit_bb
2690      && exit_bb != loop->header)
2691    {
2692      /* We release virtual PHIs late because we have to propagate them
2693         out using the current VUSE.  The def might be the one used
2694	 after the loop.  */
2695      vphi = get_virtual_phi (exit_bb);
2696      if (vphi)
2697	{
2698	  imm_use_iterator iter;
2699	  use_operand_p use_p;
2700	  gimple *use_stmt;
2701	  FOR_EACH_IMM_USE_STMT (use_stmt, iter, gimple_phi_result (vphi))
2702	    {
2703	      FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
2704		SET_USE (use_p, last_vdef);
2705	    }
2706	  if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (gimple_phi_result (vphi)))
2707	    SSA_NAME_OCCURS_IN_ABNORMAL_PHI (last_vdef) = 1;
2708	  gimple_stmt_iterator gsi = gsi_for_stmt (vphi);
2709	  remove_phi_node (&gsi, true);
2710	}
2711
2712      if (can_merge_blocks_p (loop->header, exit_bb))
2713	merge_blocks (loop->header, exit_bb);
2714    }
2715
2716  free (ifc_bbs);
2717  ifc_bbs = NULL;
2718  free (predicated);
2719}
2720
2721/* Version LOOP before if-converting it; the original loop
2722   will be if-converted, the new copy of the loop will not,
2723   and the LOOP_VECTORIZED internal call will be guarding which
2724   loop to execute.  The vectorizer pass will fold this
2725   internal call into either true or false.
2726
2727   Note that this function intentionally invalidates profile.  Both edges
2728   out of LOOP_VECTORIZED must have 100% probability so the profile remains
2729   consistent after the condition is folded in the vectorizer.  */
2730
2731static struct loop *
2732version_loop_for_if_conversion (struct loop *loop, vec<gimple *> *preds)
2733{
2734  basic_block cond_bb;
2735  tree cond = make_ssa_name (boolean_type_node);
2736  struct loop *new_loop;
2737  gimple *g;
2738  gimple_stmt_iterator gsi;
2739  unsigned int save_length;
2740
2741  g = gimple_build_call_internal (IFN_LOOP_VECTORIZED, 2,
2742				  build_int_cst (integer_type_node, loop->num),
2743				  integer_zero_node);
2744  gimple_call_set_lhs (g, cond);
2745
2746  /* Save BB->aux around loop_version as that uses the same field.  */
2747  save_length = loop->inner ? loop->inner->num_nodes : loop->num_nodes;
2748  void **saved_preds = XALLOCAVEC (void *, save_length);
2749  for (unsigned i = 0; i < save_length; i++)
2750    saved_preds[i] = ifc_bbs[i]->aux;
2751
2752  initialize_original_copy_tables ();
2753  /* At this point we invalidate porfile confistency until IFN_LOOP_VECTORIZED
2754     is re-merged in the vectorizer.  */
2755  new_loop = loop_version (loop, cond, &cond_bb,
2756			   profile_probability::always (),
2757			   profile_probability::always (),
2758			   profile_probability::always (),
2759			   profile_probability::always (), true);
2760  free_original_copy_tables ();
2761
2762  for (unsigned i = 0; i < save_length; i++)
2763    ifc_bbs[i]->aux = saved_preds[i];
2764
2765  if (new_loop == NULL)
2766    return NULL;
2767
2768  new_loop->dont_vectorize = true;
2769  new_loop->force_vectorize = false;
2770  gsi = gsi_last_bb (cond_bb);
2771  gimple_call_set_arg (g, 1, build_int_cst (integer_type_node, new_loop->num));
2772  if (preds)
2773    preds->safe_push (g);
2774  gsi_insert_before (&gsi, g, GSI_SAME_STMT);
2775  update_ssa (TODO_update_ssa);
2776  return new_loop;
2777}
2778
2779/* Return true when LOOP satisfies the follow conditions that will
2780   allow it to be recognized by the vectorizer for outer-loop
2781   vectorization:
2782    - The loop is not the root node of the loop tree.
2783    - The loop has exactly one inner loop.
2784    - The loop has a single exit.
2785    - The loop header has a single successor, which is the inner
2786      loop header.
2787    - Each of the inner and outer loop latches have a single
2788      predecessor.
2789    - The loop exit block has a single predecessor, which is the
2790      inner loop's exit block.  */
2791
2792static bool
2793versionable_outer_loop_p (struct loop *loop)
2794{
2795  if (!loop_outer (loop)
2796      || loop->dont_vectorize
2797      || !loop->inner
2798      || loop->inner->next
2799      || !single_exit (loop)
2800      || !single_succ_p (loop->header)
2801      || single_succ (loop->header) != loop->inner->header
2802      || !single_pred_p (loop->latch)
2803      || !single_pred_p (loop->inner->latch))
2804    return false;
2805
2806  basic_block outer_exit = single_pred (loop->latch);
2807  basic_block inner_exit = single_pred (loop->inner->latch);
2808
2809  if (!single_pred_p (outer_exit) || single_pred (outer_exit) != inner_exit)
2810    return false;
2811
2812  if (dump_file)
2813    fprintf (dump_file, "Found vectorizable outer loop for versioning\n");
2814
2815  return true;
2816}
2817
2818/* Performs splitting of critical edges.  Skip splitting and return false
2819   if LOOP will not be converted because:
2820
2821     - LOOP is not well formed.
2822     - LOOP has PHI with more than MAX_PHI_ARG_NUM arguments.
2823
2824   Last restriction is valid only if AGGRESSIVE_IF_CONV is false.  */
2825
2826static bool
2827ifcvt_split_critical_edges (struct loop *loop, bool aggressive_if_conv)
2828{
2829  basic_block *body;
2830  basic_block bb;
2831  unsigned int num = loop->num_nodes;
2832  unsigned int i;
2833  gimple *stmt;
2834  edge e;
2835  edge_iterator ei;
2836  auto_vec<edge> critical_edges;
2837
2838  /* Loop is not well formed.  */
2839  if (num <= 2 || loop->inner || !single_exit (loop))
2840    return false;
2841
2842  body = get_loop_body (loop);
2843  for (i = 0; i < num; i++)
2844    {
2845      bb = body[i];
2846      if (!aggressive_if_conv
2847	  && phi_nodes (bb)
2848	  && EDGE_COUNT (bb->preds) > MAX_PHI_ARG_NUM)
2849	{
2850	  if (dump_file && (dump_flags & TDF_DETAILS))
2851	    fprintf (dump_file,
2852		     "BB %d has complicated PHI with more than %u args.\n",
2853		     bb->index, MAX_PHI_ARG_NUM);
2854
2855	  free (body);
2856	  return false;
2857	}
2858      if (bb == loop->latch || bb_with_exit_edge_p (loop, bb))
2859	continue;
2860
2861      stmt = last_stmt (bb);
2862      /* Skip basic blocks not ending with conditional branch.  */
2863      if (!stmt || gimple_code (stmt) != GIMPLE_COND)
2864	continue;
2865
2866      FOR_EACH_EDGE (e, ei, bb->succs)
2867	if (EDGE_CRITICAL_P (e) && e->dest->loop_father == loop)
2868	  critical_edges.safe_push (e);
2869    }
2870  free (body);
2871
2872  while (critical_edges.length () > 0)
2873    {
2874      e = critical_edges.pop ();
2875      /* Don't split if bb can be predicated along non-critical edge.  */
2876      if (EDGE_COUNT (e->dest->preds) > 2 || all_preds_critical_p (e->dest))
2877	split_edge (e);
2878    }
2879
2880  return true;
2881}
2882
2883/* Delete redundant statements produced by predication which prevents
2884   loop vectorization.  */
2885
2886static void
2887ifcvt_local_dce (basic_block bb)
2888{
2889  gimple *stmt;
2890  gimple *stmt1;
2891  gimple *phi;
2892  gimple_stmt_iterator gsi;
2893  auto_vec<gimple *> worklist;
2894  enum gimple_code code;
2895  use_operand_p use_p;
2896  imm_use_iterator imm_iter;
2897  std::pair <tree, tree> *name_pair;
2898  unsigned int i;
2899
2900  FOR_EACH_VEC_ELT (redundant_ssa_names, i, name_pair)
2901    replace_uses_by (name_pair->first, name_pair->second);
2902  redundant_ssa_names.release ();
2903
2904  worklist.create (64);
2905  /* Consider all phi as live statements.  */
2906  for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
2907    {
2908      phi = gsi_stmt (gsi);
2909      gimple_set_plf (phi, GF_PLF_2, true);
2910      worklist.safe_push (phi);
2911    }
2912  /* Consider load/store statements, CALL and COND as live.  */
2913  for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
2914    {
2915      stmt = gsi_stmt (gsi);
2916      if (gimple_store_p (stmt)
2917	  || gimple_assign_load_p (stmt)
2918	  || is_gimple_debug (stmt))
2919	{
2920	  gimple_set_plf (stmt, GF_PLF_2, true);
2921	  worklist.safe_push (stmt);
2922	  continue;
2923	}
2924      code = gimple_code (stmt);
2925      if (code == GIMPLE_COND || code == GIMPLE_CALL)
2926	{
2927	  gimple_set_plf (stmt, GF_PLF_2, true);
2928	  worklist.safe_push (stmt);
2929	  continue;
2930	}
2931      gimple_set_plf (stmt, GF_PLF_2, false);
2932
2933      if (code == GIMPLE_ASSIGN)
2934	{
2935	  tree lhs = gimple_assign_lhs (stmt);
2936	  FOR_EACH_IMM_USE_FAST (use_p, imm_iter, lhs)
2937	    {
2938	      stmt1 = USE_STMT (use_p);
2939	      if (gimple_bb (stmt1) != bb)
2940		{
2941		  gimple_set_plf (stmt, GF_PLF_2, true);
2942		  worklist.safe_push (stmt);
2943		  break;
2944		}
2945	    }
2946	}
2947    }
2948  /* Propagate liveness through arguments of live stmt.  */
2949  while (worklist.length () > 0)
2950    {
2951      ssa_op_iter iter;
2952      use_operand_p use_p;
2953      tree use;
2954
2955      stmt = worklist.pop ();
2956      FOR_EACH_PHI_OR_STMT_USE (use_p, stmt, iter, SSA_OP_USE)
2957	{
2958	  use = USE_FROM_PTR (use_p);
2959	  if (TREE_CODE (use) != SSA_NAME)
2960	    continue;
2961	  stmt1 = SSA_NAME_DEF_STMT (use);
2962	  if (gimple_bb (stmt1) != bb
2963	      || gimple_plf (stmt1, GF_PLF_2))
2964	    continue;
2965	  gimple_set_plf (stmt1, GF_PLF_2, true);
2966	  worklist.safe_push (stmt1);
2967	}
2968    }
2969  /* Delete dead statements.  */
2970  gsi = gsi_start_bb (bb);
2971  while (!gsi_end_p (gsi))
2972    {
2973      stmt = gsi_stmt (gsi);
2974      if (gimple_plf (stmt, GF_PLF_2))
2975	{
2976	  gsi_next (&gsi);
2977	  continue;
2978	}
2979      if (dump_file && (dump_flags & TDF_DETAILS))
2980	{
2981	  fprintf (dump_file, "Delete dead stmt in bb#%d\n", bb->index);
2982	  print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
2983	}
2984      gsi_remove (&gsi, true);
2985      release_defs (stmt);
2986    }
2987}
2988
2989/* If-convert LOOP when it is legal.  For the moment this pass has no
2990   profitability analysis.  Returns non-zero todo flags when something
2991   changed.  */
2992
2993unsigned int
2994tree_if_conversion (struct loop *loop, vec<gimple *> *preds)
2995{
2996  unsigned int todo = 0;
2997  bool aggressive_if_conv;
2998  struct loop *rloop;
2999  bitmap exit_bbs;
3000
3001 again:
3002  rloop = NULL;
3003  ifc_bbs = NULL;
3004  need_to_predicate = false;
3005  any_complicated_phi = false;
3006
3007  /* Apply more aggressive if-conversion when loop or its outer loop were
3008     marked with simd pragma.  When that's the case, we try to if-convert
3009     loop containing PHIs with more than MAX_PHI_ARG_NUM arguments.  */
3010  aggressive_if_conv = loop->force_vectorize;
3011  if (!aggressive_if_conv)
3012    {
3013      struct loop *outer_loop = loop_outer (loop);
3014      if (outer_loop && outer_loop->force_vectorize)
3015	aggressive_if_conv = true;
3016    }
3017
3018  if (!ifcvt_split_critical_edges (loop, aggressive_if_conv))
3019    goto cleanup;
3020
3021  if (!if_convertible_loop_p (loop)
3022      || !dbg_cnt (if_conversion_tree))
3023    goto cleanup;
3024
3025  if ((need_to_predicate || any_complicated_phi)
3026      && ((!flag_tree_loop_vectorize && !loop->force_vectorize)
3027	  || loop->dont_vectorize))
3028    goto cleanup;
3029
3030  /* Since we have no cost model, always version loops unless the user
3031     specified -ftree-loop-if-convert or unless versioning is required.
3032     Either version this loop, or if the pattern is right for outer-loop
3033     vectorization, version the outer loop.  In the latter case we will
3034     still if-convert the original inner loop.  */
3035  if (need_to_predicate
3036      || any_complicated_phi
3037      || flag_tree_loop_if_convert != 1)
3038    {
3039      struct loop *vloop
3040	= (versionable_outer_loop_p (loop_outer (loop))
3041	   ? loop_outer (loop) : loop);
3042      struct loop *nloop = version_loop_for_if_conversion (vloop, preds);
3043      if (nloop == NULL)
3044	goto cleanup;
3045      if (vloop != loop)
3046	{
3047	  /* If versionable_outer_loop_p decided to version the
3048	     outer loop, version also the inner loop of the non-vectorized
3049	     loop copy.  So we transform:
3050	      loop1
3051		loop2
3052	     into:
3053	      if (LOOP_VECTORIZED (1, 3))
3054		{
3055		  loop1
3056		    loop2
3057		}
3058	      else
3059		loop3 (copy of loop1)
3060		  if (LOOP_VECTORIZED (4, 5))
3061		    loop4 (copy of loop2)
3062		  else
3063		    loop5 (copy of loop4)  */
3064	  gcc_assert (nloop->inner && nloop->inner->next == NULL);
3065	  rloop = nloop->inner;
3066	}
3067    }
3068
3069  /* Now all statements are if-convertible.  Combine all the basic
3070     blocks into one huge basic block doing the if-conversion
3071     on-the-fly.  */
3072  combine_blocks (loop);
3073
3074  /* Delete dead predicate computations.  */
3075  ifcvt_local_dce (loop->header);
3076
3077  /* Perform local CSE, this esp. helps the vectorizer analysis if loads
3078     and stores are involved.  CSE only the loop body, not the entry
3079     PHIs, those are to be kept in sync with the non-if-converted copy.
3080     ???  We'll still keep dead stores though.  */
3081  exit_bbs = BITMAP_ALLOC (NULL);
3082  bitmap_set_bit (exit_bbs, single_exit (loop)->dest->index);
3083  bitmap_set_bit (exit_bbs, loop->latch->index);
3084  todo |= do_rpo_vn (cfun, loop_preheader_edge (loop), exit_bbs);
3085  BITMAP_FREE (exit_bbs);
3086
3087  todo |= TODO_cleanup_cfg;
3088
3089 cleanup:
3090  if (ifc_bbs)
3091    {
3092      unsigned int i;
3093
3094      for (i = 0; i < loop->num_nodes; i++)
3095	free_bb_predicate (ifc_bbs[i]);
3096
3097      free (ifc_bbs);
3098      ifc_bbs = NULL;
3099    }
3100  if (rloop != NULL)
3101    {
3102      loop = rloop;
3103      goto again;
3104    }
3105
3106  return todo;
3107}
3108
3109/* Tree if-conversion pass management.  */
3110
3111namespace {
3112
3113const pass_data pass_data_if_conversion =
3114{
3115  GIMPLE_PASS, /* type */
3116  "ifcvt", /* name */
3117  OPTGROUP_NONE, /* optinfo_flags */
3118  TV_TREE_LOOP_IFCVT, /* tv_id */
3119  ( PROP_cfg | PROP_ssa ), /* properties_required */
3120  0, /* properties_provided */
3121  0, /* properties_destroyed */
3122  0, /* todo_flags_start */
3123  0, /* todo_flags_finish */
3124};
3125
3126class pass_if_conversion : public gimple_opt_pass
3127{
3128public:
3129  pass_if_conversion (gcc::context *ctxt)
3130    : gimple_opt_pass (pass_data_if_conversion, ctxt)
3131  {}
3132
3133  /* opt_pass methods: */
3134  virtual bool gate (function *);
3135  virtual unsigned int execute (function *);
3136
3137}; // class pass_if_conversion
3138
3139bool
3140pass_if_conversion::gate (function *fun)
3141{
3142  return (((flag_tree_loop_vectorize || fun->has_force_vectorize_loops)
3143	   && flag_tree_loop_if_convert != 0)
3144	  || flag_tree_loop_if_convert == 1);
3145}
3146
3147unsigned int
3148pass_if_conversion::execute (function *fun)
3149{
3150  struct loop *loop;
3151  unsigned todo = 0;
3152
3153  if (number_of_loops (fun) <= 1)
3154    return 0;
3155
3156  auto_vec<gimple *> preds;
3157  FOR_EACH_LOOP (loop, 0)
3158    if (flag_tree_loop_if_convert == 1
3159	|| ((flag_tree_loop_vectorize || loop->force_vectorize)
3160	    && !loop->dont_vectorize))
3161      todo |= tree_if_conversion (loop, &preds);
3162
3163  if (todo)
3164    {
3165      free_numbers_of_iterations_estimates (fun);
3166      scev_reset ();
3167    }
3168
3169  if (flag_checking)
3170    {
3171      basic_block bb;
3172      FOR_EACH_BB_FN (bb, fun)
3173	gcc_assert (!bb->aux);
3174    }
3175
3176  /* Perform IL update now, it might elide some loops.  */
3177  if (todo & TODO_cleanup_cfg)
3178    {
3179      cleanup_tree_cfg ();
3180      if (need_ssa_update_p (fun))
3181	todo |= TODO_update_ssa;
3182    }
3183  if (todo & TODO_update_ssa_any)
3184    update_ssa (todo & TODO_update_ssa_any);
3185
3186  /* If if-conversion elided the loop fall back to the original one.  */
3187  for (unsigned i = 0; i < preds.length (); ++i)
3188    {
3189      gimple *g = preds[i];
3190      if (!gimple_bb (g))
3191	continue;
3192      unsigned ifcvt_loop = tree_to_uhwi (gimple_call_arg (g, 0));
3193      if (!get_loop (fun, ifcvt_loop))
3194	{
3195	  if (dump_file)
3196	    fprintf (dump_file, "If-converted loop vanished\n");
3197	  fold_loop_internal_call (g, boolean_false_node);
3198	}
3199    }
3200
3201  return 0;
3202}
3203
3204} // anon namespace
3205
3206gimple_opt_pass *
3207make_pass_if_conversion (gcc::context *ctxt)
3208{
3209  return new pass_if_conversion (ctxt);
3210}
3211