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