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