1 /* If-conversion for vectorizer.
2 Copyright (C) 2004-2018 Free Software Foundation, Inc.
3 Contributed by Devang Patel <dpatel@apple.com>
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 /* This pass implements a tree level if-conversion of loops. Its
22 initial goal is to help the vectorizer to vectorize loops with
25 A short description of if-conversion:
27 o Decide if a loop is if-convertible or not.
28 o Walk all loop basic blocks in breadth first order (BFS order).
29 o Remove conditional statements (at the end of basic block)
30 and propagate condition into destination basic blocks'
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
38 Sample transformation:
43 # i_23 = PHI <0(0), i_18(10)>;
46 if (j_15 > 41) goto <L1>; else goto <L17>;
53 # iftmp.2_4 = PHI <0(8), 42(2)>;
57 if (i_18 <= 15) goto <L19>; else goto <L18>;
67 # i_23 = PHI <0(0), i_18(10)>;
72 iftmp.2_4 = j_15 > 41 ? 42 : 0;
75 if (i_18 <= 15) goto <L19>; else goto <L18>;
85 #include "coretypes.h"
91 #include "tree-pass.h"
94 #include "optabs-query.h"
95 #include "gimple-pretty-print.h"
97 #include "fold-const.h"
98 #include "stor-layout.h"
99 #include "gimple-fold.h"
100 #include "gimplify.h"
101 #include "gimple-iterator.h"
102 #include "gimplify-me.h"
103 #include "tree-cfg.h"
104 #include "tree-into-ssa.h"
105 #include "tree-ssa.h"
107 #include "tree-data-ref.h"
108 #include "tree-scalar-evolution.h"
109 #include "tree-ssa-loop.h"
110 #include "tree-ssa-loop-niter.h"
111 #include "tree-ssa-loop-ivopts.h"
112 #include "tree-ssa-address.h"
114 #include "tree-hash-traits.h"
116 #include "builtins.h"
120 /* Only handle PHIs with no more arguments unless we are asked to by
122 #define MAX_PHI_ARG_NUM \
123 ((unsigned) PARAM_VALUE (PARAM_MAX_TREE_IF_CONVERSION_PHI_ARGS))
125 /* Indicate if new load/store that needs to be predicated is introduced
126 during if conversion. */
127 static bool any_pred_load_store
;
129 /* Indicate if there are any complicated PHIs that need to be handled in
130 if-conversion. Complicated PHI has more than two arguments and can't
131 be degenerated to two arguments PHI. See more information in comment
132 before phi_convertible_by_degenerating_args. */
133 static bool any_complicated_phi
;
135 /* Hash for struct innermost_loop_behavior. It depends on the user to
138 struct innermost_loop_behavior_hash
: nofree_ptr_hash
<innermost_loop_behavior
>
140 static inline hashval_t
hash (const value_type
&);
141 static inline bool equal (const value_type
&,
142 const compare_type
&);
146 innermost_loop_behavior_hash::hash (const value_type
&e
)
150 hash
= iterative_hash_expr (e
->base_address
, 0);
151 hash
= iterative_hash_expr (e
->offset
, hash
);
152 hash
= iterative_hash_expr (e
->init
, hash
);
153 return iterative_hash_expr (e
->step
, hash
);
157 innermost_loop_behavior_hash::equal (const value_type
&e1
,
158 const compare_type
&e2
)
160 if ((e1
->base_address
&& !e2
->base_address
)
161 || (!e1
->base_address
&& e2
->base_address
)
162 || (!e1
->offset
&& e2
->offset
)
163 || (e1
->offset
&& !e2
->offset
)
164 || (!e1
->init
&& e2
->init
)
165 || (e1
->init
&& !e2
->init
)
166 || (!e1
->step
&& e2
->step
)
167 || (e1
->step
&& !e2
->step
))
170 if (e1
->base_address
&& e2
->base_address
171 && !operand_equal_p (e1
->base_address
, e2
->base_address
, 0))
173 if (e1
->offset
&& e2
->offset
174 && !operand_equal_p (e1
->offset
, e2
->offset
, 0))
176 if (e1
->init
&& e2
->init
177 && !operand_equal_p (e1
->init
, e2
->init
, 0))
179 if (e1
->step
&& e2
->step
180 && !operand_equal_p (e1
->step
, e2
->step
, 0))
186 /* List of basic blocks in if-conversion-suitable order. */
187 static basic_block
*ifc_bbs
;
189 /* Hash table to store <DR's innermost loop behavior, DR> pairs. */
190 static hash_map
<innermost_loop_behavior_hash
,
191 data_reference_p
> *innermost_DR_map
;
193 /* Hash table to store <base reference, DR> pairs. */
194 static hash_map
<tree_operand_hash
, data_reference_p
> *baseref_DR_map
;
196 /* Structure used to predicate basic blocks. This is attached to the
197 ->aux field of the BBs in the loop to be if-converted. */
198 struct bb_predicate
{
200 /* The condition under which this basic block is executed. */
203 /* PREDICATE is gimplified, and the sequence of statements is
204 recorded here, in order to avoid the duplication of computations
205 that occur in previous conditions. See PR44483. */
206 gimple_seq predicate_gimplified_stmts
;
209 /* Returns true when the basic block BB has a predicate. */
212 bb_has_predicate (basic_block bb
)
214 return bb
->aux
!= NULL
;
217 /* Returns the gimplified predicate for basic block BB. */
220 bb_predicate (basic_block bb
)
222 return ((struct bb_predicate
*) bb
->aux
)->predicate
;
225 /* Sets the gimplified predicate COND for basic block BB. */
228 set_bb_predicate (basic_block bb
, tree cond
)
230 gcc_assert ((TREE_CODE (cond
) == TRUTH_NOT_EXPR
231 && is_gimple_condexpr (TREE_OPERAND (cond
, 0)))
232 || is_gimple_condexpr (cond
));
233 ((struct bb_predicate
*) bb
->aux
)->predicate
= cond
;
236 /* Returns the sequence of statements of the gimplification of the
237 predicate for basic block BB. */
239 static inline gimple_seq
240 bb_predicate_gimplified_stmts (basic_block bb
)
242 return ((struct bb_predicate
*) bb
->aux
)->predicate_gimplified_stmts
;
245 /* Sets the sequence of statements STMTS of the gimplification of the
246 predicate for basic block BB. */
249 set_bb_predicate_gimplified_stmts (basic_block bb
, gimple_seq stmts
)
251 ((struct bb_predicate
*) bb
->aux
)->predicate_gimplified_stmts
= stmts
;
254 /* Adds the sequence of statements STMTS to the sequence of statements
255 of the predicate for basic block BB. */
258 add_bb_predicate_gimplified_stmts (basic_block bb
, gimple_seq stmts
)
260 gimple_seq_add_seq_without_update
261 (&(((struct bb_predicate
*) bb
->aux
)->predicate_gimplified_stmts
), stmts
);
264 /* Initializes to TRUE the predicate of basic block BB. */
267 init_bb_predicate (basic_block bb
)
269 bb
->aux
= XNEW (struct bb_predicate
);
270 set_bb_predicate_gimplified_stmts (bb
, NULL
);
271 set_bb_predicate (bb
, boolean_true_node
);
274 /* Release the SSA_NAMEs associated with the predicate of basic block BB,
275 but don't actually free it. */
278 release_bb_predicate (basic_block bb
)
280 gimple_seq stmts
= bb_predicate_gimplified_stmts (bb
);
284 for (gimple_stmt_iterator i
= gsi_start (stmts
);
285 !gsi_end_p (i
); gsi_next (&i
))
286 gcc_assert (! gimple_use_ops (gsi_stmt (i
)));
288 set_bb_predicate_gimplified_stmts (bb
, NULL
);
292 /* Free the predicate of basic block BB. */
295 free_bb_predicate (basic_block bb
)
297 if (!bb_has_predicate (bb
))
300 release_bb_predicate (bb
);
305 /* Reinitialize predicate of BB with the true predicate. */
308 reset_bb_predicate (basic_block bb
)
310 if (!bb_has_predicate (bb
))
311 init_bb_predicate (bb
);
314 release_bb_predicate (bb
);
315 set_bb_predicate (bb
, boolean_true_node
);
319 /* Returns a new SSA_NAME of type TYPE that is assigned the value of
320 the expression EXPR. Inserts the statement created for this
321 computation before GSI and leaves the iterator GSI at the same
325 ifc_temp_var (tree type
, tree expr
, gimple_stmt_iterator
*gsi
)
327 tree new_name
= make_temp_ssa_name (type
, NULL
, "_ifc_");
328 gimple
*stmt
= gimple_build_assign (new_name
, expr
);
329 gimple_set_vuse (stmt
, gimple_vuse (gsi_stmt (*gsi
)));
330 gsi_insert_before (gsi
, stmt
, GSI_SAME_STMT
);
334 /* Return true when COND is a false predicate. */
337 is_false_predicate (tree cond
)
339 return (cond
!= NULL_TREE
340 && (cond
== boolean_false_node
341 || integer_zerop (cond
)));
344 /* Return true when COND is a true predicate. */
347 is_true_predicate (tree cond
)
349 return (cond
== NULL_TREE
350 || cond
== boolean_true_node
351 || integer_onep (cond
));
354 /* Returns true when BB has a predicate that is not trivial: true or
358 is_predicated (basic_block bb
)
360 return !is_true_predicate (bb_predicate (bb
));
363 /* Parses the predicate COND and returns its comparison code and
364 operands OP0 and OP1. */
366 static enum tree_code
367 parse_predicate (tree cond
, tree
*op0
, tree
*op1
)
371 if (TREE_CODE (cond
) == SSA_NAME
372 && is_gimple_assign (s
= SSA_NAME_DEF_STMT (cond
)))
374 if (TREE_CODE_CLASS (gimple_assign_rhs_code (s
)) == tcc_comparison
)
376 *op0
= gimple_assign_rhs1 (s
);
377 *op1
= gimple_assign_rhs2 (s
);
378 return gimple_assign_rhs_code (s
);
381 else if (gimple_assign_rhs_code (s
) == TRUTH_NOT_EXPR
)
383 tree op
= gimple_assign_rhs1 (s
);
384 tree type
= TREE_TYPE (op
);
385 enum tree_code code
= parse_predicate (op
, op0
, op1
);
387 return code
== ERROR_MARK
? ERROR_MARK
388 : invert_tree_comparison (code
, HONOR_NANS (type
));
394 if (COMPARISON_CLASS_P (cond
))
396 *op0
= TREE_OPERAND (cond
, 0);
397 *op1
= TREE_OPERAND (cond
, 1);
398 return TREE_CODE (cond
);
404 /* Returns the fold of predicate C1 OR C2 at location LOC. */
407 fold_or_predicates (location_t loc
, tree c1
, tree c2
)
409 tree op1a
, op1b
, op2a
, op2b
;
410 enum tree_code code1
= parse_predicate (c1
, &op1a
, &op1b
);
411 enum tree_code code2
= parse_predicate (c2
, &op2a
, &op2b
);
413 if (code1
!= ERROR_MARK
&& code2
!= ERROR_MARK
)
415 tree t
= maybe_fold_or_comparisons (code1
, op1a
, op1b
,
421 return fold_build2_loc (loc
, TRUTH_OR_EXPR
, boolean_type_node
, c1
, c2
);
424 /* Returns either a COND_EXPR or the folded expression if the folded
425 expression is a MIN_EXPR, a MAX_EXPR, an ABS_EXPR,
426 a constant or a SSA_NAME. */
429 fold_build_cond_expr (tree type
, tree cond
, tree rhs
, tree lhs
)
431 tree rhs1
, lhs1
, cond_expr
;
433 /* If COND is comparison r != 0 and r has boolean type, convert COND
434 to SSA_NAME to accept by vect bool pattern. */
435 if (TREE_CODE (cond
) == NE_EXPR
)
437 tree op0
= TREE_OPERAND (cond
, 0);
438 tree op1
= TREE_OPERAND (cond
, 1);
439 if (TREE_CODE (op0
) == SSA_NAME
440 && TREE_CODE (TREE_TYPE (op0
)) == BOOLEAN_TYPE
441 && (integer_zerop (op1
)))
444 cond_expr
= fold_ternary (COND_EXPR
, type
, cond
, rhs
, lhs
);
446 if (cond_expr
== NULL_TREE
)
447 return build3 (COND_EXPR
, type
, cond
, rhs
, lhs
);
449 STRIP_USELESS_TYPE_CONVERSION (cond_expr
);
451 if (is_gimple_val (cond_expr
))
454 if (TREE_CODE (cond_expr
) == ABS_EXPR
)
456 rhs1
= TREE_OPERAND (cond_expr
, 1);
457 STRIP_USELESS_TYPE_CONVERSION (rhs1
);
458 if (is_gimple_val (rhs1
))
459 return build1 (ABS_EXPR
, type
, rhs1
);
462 if (TREE_CODE (cond_expr
) == MIN_EXPR
463 || TREE_CODE (cond_expr
) == MAX_EXPR
)
465 lhs1
= TREE_OPERAND (cond_expr
, 0);
466 STRIP_USELESS_TYPE_CONVERSION (lhs1
);
467 rhs1
= TREE_OPERAND (cond_expr
, 1);
468 STRIP_USELESS_TYPE_CONVERSION (rhs1
);
469 if (is_gimple_val (rhs1
) && is_gimple_val (lhs1
))
470 return build2 (TREE_CODE (cond_expr
), type
, lhs1
, rhs1
);
472 return build3 (COND_EXPR
, type
, cond
, rhs
, lhs
);
475 /* Add condition NC to the predicate list of basic block BB. LOOP is
476 the loop to be if-converted. Use predicate of cd-equivalent block
477 for join bb if it exists: we call basic blocks bb1 and bb2
478 cd-equivalent if they are executed under the same condition. */
481 add_to_predicate_list (struct loop
*loop
, basic_block bb
, tree nc
)
486 if (is_true_predicate (nc
))
489 /* If dominance tells us this basic block is always executed,
490 don't record any predicates for it. */
491 if (dominated_by_p (CDI_DOMINATORS
, loop
->latch
, bb
))
494 dom_bb
= get_immediate_dominator (CDI_DOMINATORS
, bb
);
495 /* We use notion of cd equivalence to get simpler predicate for
496 join block, e.g. if join block has 2 predecessors with predicates
497 p1 & p2 and p1 & !p2, we'd like to get p1 for it instead of
498 p1 & p2 | p1 & !p2. */
499 if (dom_bb
!= loop
->header
500 && get_immediate_dominator (CDI_POST_DOMINATORS
, dom_bb
) == bb
)
502 gcc_assert (flow_bb_inside_loop_p (loop
, dom_bb
));
503 bc
= bb_predicate (dom_bb
);
504 if (!is_true_predicate (bc
))
505 set_bb_predicate (bb
, bc
);
507 gcc_assert (is_true_predicate (bb_predicate (bb
)));
508 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
509 fprintf (dump_file
, "Use predicate of bb#%d for bb#%d\n",
510 dom_bb
->index
, bb
->index
);
514 if (!is_predicated (bb
))
518 bc
= bb_predicate (bb
);
519 bc
= fold_or_predicates (EXPR_LOCATION (bc
), nc
, bc
);
520 if (is_true_predicate (bc
))
522 reset_bb_predicate (bb
);
527 /* Allow a TRUTH_NOT_EXPR around the main predicate. */
528 if (TREE_CODE (bc
) == TRUTH_NOT_EXPR
)
529 tp
= &TREE_OPERAND (bc
, 0);
532 if (!is_gimple_condexpr (*tp
))
535 *tp
= force_gimple_operand_1 (*tp
, &stmts
, is_gimple_condexpr
, NULL_TREE
);
536 add_bb_predicate_gimplified_stmts (bb
, stmts
);
538 set_bb_predicate (bb
, bc
);
541 /* Add the condition COND to the previous condition PREV_COND, and add
542 this to the predicate list of the destination of edge E. LOOP is
543 the loop to be if-converted. */
546 add_to_dst_predicate_list (struct loop
*loop
, edge e
,
547 tree prev_cond
, tree cond
)
549 if (!flow_bb_inside_loop_p (loop
, e
->dest
))
552 if (!is_true_predicate (prev_cond
))
553 cond
= fold_build2 (TRUTH_AND_EXPR
, boolean_type_node
,
556 if (!dominated_by_p (CDI_DOMINATORS
, loop
->latch
, e
->dest
))
557 add_to_predicate_list (loop
, e
->dest
, cond
);
560 /* Return true if one of the successor edges of BB exits LOOP. */
563 bb_with_exit_edge_p (struct loop
*loop
, basic_block bb
)
568 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
569 if (loop_exit_edge_p (loop
, e
))
575 /* Given PHI which has more than two arguments, this function checks if
576 it's if-convertible by degenerating its arguments. Specifically, if
577 below two conditions are satisfied:
579 1) Number of PHI arguments with different values equals to 2 and one
580 argument has the only occurrence.
581 2) The edge corresponding to the unique argument isn't critical edge.
583 Such PHI can be handled as PHIs have only two arguments. For example,
586 res = PHI <A_1(e1), A_1(e2), A_2(e3)>;
588 can be transformed into:
590 res = (predicate of e3) ? A_2 : A_1;
592 Return TRUE if it is the case, FALSE otherwise. */
595 phi_convertible_by_degenerating_args (gphi
*phi
)
598 tree arg
, t1
= NULL
, t2
= NULL
;
599 unsigned int i
, i1
= 0, i2
= 0, n1
= 0, n2
= 0;
600 unsigned int num_args
= gimple_phi_num_args (phi
);
602 gcc_assert (num_args
> 2);
604 for (i
= 0; i
< num_args
; i
++)
606 arg
= gimple_phi_arg_def (phi
, i
);
607 if (t1
== NULL
|| operand_equal_p (t1
, arg
, 0))
613 else if (t2
== NULL
|| operand_equal_p (t2
, arg
, 0))
623 if (n1
!= 1 && n2
!= 1)
626 /* Check if the edge corresponding to the unique arg is critical. */
627 e
= gimple_phi_arg_edge (phi
, (n1
== 1) ? i1
: i2
);
628 if (EDGE_COUNT (e
->src
->succs
) > 1)
634 /* Return true when PHI is if-convertible. PHI is part of loop LOOP
635 and it belongs to basic block BB. Note at this point, it is sure
636 that PHI is if-convertible. This function updates global variable
637 ANY_COMPLICATED_PHI if PHI is complicated. */
640 if_convertible_phi_p (struct loop
*loop
, basic_block bb
, gphi
*phi
)
642 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
644 fprintf (dump_file
, "-------------------------\n");
645 print_gimple_stmt (dump_file
, phi
, 0, TDF_SLIM
);
648 if (bb
!= loop
->header
649 && gimple_phi_num_args (phi
) > 2
650 && !phi_convertible_by_degenerating_args (phi
))
651 any_complicated_phi
= true;
656 /* Records the status of a data reference. This struct is attached to
657 each DR->aux field. */
660 bool rw_unconditionally
;
661 bool w_unconditionally
;
662 bool written_at_least_once
;
666 tree base_w_predicate
;
669 #define IFC_DR(DR) ((struct ifc_dr *) (DR)->aux)
670 #define DR_BASE_W_UNCONDITIONALLY(DR) (IFC_DR (DR)->written_at_least_once)
671 #define DR_RW_UNCONDITIONALLY(DR) (IFC_DR (DR)->rw_unconditionally)
672 #define DR_W_UNCONDITIONALLY(DR) (IFC_DR (DR)->w_unconditionally)
674 /* Iterates over DR's and stores refs, DR and base refs, DR pairs in
675 HASH tables. While storing them in HASH table, it checks if the
676 reference is unconditionally read or written and stores that as a flag
677 information. For base reference it checks if it is written atlest once
678 unconditionally and stores it as flag information along with DR.
679 In other words for every data reference A in STMT there exist other
680 accesses to a data reference with the same base with predicates that
681 add up (OR-up) to the true predicate: this ensures that the data
682 reference A is touched (read or written) on every iteration of the
683 if-converted loop. */
685 hash_memrefs_baserefs_and_store_DRs_read_written_info (data_reference_p a
)
688 data_reference_p
*master_dr
, *base_master_dr
;
689 tree base_ref
= DR_BASE_OBJECT (a
);
690 innermost_loop_behavior
*innermost
= &DR_INNERMOST (a
);
691 tree ca
= bb_predicate (gimple_bb (DR_STMT (a
)));
694 master_dr
= &innermost_DR_map
->get_or_insert (innermost
, &exist1
);
700 IFC_DR (*master_dr
)->w_predicate
701 = fold_or_predicates (UNKNOWN_LOCATION
, ca
,
702 IFC_DR (*master_dr
)->w_predicate
);
703 if (is_true_predicate (IFC_DR (*master_dr
)->w_predicate
))
704 DR_W_UNCONDITIONALLY (*master_dr
) = true;
706 IFC_DR (*master_dr
)->rw_predicate
707 = fold_or_predicates (UNKNOWN_LOCATION
, ca
,
708 IFC_DR (*master_dr
)->rw_predicate
);
709 if (is_true_predicate (IFC_DR (*master_dr
)->rw_predicate
))
710 DR_RW_UNCONDITIONALLY (*master_dr
) = true;
714 base_master_dr
= &baseref_DR_map
->get_or_insert (base_ref
, &exist2
);
717 IFC_DR (*base_master_dr
)->base_w_predicate
718 = fold_or_predicates (UNKNOWN_LOCATION
, ca
,
719 IFC_DR (*base_master_dr
)->base_w_predicate
);
720 if (is_true_predicate (IFC_DR (*base_master_dr
)->base_w_predicate
))
721 DR_BASE_W_UNCONDITIONALLY (*base_master_dr
) = true;
725 /* Return TRUE if can prove the index IDX of an array reference REF is
726 within array bound. Return false otherwise. */
729 idx_within_array_bound (tree ref
, tree
*idx
, void *dta
)
732 widest_int niter
, valid_niter
, delta
, wi_step
;
735 struct loop
*loop
= (struct loop
*) dta
;
737 /* Only support within-bound access for array references. */
738 if (TREE_CODE (ref
) != ARRAY_REF
)
741 /* For arrays at the end of the structure, we are not guaranteed that they
742 do not really extend over their declared size. However, for arrays of
743 size greater than one, this is unlikely to be intended. */
744 if (array_at_struct_end_p (ref
))
747 ev
= analyze_scalar_evolution (loop
, *idx
);
748 ev
= instantiate_parameters (loop
, ev
);
749 init
= initial_condition (ev
);
750 step
= evolution_part_in_loop_num (ev
, loop
->num
);
752 if (!init
|| TREE_CODE (init
) != INTEGER_CST
753 || (step
&& TREE_CODE (step
) != INTEGER_CST
))
756 low
= array_ref_low_bound (ref
);
757 high
= array_ref_up_bound (ref
);
759 /* The case of nonconstant bounds could be handled, but it would be
761 if (TREE_CODE (low
) != INTEGER_CST
762 || !high
|| TREE_CODE (high
) != INTEGER_CST
)
765 /* Check if the intial idx is within bound. */
766 if (wi::to_widest (init
) < wi::to_widest (low
)
767 || wi::to_widest (init
) > wi::to_widest (high
))
770 /* The idx is always within bound. */
771 if (!step
|| integer_zerop (step
))
774 if (!max_loop_iterations (loop
, &niter
))
777 if (wi::to_widest (step
) < 0)
779 delta
= wi::to_widest (init
) - wi::to_widest (low
);
780 wi_step
= -wi::to_widest (step
);
784 delta
= wi::to_widest (high
) - wi::to_widest (init
);
785 wi_step
= wi::to_widest (step
);
788 valid_niter
= wi::div_floor (delta
, wi_step
, SIGNED
, &overflow
);
789 /* The iteration space of idx is within array bound. */
790 if (!overflow
&& niter
<= valid_niter
)
796 /* Return TRUE if ref is a within bound array reference. */
799 ref_within_array_bound (gimple
*stmt
, tree ref
)
801 struct loop
*loop
= loop_containing_stmt (stmt
);
803 gcc_assert (loop
!= NULL
);
804 return for_each_index (&ref
, idx_within_array_bound
, loop
);
808 /* Given a memory reference expression T, return TRUE if base object
809 it refers to is writable. The base object of a memory reference
810 is the main object being referenced, which is returned by function
814 base_object_writable (tree ref
)
816 tree base_tree
= get_base_address (ref
);
819 && DECL_P (base_tree
)
820 && decl_binds_to_current_def_p (base_tree
)
821 && !TREE_READONLY (base_tree
));
824 /* Return true when the memory references of STMT won't trap in the
825 if-converted code. There are two things that we have to check for:
827 - writes to memory occur to writable memory: if-conversion of
828 memory writes transforms the conditional memory writes into
829 unconditional writes, i.e. "if (cond) A[i] = foo" is transformed
830 into "A[i] = cond ? foo : A[i]", and as the write to memory may not
831 be executed at all in the original code, it may be a readonly
832 memory. To check that A is not const-qualified, we check that
833 there exists at least an unconditional write to A in the current
836 - reads or writes to memory are valid memory accesses for every
837 iteration. To check that the memory accesses are correctly formed
838 and that we are allowed to read and write in these locations, we
839 check that the memory accesses to be if-converted occur at every
840 iteration unconditionally.
842 Returns true for the memory reference in STMT, same memory reference
843 is read or written unconditionally atleast once and the base memory
844 reference is written unconditionally once. This is to check reference
845 will not write fault. Also retuns true if the memory reference is
846 unconditionally read once then we are conditionally writing to memory
847 which is defined as read and write and is bound to the definition
850 ifcvt_memrefs_wont_trap (gimple
*stmt
, vec
<data_reference_p
> drs
)
852 data_reference_p
*master_dr
, *base_master_dr
;
853 data_reference_p a
= drs
[gimple_uid (stmt
) - 1];
855 tree base
= DR_BASE_OBJECT (a
);
856 innermost_loop_behavior
*innermost
= &DR_INNERMOST (a
);
858 gcc_assert (DR_STMT (a
) == stmt
);
859 gcc_assert (DR_BASE_ADDRESS (a
) || DR_OFFSET (a
)
860 || DR_INIT (a
) || DR_STEP (a
));
862 master_dr
= innermost_DR_map
->get (innermost
);
863 gcc_assert (master_dr
!= NULL
);
865 base_master_dr
= baseref_DR_map
->get (base
);
867 /* If a is unconditionally written to it doesn't trap. */
868 if (DR_W_UNCONDITIONALLY (*master_dr
))
871 /* If a is unconditionally accessed then ...
873 Even a is conditional access, we can treat it as an unconditional
874 one if it's an array reference and all its index are within array
876 if (DR_RW_UNCONDITIONALLY (*master_dr
)
877 || ref_within_array_bound (stmt
, DR_REF (a
)))
879 /* an unconditional read won't trap. */
883 /* an unconditionaly write won't trap if the base is written
884 to unconditionally. */
886 && DR_BASE_W_UNCONDITIONALLY (*base_master_dr
))
887 return PARAM_VALUE (PARAM_ALLOW_STORE_DATA_RACES
);
888 /* or the base is known to be not readonly. */
889 else if (base_object_writable (DR_REF (a
)))
890 return PARAM_VALUE (PARAM_ALLOW_STORE_DATA_RACES
);
896 /* Return true if STMT could be converted into a masked load or store
897 (conditional load or store based on a mask computed from bb predicate). */
900 ifcvt_can_use_mask_load_store (gimple
*stmt
)
904 basic_block bb
= gimple_bb (stmt
);
907 if (!(flag_tree_loop_vectorize
|| bb
->loop_father
->force_vectorize
)
908 || bb
->loop_father
->dont_vectorize
909 || !gimple_assign_single_p (stmt
)
910 || gimple_has_volatile_ops (stmt
))
913 /* Check whether this is a load or store. */
914 lhs
= gimple_assign_lhs (stmt
);
915 if (gimple_store_p (stmt
))
917 if (!is_gimple_val (gimple_assign_rhs1 (stmt
)))
922 else if (gimple_assign_load_p (stmt
))
925 ref
= gimple_assign_rhs1 (stmt
);
930 if (may_be_nonaddressable_p (ref
))
933 /* Mask should be integer mode of the same size as the load/store
935 mode
= TYPE_MODE (TREE_TYPE (lhs
));
936 if (!int_mode_for_mode (mode
).exists () || VECTOR_MODE_P (mode
))
939 if (can_vec_mask_load_store_p (mode
, VOIDmode
, is_load
))
945 /* Return true when STMT is if-convertible.
947 GIMPLE_ASSIGN statement is not if-convertible if,
950 - LHS is not var decl. */
953 if_convertible_gimple_assign_stmt_p (gimple
*stmt
,
954 vec
<data_reference_p
> refs
)
956 tree lhs
= gimple_assign_lhs (stmt
);
958 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
960 fprintf (dump_file
, "-------------------------\n");
961 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
964 if (!is_gimple_reg_type (TREE_TYPE (lhs
)))
967 /* Some of these constrains might be too conservative. */
968 if (stmt_ends_bb_p (stmt
)
969 || gimple_has_volatile_ops (stmt
)
970 || (TREE_CODE (lhs
) == SSA_NAME
971 && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs
))
972 || gimple_has_side_effects (stmt
))
974 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
975 fprintf (dump_file
, "stmt not suitable for ifcvt\n");
979 /* tree-into-ssa.c uses GF_PLF_1, so avoid it, because
980 in between if_convertible_loop_p and combine_blocks
981 we can perform loop versioning. */
982 gimple_set_plf (stmt
, GF_PLF_2
, false);
984 if ((! gimple_vuse (stmt
)
985 || gimple_could_trap_p_1 (stmt
, false, false)
986 || ! ifcvt_memrefs_wont_trap (stmt
, refs
))
987 && gimple_could_trap_p (stmt
))
989 if (ifcvt_can_use_mask_load_store (stmt
))
991 gimple_set_plf (stmt
, GF_PLF_2
, true);
992 any_pred_load_store
= true;
995 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
996 fprintf (dump_file
, "tree could trap...\n");
1000 /* When if-converting stores force versioning, likewise if we
1001 ended up generating store data races. */
1002 if (gimple_vdef (stmt
))
1003 any_pred_load_store
= true;
1008 /* Return true when STMT is if-convertible.
1010 A statement is if-convertible if:
1011 - it is an if-convertible GIMPLE_ASSIGN,
1012 - it is a GIMPLE_LABEL or a GIMPLE_COND,
1013 - it is builtins call. */
1016 if_convertible_stmt_p (gimple
*stmt
, vec
<data_reference_p
> refs
)
1018 switch (gimple_code (stmt
))
1026 return if_convertible_gimple_assign_stmt_p (stmt
, refs
);
1030 tree fndecl
= gimple_call_fndecl (stmt
);
1033 int flags
= gimple_call_flags (stmt
);
1034 if ((flags
& ECF_CONST
)
1035 && !(flags
& ECF_LOOPING_CONST_OR_PURE
)
1036 /* We can only vectorize some builtins at the moment,
1037 so restrict if-conversion to those. */
1038 && DECL_BUILT_IN (fndecl
))
1045 /* Don't know what to do with 'em so don't do anything. */
1046 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1048 fprintf (dump_file
, "don't know what to do\n");
1049 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
1057 /* Assumes that BB has more than 1 predecessors.
1058 Returns false if at least one successor is not on critical edge
1059 and true otherwise. */
1062 all_preds_critical_p (basic_block bb
)
1067 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
1068 if (EDGE_COUNT (e
->src
->succs
) == 1)
1073 /* Returns true if at least one successor in on critical edge. */
1075 has_pred_critical_p (basic_block bb
)
1080 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
1081 if (EDGE_COUNT (e
->src
->succs
) > 1)
1086 /* Return true when BB is if-convertible. This routine does not check
1087 basic block's statements and phis.
1089 A basic block is not if-convertible if:
1090 - it is non-empty and it is after the exit block (in BFS order),
1091 - it is after the exit block but before the latch,
1092 - its edges are not normal.
1094 EXIT_BB is the basic block containing the exit of the LOOP. BB is
1098 if_convertible_bb_p (struct loop
*loop
, basic_block bb
, basic_block exit_bb
)
1103 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1104 fprintf (dump_file
, "----------[%d]-------------\n", bb
->index
);
1106 if (EDGE_COUNT (bb
->succs
) > 2)
1111 if (bb
!= loop
->latch
)
1113 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1114 fprintf (dump_file
, "basic block after exit bb but before latch\n");
1117 else if (!empty_block_p (bb
))
1119 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1120 fprintf (dump_file
, "non empty basic block after exit bb\n");
1123 else if (bb
== loop
->latch
1125 && !dominated_by_p (CDI_DOMINATORS
, bb
, exit_bb
))
1127 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1128 fprintf (dump_file
, "latch is not dominated by exit_block\n");
1133 /* Be less adventurous and handle only normal edges. */
1134 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
1135 if (e
->flags
& (EDGE_EH
| EDGE_ABNORMAL
| EDGE_IRREDUCIBLE_LOOP
))
1137 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1138 fprintf (dump_file
, "Difficult to handle edges\n");
1145 /* Return true when all predecessor blocks of BB are visited. The
1146 VISITED bitmap keeps track of the visited blocks. */
1149 pred_blocks_visited_p (basic_block bb
, bitmap
*visited
)
1153 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
1154 if (!bitmap_bit_p (*visited
, e
->src
->index
))
1160 /* Get body of a LOOP in suitable order for if-conversion. It is
1161 caller's responsibility to deallocate basic block list.
1162 If-conversion suitable order is, breadth first sort (BFS) order
1163 with an additional constraint: select a block only if all its
1164 predecessors are already selected. */
1166 static basic_block
*
1167 get_loop_body_in_if_conv_order (const struct loop
*loop
)
1169 basic_block
*blocks
, *blocks_in_bfs_order
;
1172 unsigned int index
= 0;
1173 unsigned int visited_count
= 0;
1175 gcc_assert (loop
->num_nodes
);
1176 gcc_assert (loop
->latch
!= EXIT_BLOCK_PTR_FOR_FN (cfun
));
1178 blocks
= XCNEWVEC (basic_block
, loop
->num_nodes
);
1179 visited
= BITMAP_ALLOC (NULL
);
1181 blocks_in_bfs_order
= get_loop_body_in_bfs_order (loop
);
1184 while (index
< loop
->num_nodes
)
1186 bb
= blocks_in_bfs_order
[index
];
1188 if (bb
->flags
& BB_IRREDUCIBLE_LOOP
)
1190 free (blocks_in_bfs_order
);
1191 BITMAP_FREE (visited
);
1196 if (!bitmap_bit_p (visited
, bb
->index
))
1198 if (pred_blocks_visited_p (bb
, &visited
)
1199 || bb
== loop
->header
)
1201 /* This block is now visited. */
1202 bitmap_set_bit (visited
, bb
->index
);
1203 blocks
[visited_count
++] = bb
;
1209 if (index
== loop
->num_nodes
1210 && visited_count
!= loop
->num_nodes
)
1214 free (blocks_in_bfs_order
);
1215 BITMAP_FREE (visited
);
1219 /* Returns true when the analysis of the predicates for all the basic
1220 blocks in LOOP succeeded.
1222 predicate_bbs first allocates the predicates of the basic blocks.
1223 These fields are then initialized with the tree expressions
1224 representing the predicates under which a basic block is executed
1225 in the LOOP. As the loop->header is executed at each iteration, it
1226 has the "true" predicate. Other statements executed under a
1227 condition are predicated with that condition, for example
1234 S1 will be predicated with "x", and
1235 S2 will be predicated with "!x". */
1238 predicate_bbs (loop_p loop
)
1242 for (i
= 0; i
< loop
->num_nodes
; i
++)
1243 init_bb_predicate (ifc_bbs
[i
]);
1245 for (i
= 0; i
< loop
->num_nodes
; i
++)
1247 basic_block bb
= ifc_bbs
[i
];
1251 /* The loop latch and loop exit block are always executed and
1252 have no extra conditions to be processed: skip them. */
1253 if (bb
== loop
->latch
1254 || bb_with_exit_edge_p (loop
, bb
))
1256 reset_bb_predicate (bb
);
1260 cond
= bb_predicate (bb
);
1261 stmt
= last_stmt (bb
);
1262 if (stmt
&& gimple_code (stmt
) == GIMPLE_COND
)
1265 edge true_edge
, false_edge
;
1266 location_t loc
= gimple_location (stmt
);
1267 tree c
= build2_loc (loc
, gimple_cond_code (stmt
),
1269 gimple_cond_lhs (stmt
),
1270 gimple_cond_rhs (stmt
));
1272 /* Add new condition into destination's predicate list. */
1273 extract_true_false_edges_from_block (gimple_bb (stmt
),
1274 &true_edge
, &false_edge
);
1276 /* If C is true, then TRUE_EDGE is taken. */
1277 add_to_dst_predicate_list (loop
, true_edge
, unshare_expr (cond
),
1280 /* If C is false, then FALSE_EDGE is taken. */
1281 c2
= build1_loc (loc
, TRUTH_NOT_EXPR
, boolean_type_node
,
1283 add_to_dst_predicate_list (loop
, false_edge
,
1284 unshare_expr (cond
), c2
);
1289 /* If current bb has only one successor, then consider it as an
1290 unconditional goto. */
1291 if (single_succ_p (bb
))
1293 basic_block bb_n
= single_succ (bb
);
1295 /* The successor bb inherits the predicate of its
1296 predecessor. If there is no predicate in the predecessor
1297 bb, then consider the successor bb as always executed. */
1298 if (cond
== NULL_TREE
)
1299 cond
= boolean_true_node
;
1301 add_to_predicate_list (loop
, bb_n
, cond
);
1305 /* The loop header is always executed. */
1306 reset_bb_predicate (loop
->header
);
1307 gcc_assert (bb_predicate_gimplified_stmts (loop
->header
) == NULL
1308 && bb_predicate_gimplified_stmts (loop
->latch
) == NULL
);
1311 /* Build region by adding loop pre-header and post-header blocks. */
1313 static vec
<basic_block
>
1314 build_region (struct loop
*loop
)
1316 vec
<basic_block
> region
= vNULL
;
1317 basic_block exit_bb
= NULL
;
1319 gcc_assert (ifc_bbs
);
1320 /* The first element is loop pre-header. */
1321 region
.safe_push (loop_preheader_edge (loop
)->src
);
1323 for (unsigned int i
= 0; i
< loop
->num_nodes
; i
++)
1325 basic_block bb
= ifc_bbs
[i
];
1326 region
.safe_push (bb
);
1327 /* Find loop postheader. */
1330 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
1331 if (loop_exit_edge_p (loop
, e
))
1337 /* The last element is loop post-header. */
1338 gcc_assert (exit_bb
);
1339 region
.safe_push (exit_bb
);
1343 /* Return true when LOOP is if-convertible. This is a helper function
1344 for if_convertible_loop_p. REFS and DDRS are initialized and freed
1345 in if_convertible_loop_p. */
1348 if_convertible_loop_p_1 (struct loop
*loop
, vec
<data_reference_p
> *refs
)
1351 basic_block exit_bb
= NULL
;
1352 vec
<basic_block
> region
;
1354 if (find_data_references_in_loop (loop
, refs
) == chrec_dont_know
)
1357 calculate_dominance_info (CDI_DOMINATORS
);
1359 /* Allow statements that can be handled during if-conversion. */
1360 ifc_bbs
= get_loop_body_in_if_conv_order (loop
);
1363 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1364 fprintf (dump_file
, "Irreducible loop\n");
1368 for (i
= 0; i
< loop
->num_nodes
; i
++)
1370 basic_block bb
= ifc_bbs
[i
];
1372 if (!if_convertible_bb_p (loop
, bb
, exit_bb
))
1375 if (bb_with_exit_edge_p (loop
, bb
))
1379 for (i
= 0; i
< loop
->num_nodes
; i
++)
1381 basic_block bb
= ifc_bbs
[i
];
1382 gimple_stmt_iterator gsi
;
1384 for (gsi
= gsi_start_bb (bb
); !gsi_end_p (gsi
); gsi_next (&gsi
))
1385 switch (gimple_code (gsi_stmt (gsi
)))
1392 gimple_set_uid (gsi_stmt (gsi
), 0);
1399 data_reference_p dr
;
1402 = new hash_map
<innermost_loop_behavior_hash
, data_reference_p
>;
1403 baseref_DR_map
= new hash_map
<tree_operand_hash
, data_reference_p
>;
1405 /* Compute post-dominator tree locally. */
1406 region
= build_region (loop
);
1407 calculate_dominance_info_for_region (CDI_POST_DOMINATORS
, region
);
1409 predicate_bbs (loop
);
1411 /* Free post-dominator tree since it is not used after predication. */
1412 free_dominance_info_for_region (cfun
, CDI_POST_DOMINATORS
, region
);
1415 for (i
= 0; refs
->iterate (i
, &dr
); i
++)
1417 tree ref
= DR_REF (dr
);
1419 dr
->aux
= XNEW (struct ifc_dr
);
1420 DR_BASE_W_UNCONDITIONALLY (dr
) = false;
1421 DR_RW_UNCONDITIONALLY (dr
) = false;
1422 DR_W_UNCONDITIONALLY (dr
) = false;
1423 IFC_DR (dr
)->rw_predicate
= boolean_false_node
;
1424 IFC_DR (dr
)->w_predicate
= boolean_false_node
;
1425 IFC_DR (dr
)->base_w_predicate
= boolean_false_node
;
1426 if (gimple_uid (DR_STMT (dr
)) == 0)
1427 gimple_set_uid (DR_STMT (dr
), i
+ 1);
1429 /* If DR doesn't have innermost loop behavior or it's a compound
1430 memory reference, we synthesize its innermost loop behavior
1432 if (TREE_CODE (ref
) == COMPONENT_REF
1433 || TREE_CODE (ref
) == IMAGPART_EXPR
1434 || TREE_CODE (ref
) == REALPART_EXPR
1435 || !(DR_BASE_ADDRESS (dr
) || DR_OFFSET (dr
)
1436 || DR_INIT (dr
) || DR_STEP (dr
)))
1438 while (TREE_CODE (ref
) == COMPONENT_REF
1439 || TREE_CODE (ref
) == IMAGPART_EXPR
1440 || TREE_CODE (ref
) == REALPART_EXPR
)
1441 ref
= TREE_OPERAND (ref
, 0);
1443 memset (&DR_INNERMOST (dr
), 0, sizeof (DR_INNERMOST (dr
)));
1444 DR_BASE_ADDRESS (dr
) = ref
;
1446 hash_memrefs_baserefs_and_store_DRs_read_written_info (dr
);
1449 for (i
= 0; i
< loop
->num_nodes
; i
++)
1451 basic_block bb
= ifc_bbs
[i
];
1452 gimple_stmt_iterator itr
;
1454 /* Check the if-convertibility of statements in predicated BBs. */
1455 if (!dominated_by_p (CDI_DOMINATORS
, loop
->latch
, bb
))
1456 for (itr
= gsi_start_bb (bb
); !gsi_end_p (itr
); gsi_next (&itr
))
1457 if (!if_convertible_stmt_p (gsi_stmt (itr
), *refs
))
1461 /* Checking PHIs needs to be done after stmts, as the fact whether there
1462 are any masked loads or stores affects the tests. */
1463 for (i
= 0; i
< loop
->num_nodes
; i
++)
1465 basic_block bb
= ifc_bbs
[i
];
1468 for (itr
= gsi_start_phis (bb
); !gsi_end_p (itr
); gsi_next (&itr
))
1469 if (!if_convertible_phi_p (loop
, bb
, itr
.phi ()))
1474 fprintf (dump_file
, "Applying if-conversion\n");
1479 /* Return true when LOOP is if-convertible.
1480 LOOP is if-convertible if:
1482 - it has two or more basic blocks,
1483 - it has only one exit,
1484 - loop header is not the exit edge,
1485 - if its basic blocks and phi nodes are if convertible. */
1488 if_convertible_loop_p (struct loop
*loop
)
1493 vec
<data_reference_p
> refs
;
1495 /* Handle only innermost loop. */
1496 if (!loop
|| loop
->inner
)
1498 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1499 fprintf (dump_file
, "not innermost loop\n");
1503 /* If only one block, no need for if-conversion. */
1504 if (loop
->num_nodes
<= 2)
1506 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1507 fprintf (dump_file
, "less than 2 basic blocks\n");
1511 /* More than one loop exit is too much to handle. */
1512 if (!single_exit (loop
))
1514 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1515 fprintf (dump_file
, "multiple exits\n");
1519 /* If one of the loop header's edge is an exit edge then do not
1520 apply if-conversion. */
1521 FOR_EACH_EDGE (e
, ei
, loop
->header
->succs
)
1522 if (loop_exit_edge_p (loop
, e
))
1526 res
= if_convertible_loop_p_1 (loop
, &refs
);
1528 data_reference_p dr
;
1530 for (i
= 0; refs
.iterate (i
, &dr
); i
++)
1533 free_data_refs (refs
);
1535 delete innermost_DR_map
;
1536 innermost_DR_map
= NULL
;
1538 delete baseref_DR_map
;
1539 baseref_DR_map
= NULL
;
1544 /* Returns true if def-stmt for phi argument ARG is simple increment/decrement
1545 which is in predicated basic block.
1546 In fact, the following PHI pattern is searching:
1548 reduc_1 = PHI <..., reduc_2>
1552 reduc_2 = PHI <reduc_1, reduc_3>
1554 ARG_0 and ARG_1 are correspondent PHI arguments.
1555 REDUC, OP0 and OP1 contain reduction stmt and its operands.
1556 EXTENDED is true if PHI has > 2 arguments. */
1559 is_cond_scalar_reduction (gimple
*phi
, gimple
**reduc
, tree arg_0
, tree arg_1
,
1560 tree
*op0
, tree
*op1
, bool extended
)
1562 tree lhs
, r_op1
, r_op2
;
1564 gimple
*header_phi
= NULL
;
1565 enum tree_code reduction_op
;
1566 basic_block bb
= gimple_bb (phi
);
1567 struct loop
*loop
= bb
->loop_father
;
1568 edge latch_e
= loop_latch_edge (loop
);
1569 imm_use_iterator imm_iter
;
1570 use_operand_p use_p
;
1573 bool result
= false;
1574 if (TREE_CODE (arg_0
) != SSA_NAME
|| TREE_CODE (arg_1
) != SSA_NAME
)
1577 if (!extended
&& gimple_code (SSA_NAME_DEF_STMT (arg_0
)) == GIMPLE_PHI
)
1580 header_phi
= SSA_NAME_DEF_STMT (arg_0
);
1581 stmt
= SSA_NAME_DEF_STMT (arg_1
);
1583 else if (gimple_code (SSA_NAME_DEF_STMT (arg_1
)) == GIMPLE_PHI
)
1586 header_phi
= SSA_NAME_DEF_STMT (arg_1
);
1587 stmt
= SSA_NAME_DEF_STMT (arg_0
);
1591 if (gimple_bb (header_phi
) != loop
->header
)
1594 if (PHI_ARG_DEF_FROM_EDGE (header_phi
, latch_e
) != PHI_RESULT (phi
))
1597 if (gimple_code (stmt
) != GIMPLE_ASSIGN
1598 || gimple_has_volatile_ops (stmt
))
1601 if (!flow_bb_inside_loop_p (loop
, gimple_bb (stmt
)))
1604 if (!is_predicated (gimple_bb (stmt
)))
1607 /* Check that stmt-block is predecessor of phi-block. */
1608 FOR_EACH_EDGE (e
, ei
, gimple_bb (stmt
)->succs
)
1617 if (!has_single_use (lhs
))
1620 reduction_op
= gimple_assign_rhs_code (stmt
);
1621 if (reduction_op
!= PLUS_EXPR
&& reduction_op
!= MINUS_EXPR
)
1623 r_op1
= gimple_assign_rhs1 (stmt
);
1624 r_op2
= gimple_assign_rhs2 (stmt
);
1626 /* Make R_OP1 to hold reduction variable. */
1627 if (r_op2
== PHI_RESULT (header_phi
)
1628 && reduction_op
== PLUS_EXPR
)
1629 std::swap (r_op1
, r_op2
);
1630 else if (r_op1
!= PHI_RESULT (header_phi
))
1633 /* Check that R_OP1 is used in reduction stmt or in PHI only. */
1634 FOR_EACH_IMM_USE_FAST (use_p
, imm_iter
, r_op1
)
1636 gimple
*use_stmt
= USE_STMT (use_p
);
1637 if (is_gimple_debug (use_stmt
))
1639 if (use_stmt
== stmt
)
1641 if (gimple_code (use_stmt
) != GIMPLE_PHI
)
1645 *op0
= r_op1
; *op1
= r_op2
;
1650 /* Converts conditional scalar reduction into unconditional form, e.g.
1652 if (_5 != 0) goto bb_5 else goto bb_6
1658 # res_2 = PHI <res_13(4), res_6(5)>
1661 will be converted into sequence
1662 _ifc__1 = _5 != 0 ? 1 : 0;
1663 res_2 = res_13 + _ifc__1;
1664 Argument SWAP tells that arguments of conditional expression should be
1666 Returns rhs of resulting PHI assignment. */
1669 convert_scalar_cond_reduction (gimple
*reduc
, gimple_stmt_iterator
*gsi
,
1670 tree cond
, tree op0
, tree op1
, bool swap
)
1672 gimple_stmt_iterator stmt_it
;
1675 tree rhs1
= gimple_assign_rhs1 (reduc
);
1676 tree tmp
= make_temp_ssa_name (TREE_TYPE (rhs1
), NULL
, "_ifc_");
1678 tree zero
= build_zero_cst (TREE_TYPE (rhs1
));
1680 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1682 fprintf (dump_file
, "Found cond scalar reduction.\n");
1683 print_gimple_stmt (dump_file
, reduc
, 0, TDF_SLIM
);
1686 /* Build cond expression using COND and constant operand
1687 of reduction rhs. */
1688 c
= fold_build_cond_expr (TREE_TYPE (rhs1
),
1689 unshare_expr (cond
),
1693 /* Create assignment stmt and insert it at GSI. */
1694 new_assign
= gimple_build_assign (tmp
, c
);
1695 gsi_insert_before (gsi
, new_assign
, GSI_SAME_STMT
);
1696 /* Build rhs for unconditional increment/decrement. */
1697 rhs
= fold_build2 (gimple_assign_rhs_code (reduc
),
1698 TREE_TYPE (rhs1
), op0
, tmp
);
1700 /* Delete original reduction stmt. */
1701 stmt_it
= gsi_for_stmt (reduc
);
1702 gsi_remove (&stmt_it
, true);
1703 release_defs (reduc
);
1707 /* Produce condition for all occurrences of ARG in PHI node. */
1710 gen_phi_arg_condition (gphi
*phi
, vec
<int> *occur
,
1711 gimple_stmt_iterator
*gsi
)
1715 tree cond
= NULL_TREE
;
1719 len
= occur
->length ();
1720 gcc_assert (len
> 0);
1721 for (i
= 0; i
< len
; i
++)
1723 e
= gimple_phi_arg_edge (phi
, (*occur
)[i
]);
1724 c
= bb_predicate (e
->src
);
1725 if (is_true_predicate (c
))
1730 c
= force_gimple_operand_gsi_1 (gsi
, unshare_expr (c
),
1731 is_gimple_condexpr
, NULL_TREE
,
1732 true, GSI_SAME_STMT
);
1733 if (cond
!= NULL_TREE
)
1735 /* Must build OR expression. */
1736 cond
= fold_or_predicates (EXPR_LOCATION (c
), c
, cond
);
1737 cond
= force_gimple_operand_gsi_1 (gsi
, unshare_expr (cond
),
1738 is_gimple_condexpr
, NULL_TREE
,
1739 true, GSI_SAME_STMT
);
1744 gcc_assert (cond
!= NULL_TREE
);
1748 /* Local valueization callback that follows all-use SSA edges. */
1751 ifcvt_follow_ssa_use_edges (tree val
)
1756 /* Replace a scalar PHI node with a COND_EXPR using COND as condition.
1757 This routine can handle PHI nodes with more than two arguments.
1760 S1: A = PHI <x1(1), x2(5)>
1762 S2: A = cond ? x1 : x2;
1764 The generated code is inserted at GSI that points to the top of
1765 basic block's statement list.
1766 If PHI node has more than two arguments a chain of conditional
1767 expression is produced. */
1771 predicate_scalar_phi (gphi
*phi
, gimple_stmt_iterator
*gsi
)
1773 gimple
*new_stmt
= NULL
, *reduc
;
1774 tree rhs
, res
, arg0
, arg1
, op0
, op1
, scev
;
1776 unsigned int index0
;
1777 unsigned int max
, args_len
;
1782 res
= gimple_phi_result (phi
);
1783 if (virtual_operand_p (res
))
1786 if ((rhs
= degenerate_phi_result (phi
))
1787 || ((scev
= analyze_scalar_evolution (gimple_bb (phi
)->loop_father
,
1789 && !chrec_contains_undetermined (scev
)
1791 && (rhs
= gimple_phi_arg_def (phi
, 0))))
1793 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1795 fprintf (dump_file
, "Degenerate phi!\n");
1796 print_gimple_stmt (dump_file
, phi
, 0, TDF_SLIM
);
1798 new_stmt
= gimple_build_assign (res
, rhs
);
1799 gsi_insert_before (gsi
, new_stmt
, GSI_SAME_STMT
);
1800 update_stmt (new_stmt
);
1804 bb
= gimple_bb (phi
);
1805 if (EDGE_COUNT (bb
->preds
) == 2)
1807 /* Predicate ordinary PHI node with 2 arguments. */
1808 edge first_edge
, second_edge
;
1809 basic_block true_bb
;
1810 first_edge
= EDGE_PRED (bb
, 0);
1811 second_edge
= EDGE_PRED (bb
, 1);
1812 cond
= bb_predicate (first_edge
->src
);
1813 if (TREE_CODE (cond
) == TRUTH_NOT_EXPR
)
1814 std::swap (first_edge
, second_edge
);
1815 if (EDGE_COUNT (first_edge
->src
->succs
) > 1)
1817 cond
= bb_predicate (second_edge
->src
);
1818 if (TREE_CODE (cond
) == TRUTH_NOT_EXPR
)
1819 cond
= TREE_OPERAND (cond
, 0);
1821 first_edge
= second_edge
;
1824 cond
= bb_predicate (first_edge
->src
);
1825 /* Gimplify the condition to a valid cond-expr conditonal operand. */
1826 cond
= force_gimple_operand_gsi_1 (gsi
, unshare_expr (cond
),
1827 is_gimple_condexpr
, NULL_TREE
,
1828 true, GSI_SAME_STMT
);
1829 true_bb
= first_edge
->src
;
1830 if (EDGE_PRED (bb
, 1)->src
== true_bb
)
1832 arg0
= gimple_phi_arg_def (phi
, 1);
1833 arg1
= gimple_phi_arg_def (phi
, 0);
1837 arg0
= gimple_phi_arg_def (phi
, 0);
1838 arg1
= gimple_phi_arg_def (phi
, 1);
1840 if (is_cond_scalar_reduction (phi
, &reduc
, arg0
, arg1
,
1842 /* Convert reduction stmt into vectorizable form. */
1843 rhs
= convert_scalar_cond_reduction (reduc
, gsi
, cond
, op0
, op1
,
1844 true_bb
!= gimple_bb (reduc
));
1846 /* Build new RHS using selected condition and arguments. */
1847 rhs
= fold_build_cond_expr (TREE_TYPE (res
), unshare_expr (cond
),
1849 new_stmt
= gimple_build_assign (res
, rhs
);
1850 gsi_insert_before (gsi
, new_stmt
, GSI_SAME_STMT
);
1851 gimple_stmt_iterator new_gsi
= gsi_for_stmt (new_stmt
);
1852 if (fold_stmt (&new_gsi
, ifcvt_follow_ssa_use_edges
))
1854 new_stmt
= gsi_stmt (new_gsi
);
1855 update_stmt (new_stmt
);
1858 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1860 fprintf (dump_file
, "new phi replacement stmt\n");
1861 print_gimple_stmt (dump_file
, new_stmt
, 0, TDF_SLIM
);
1866 /* Create hashmap for PHI node which contain vector of argument indexes
1867 having the same value. */
1869 hash_map
<tree_operand_hash
, auto_vec
<int> > phi_arg_map
;
1870 unsigned int num_args
= gimple_phi_num_args (phi
);
1872 /* Vector of different PHI argument values. */
1873 auto_vec
<tree
> args (num_args
);
1875 /* Compute phi_arg_map. */
1876 for (i
= 0; i
< num_args
; i
++)
1880 arg
= gimple_phi_arg_def (phi
, i
);
1881 if (!phi_arg_map
.get (arg
))
1882 args
.quick_push (arg
);
1883 phi_arg_map
.get_or_insert (arg
).safe_push (i
);
1886 /* Determine element with max number of occurrences. */
1889 args_len
= args
.length ();
1890 for (i
= 0; i
< args_len
; i
++)
1893 if ((len
= phi_arg_map
.get (args
[i
])->length ()) > max
)
1900 /* Put element with max number of occurences to the end of ARGS. */
1901 if (max_ind
!= -1 && max_ind
+1 != (int) args_len
)
1902 std::swap (args
[args_len
- 1], args
[max_ind
]);
1904 /* Handle one special case when number of arguments with different values
1905 is equal 2 and one argument has the only occurrence. Such PHI can be
1906 handled as if would have only 2 arguments. */
1907 if (args_len
== 2 && phi_arg_map
.get (args
[0])->length () == 1)
1910 indexes
= phi_arg_map
.get (args
[0]);
1911 index0
= (*indexes
)[0];
1914 e
= gimple_phi_arg_edge (phi
, index0
);
1915 cond
= bb_predicate (e
->src
);
1916 if (TREE_CODE (cond
) == TRUTH_NOT_EXPR
)
1919 cond
= TREE_OPERAND (cond
, 0);
1921 /* Gimplify the condition to a valid cond-expr conditonal operand. */
1922 cond
= force_gimple_operand_gsi_1 (gsi
, unshare_expr (cond
),
1923 is_gimple_condexpr
, NULL_TREE
,
1924 true, GSI_SAME_STMT
);
1925 if (!(is_cond_scalar_reduction (phi
, &reduc
, arg0
, arg1
,
1927 rhs
= fold_build_cond_expr (TREE_TYPE (res
), unshare_expr (cond
),
1931 /* Convert reduction stmt into vectorizable form. */
1932 rhs
= convert_scalar_cond_reduction (reduc
, gsi
, cond
, op0
, op1
,
1934 new_stmt
= gimple_build_assign (res
, rhs
);
1935 gsi_insert_before (gsi
, new_stmt
, GSI_SAME_STMT
);
1936 update_stmt (new_stmt
);
1942 tree type
= TREE_TYPE (gimple_phi_result (phi
));
1945 for (i
= 0; i
< args_len
; i
++)
1948 indexes
= phi_arg_map
.get (args
[i
]);
1949 if (i
!= args_len
- 1)
1950 lhs
= make_temp_ssa_name (type
, NULL
, "_ifc_");
1953 cond
= gen_phi_arg_condition (phi
, indexes
, gsi
);
1954 rhs
= fold_build_cond_expr (type
, unshare_expr (cond
),
1956 new_stmt
= gimple_build_assign (lhs
, rhs
);
1957 gsi_insert_before (gsi
, new_stmt
, GSI_SAME_STMT
);
1958 update_stmt (new_stmt
);
1963 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1965 fprintf (dump_file
, "new extended phi replacement stmt\n");
1966 print_gimple_stmt (dump_file
, new_stmt
, 0, TDF_SLIM
);
1970 /* Replaces in LOOP all the scalar phi nodes other than those in the
1971 LOOP->header block with conditional modify expressions. */
1974 predicate_all_scalar_phis (struct loop
*loop
)
1977 unsigned int orig_loop_num_nodes
= loop
->num_nodes
;
1980 for (i
= 1; i
< orig_loop_num_nodes
; i
++)
1983 gimple_stmt_iterator gsi
;
1984 gphi_iterator phi_gsi
;
1987 if (bb
== loop
->header
)
1990 phi_gsi
= gsi_start_phis (bb
);
1991 if (gsi_end_p (phi_gsi
))
1994 gsi
= gsi_after_labels (bb
);
1995 while (!gsi_end_p (phi_gsi
))
1997 phi
= phi_gsi
.phi ();
1998 if (virtual_operand_p (gimple_phi_result (phi
)))
1999 gsi_next (&phi_gsi
);
2002 predicate_scalar_phi (phi
, &gsi
);
2003 remove_phi_node (&phi_gsi
, false);
2009 /* Insert in each basic block of LOOP the statements produced by the
2010 gimplification of the predicates. */
2013 insert_gimplified_predicates (loop_p loop
)
2017 for (i
= 0; i
< loop
->num_nodes
; i
++)
2019 basic_block bb
= ifc_bbs
[i
];
2021 if (!is_predicated (bb
))
2022 gcc_assert (bb_predicate_gimplified_stmts (bb
) == NULL
);
2023 if (!is_predicated (bb
))
2025 /* Do not insert statements for a basic block that is not
2026 predicated. Also make sure that the predicate of the
2027 basic block is set to true. */
2028 reset_bb_predicate (bb
);
2032 stmts
= bb_predicate_gimplified_stmts (bb
);
2035 if (any_pred_load_store
)
2037 /* Insert the predicate of the BB just after the label,
2038 as the if-conversion of memory writes will use this
2040 gimple_stmt_iterator gsi
= gsi_after_labels (bb
);
2041 gsi_insert_seq_before (&gsi
, stmts
, GSI_SAME_STMT
);
2045 /* Insert the predicate of the BB at the end of the BB
2046 as this would reduce the register pressure: the only
2047 use of this predicate will be in successor BBs. */
2048 gimple_stmt_iterator gsi
= gsi_last_bb (bb
);
2051 || stmt_ends_bb_p (gsi_stmt (gsi
)))
2052 gsi_insert_seq_before (&gsi
, stmts
, GSI_SAME_STMT
);
2054 gsi_insert_seq_after (&gsi
, stmts
, GSI_SAME_STMT
);
2057 /* Once the sequence is code generated, set it to NULL. */
2058 set_bb_predicate_gimplified_stmts (bb
, NULL
);
2063 /* Helper function for predicate_mem_writes. Returns index of existent
2064 mask if it was created for given SIZE and -1 otherwise. */
2067 mask_exists (int size
, vec
<int> vec
)
2071 FOR_EACH_VEC_ELT (vec
, ix
, v
)
2077 /* Predicate each write to memory in LOOP.
2079 This function transforms control flow constructs containing memory
2082 | for (i = 0; i < N; i++)
2086 into the following form that does not contain control flow:
2088 | for (i = 0; i < N; i++)
2089 | A[i] = cond ? expr : A[i];
2091 The original CFG looks like this:
2098 | if (i < N) goto bb_5 else goto bb_2
2102 | cond = some_computation;
2103 | if (cond) goto bb_3 else goto bb_4
2115 insert_gimplified_predicates inserts the computation of the COND
2116 expression at the beginning of the destination basic block:
2123 | if (i < N) goto bb_5 else goto bb_2
2127 | cond = some_computation;
2128 | if (cond) goto bb_3 else goto bb_4
2132 | cond = some_computation;
2141 predicate_mem_writes is then predicating the memory write as follows:
2148 | if (i < N) goto bb_5 else goto bb_2
2152 | if (cond) goto bb_3 else goto bb_4
2156 | cond = some_computation;
2157 | A[i] = cond ? expr : A[i];
2165 and finally combine_blocks removes the basic block boundaries making
2166 the loop vectorizable:
2170 | if (i < N) goto bb_5 else goto bb_1
2174 | cond = some_computation;
2175 | A[i] = cond ? expr : A[i];
2176 | if (i < N) goto bb_5 else goto bb_4
2185 predicate_mem_writes (loop_p loop
)
2187 unsigned int i
, orig_loop_num_nodes
= loop
->num_nodes
;
2188 auto_vec
<int, 1> vect_sizes
;
2189 auto_vec
<tree
, 1> vect_masks
;
2191 for (i
= 1; i
< orig_loop_num_nodes
; i
++)
2193 gimple_stmt_iterator gsi
;
2194 basic_block bb
= ifc_bbs
[i
];
2195 tree cond
= bb_predicate (bb
);
2200 if (is_true_predicate (cond
))
2204 if (TREE_CODE (cond
) == TRUTH_NOT_EXPR
)
2207 cond
= TREE_OPERAND (cond
, 0);
2210 vect_sizes
.truncate (0);
2211 vect_masks
.truncate (0);
2213 for (gsi
= gsi_start_bb (bb
); !gsi_end_p (gsi
);)
2215 if (!gimple_assign_single_p (stmt
= gsi_stmt (gsi
)))
2217 else if (is_false_predicate (cond
)
2218 && gimple_vdef (stmt
))
2220 unlink_stmt_vdef (stmt
);
2221 gsi_remove (&gsi
, true);
2222 release_defs (stmt
);
2225 else if (gimple_plf (stmt
, GF_PLF_2
))
2227 tree lhs
= gimple_assign_lhs (stmt
);
2228 tree rhs
= gimple_assign_rhs1 (stmt
);
2229 tree ref
, addr
, ptr
, mask
;
2231 gimple_seq stmts
= NULL
;
2232 machine_mode mode
= TYPE_MODE (TREE_TYPE (lhs
));
2233 /* We checked before setting GF_PLF_2 that an equivalent
2234 integer mode exists. */
2235 int bitsize
= GET_MODE_BITSIZE (mode
).to_constant ();
2236 ref
= TREE_CODE (lhs
) == SSA_NAME
? rhs
: lhs
;
2237 mark_addressable (ref
);
2238 addr
= force_gimple_operand_gsi (&gsi
, build_fold_addr_expr (ref
),
2239 true, NULL_TREE
, true,
2241 if (!vect_sizes
.is_empty ()
2242 && (index
= mask_exists (bitsize
, vect_sizes
)) != -1)
2243 /* Use created mask. */
2244 mask
= vect_masks
[index
];
2247 if (COMPARISON_CLASS_P (cond
))
2248 mask
= gimple_build (&stmts
, TREE_CODE (cond
),
2250 TREE_OPERAND (cond
, 0),
2251 TREE_OPERAND (cond
, 1));
2258 = constant_boolean_node (true, TREE_TYPE (mask
));
2259 mask
= gimple_build (&stmts
, BIT_XOR_EXPR
,
2260 TREE_TYPE (mask
), mask
, true_val
);
2262 gsi_insert_seq_before (&gsi
, stmts
, GSI_SAME_STMT
);
2264 /* Save mask and its size for further use. */
2265 vect_sizes
.safe_push (bitsize
);
2266 vect_masks
.safe_push (mask
);
2268 ptr
= build_int_cst (reference_alias_ptr_type (ref
),
2269 get_object_alignment (ref
));
2270 /* Copy points-to info if possible. */
2271 if (TREE_CODE (addr
) == SSA_NAME
&& !SSA_NAME_PTR_INFO (addr
))
2272 copy_ref_info (build2 (MEM_REF
, TREE_TYPE (ref
), addr
, ptr
),
2274 if (TREE_CODE (lhs
) == SSA_NAME
)
2277 = gimple_build_call_internal (IFN_MASK_LOAD
, 3, addr
,
2279 gimple_call_set_lhs (new_stmt
, lhs
);
2280 gimple_set_vuse (new_stmt
, gimple_vuse (stmt
));
2285 = gimple_build_call_internal (IFN_MASK_STORE
, 4, addr
, ptr
,
2287 gimple_set_vuse (new_stmt
, gimple_vuse (stmt
));
2288 gimple_set_vdef (new_stmt
, gimple_vdef (stmt
));
2289 SSA_NAME_DEF_STMT (gimple_vdef (new_stmt
)) = new_stmt
;
2291 gimple_call_set_nothrow (new_stmt
, true);
2293 gsi_replace (&gsi
, new_stmt
, true);
2295 else if (gimple_vdef (stmt
))
2297 tree lhs
= gimple_assign_lhs (stmt
);
2298 tree rhs
= gimple_assign_rhs1 (stmt
);
2299 tree type
= TREE_TYPE (lhs
);
2301 lhs
= ifc_temp_var (type
, unshare_expr (lhs
), &gsi
);
2302 rhs
= ifc_temp_var (type
, unshare_expr (rhs
), &gsi
);
2304 std::swap (lhs
, rhs
);
2305 cond
= force_gimple_operand_gsi_1 (&gsi
, unshare_expr (cond
),
2306 is_gimple_condexpr
, NULL_TREE
,
2307 true, GSI_SAME_STMT
);
2308 rhs
= fold_build_cond_expr (type
, unshare_expr (cond
), rhs
, lhs
);
2309 gimple_assign_set_rhs1 (stmt
, ifc_temp_var (type
, rhs
, &gsi
));
2317 /* Remove all GIMPLE_CONDs and GIMPLE_LABELs of all the basic blocks
2318 other than the exit and latch of the LOOP. Also resets the
2319 GIMPLE_DEBUG information. */
2322 remove_conditions_and_labels (loop_p loop
)
2324 gimple_stmt_iterator gsi
;
2327 for (i
= 0; i
< loop
->num_nodes
; i
++)
2329 basic_block bb
= ifc_bbs
[i
];
2331 if (bb_with_exit_edge_p (loop
, bb
)
2332 || bb
== loop
->latch
)
2335 for (gsi
= gsi_start_bb (bb
); !gsi_end_p (gsi
); )
2336 switch (gimple_code (gsi_stmt (gsi
)))
2340 gsi_remove (&gsi
, true);
2344 /* ??? Should there be conditional GIMPLE_DEBUG_BINDs? */
2345 if (gimple_debug_bind_p (gsi_stmt (gsi
)))
2347 gimple_debug_bind_reset_value (gsi_stmt (gsi
));
2348 update_stmt (gsi_stmt (gsi
));
2359 /* Combine all the basic blocks from LOOP into one or two super basic
2360 blocks. Replace PHI nodes with conditional modify expressions. */
2363 combine_blocks (struct loop
*loop
)
2365 basic_block bb
, exit_bb
, merge_target_bb
;
2366 unsigned int orig_loop_num_nodes
= loop
->num_nodes
;
2371 remove_conditions_and_labels (loop
);
2372 insert_gimplified_predicates (loop
);
2373 predicate_all_scalar_phis (loop
);
2375 if (any_pred_load_store
)
2376 predicate_mem_writes (loop
);
2378 /* Merge basic blocks: first remove all the edges in the loop,
2379 except for those from the exit block. */
2381 bool *predicated
= XNEWVEC (bool, orig_loop_num_nodes
);
2382 for (i
= 0; i
< orig_loop_num_nodes
; i
++)
2385 predicated
[i
] = !is_true_predicate (bb_predicate (bb
));
2386 free_bb_predicate (bb
);
2387 if (bb_with_exit_edge_p (loop
, bb
))
2389 gcc_assert (exit_bb
== NULL
);
2393 gcc_assert (exit_bb
!= loop
->latch
);
2395 for (i
= 1; i
< orig_loop_num_nodes
; i
++)
2399 for (ei
= ei_start (bb
->preds
); (e
= ei_safe_edge (ei
));)
2401 if (e
->src
== exit_bb
)
2408 if (exit_bb
!= NULL
)
2410 if (exit_bb
!= loop
->header
)
2412 /* Connect this node to loop header. */
2413 make_single_succ_edge (loop
->header
, exit_bb
, EDGE_FALLTHRU
);
2414 set_immediate_dominator (CDI_DOMINATORS
, exit_bb
, loop
->header
);
2417 /* Redirect non-exit edges to loop->latch. */
2418 FOR_EACH_EDGE (e
, ei
, exit_bb
->succs
)
2420 if (!loop_exit_edge_p (loop
, e
))
2421 redirect_edge_and_branch (e
, loop
->latch
);
2423 set_immediate_dominator (CDI_DOMINATORS
, loop
->latch
, exit_bb
);
2427 /* If the loop does not have an exit, reconnect header and latch. */
2428 make_edge (loop
->header
, loop
->latch
, EDGE_FALLTHRU
);
2429 set_immediate_dominator (CDI_DOMINATORS
, loop
->latch
, loop
->header
);
2432 merge_target_bb
= loop
->header
;
2434 /* Get at the virtual def valid for uses starting at the first block
2435 we merge into the header. Without a virtual PHI the loop has the
2436 same virtual use on all stmts. */
2437 gphi
*vphi
= get_virtual_phi (loop
->header
);
2438 tree last_vdef
= NULL_TREE
;
2441 last_vdef
= gimple_phi_result (vphi
);
2442 for (gimple_stmt_iterator gsi
= gsi_start_bb (loop
->header
);
2443 ! gsi_end_p (gsi
); gsi_next (&gsi
))
2444 if (gimple_vdef (gsi_stmt (gsi
)))
2445 last_vdef
= gimple_vdef (gsi_stmt (gsi
));
2447 for (i
= 1; i
< orig_loop_num_nodes
; i
++)
2449 gimple_stmt_iterator gsi
;
2450 gimple_stmt_iterator last
;
2454 if (bb
== exit_bb
|| bb
== loop
->latch
)
2457 /* We release virtual PHIs late because we have to propagate them
2458 out using the current VUSE. The def might be the one used
2460 vphi
= get_virtual_phi (bb
);
2463 imm_use_iterator iter
;
2464 use_operand_p use_p
;
2466 FOR_EACH_IMM_USE_STMT (use_stmt
, iter
, gimple_phi_result (vphi
))
2468 FOR_EACH_IMM_USE_ON_STMT (use_p
, iter
)
2469 SET_USE (use_p
, last_vdef
);
2471 gsi
= gsi_for_stmt (vphi
);
2472 remove_phi_node (&gsi
, true);
2475 /* Make stmts member of loop->header and clear range info from all stmts
2476 in BB which is now no longer executed conditional on a predicate we
2477 could have derived it from. */
2478 for (gsi
= gsi_start_bb (bb
); !gsi_end_p (gsi
); gsi_next (&gsi
))
2480 gimple
*stmt
= gsi_stmt (gsi
);
2481 gimple_set_bb (stmt
, merge_target_bb
);
2482 /* Update virtual operands. */
2485 use_operand_p use_p
= ssa_vuse_operand (stmt
);
2487 && USE_FROM_PTR (use_p
) != last_vdef
)
2488 SET_USE (use_p
, last_vdef
);
2489 if (gimple_vdef (stmt
))
2490 last_vdef
= gimple_vdef (stmt
);
2496 FOR_EACH_SSA_TREE_OPERAND (op
, stmt
, i
, SSA_OP_DEF
)
2497 reset_flow_sensitive_info (op
);
2501 /* Update stmt list. */
2502 last
= gsi_last_bb (merge_target_bb
);
2503 gsi_insert_seq_after_without_update (&last
, bb_seq (bb
), GSI_NEW_STMT
);
2504 set_bb_seq (bb
, NULL
);
2506 delete_basic_block (bb
);
2509 /* If possible, merge loop header to the block with the exit edge.
2510 This reduces the number of basic blocks to two, to please the
2511 vectorizer that handles only loops with two nodes. */
2513 && exit_bb
!= loop
->header
)
2515 /* We release virtual PHIs late because we have to propagate them
2516 out using the current VUSE. The def might be the one used
2518 vphi
= get_virtual_phi (exit_bb
);
2521 imm_use_iterator iter
;
2522 use_operand_p use_p
;
2524 FOR_EACH_IMM_USE_STMT (use_stmt
, iter
, gimple_phi_result (vphi
))
2526 FOR_EACH_IMM_USE_ON_STMT (use_p
, iter
)
2527 SET_USE (use_p
, last_vdef
);
2529 gimple_stmt_iterator gsi
= gsi_for_stmt (vphi
);
2530 remove_phi_node (&gsi
, true);
2533 if (can_merge_blocks_p (loop
->header
, exit_bb
))
2534 merge_blocks (loop
->header
, exit_bb
);
2542 /* Version LOOP before if-converting it; the original loop
2543 will be if-converted, the new copy of the loop will not,
2544 and the LOOP_VECTORIZED internal call will be guarding which
2545 loop to execute. The vectorizer pass will fold this
2546 internal call into either true or false.
2548 Note that this function intentionally invalidates profile. Both edges
2549 out of LOOP_VECTORIZED must have 100% probability so the profile remains
2550 consistent after the condition is folded in the vectorizer. */
2552 static struct loop
*
2553 version_loop_for_if_conversion (struct loop
*loop
)
2555 basic_block cond_bb
;
2556 tree cond
= make_ssa_name (boolean_type_node
);
2557 struct loop
*new_loop
;
2559 gimple_stmt_iterator gsi
;
2560 unsigned int save_length
;
2562 g
= gimple_build_call_internal (IFN_LOOP_VECTORIZED
, 2,
2563 build_int_cst (integer_type_node
, loop
->num
),
2565 gimple_call_set_lhs (g
, cond
);
2567 /* Save BB->aux around loop_version as that uses the same field. */
2568 save_length
= loop
->inner
? loop
->inner
->num_nodes
: loop
->num_nodes
;
2569 void **saved_preds
= XALLOCAVEC (void *, save_length
);
2570 for (unsigned i
= 0; i
< save_length
; i
++)
2571 saved_preds
[i
] = ifc_bbs
[i
]->aux
;
2573 initialize_original_copy_tables ();
2574 /* At this point we invalidate porfile confistency until IFN_LOOP_VECTORIZED
2575 is re-merged in the vectorizer. */
2576 new_loop
= loop_version (loop
, cond
, &cond_bb
,
2577 profile_probability::always (),
2578 profile_probability::always (),
2579 profile_probability::always (),
2580 profile_probability::always (), true);
2581 free_original_copy_tables ();
2583 for (unsigned i
= 0; i
< save_length
; i
++)
2584 ifc_bbs
[i
]->aux
= saved_preds
[i
];
2586 if (new_loop
== NULL
)
2589 new_loop
->dont_vectorize
= true;
2590 new_loop
->force_vectorize
= false;
2591 gsi
= gsi_last_bb (cond_bb
);
2592 gimple_call_set_arg (g
, 1, build_int_cst (integer_type_node
, new_loop
->num
));
2593 gsi_insert_before (&gsi
, g
, GSI_SAME_STMT
);
2594 update_ssa (TODO_update_ssa
);
2598 /* Return true when LOOP satisfies the follow conditions that will
2599 allow it to be recognized by the vectorizer for outer-loop
2601 - The loop is not the root node of the loop tree.
2602 - The loop has exactly one inner loop.
2603 - The loop has a single exit.
2604 - The loop header has a single successor, which is the inner
2606 - Each of the inner and outer loop latches have a single
2608 - The loop exit block has a single predecessor, which is the
2609 inner loop's exit block. */
2612 versionable_outer_loop_p (struct loop
*loop
)
2614 if (!loop_outer (loop
)
2615 || loop
->dont_vectorize
2617 || loop
->inner
->next
2618 || !single_exit (loop
)
2619 || !single_succ_p (loop
->header
)
2620 || single_succ (loop
->header
) != loop
->inner
->header
2621 || !single_pred_p (loop
->latch
)
2622 || !single_pred_p (loop
->inner
->latch
))
2625 basic_block outer_exit
= single_pred (loop
->latch
);
2626 basic_block inner_exit
= single_pred (loop
->inner
->latch
);
2628 if (!single_pred_p (outer_exit
) || single_pred (outer_exit
) != inner_exit
)
2632 fprintf (dump_file
, "Found vectorizable outer loop for versioning\n");
2637 /* Performs splitting of critical edges. Skip splitting and return false
2638 if LOOP will not be converted because:
2640 - LOOP is not well formed.
2641 - LOOP has PHI with more than MAX_PHI_ARG_NUM arguments.
2643 Last restriction is valid only if AGGRESSIVE_IF_CONV is false. */
2646 ifcvt_split_critical_edges (struct loop
*loop
, bool aggressive_if_conv
)
2650 unsigned int num
= loop
->num_nodes
;
2655 auto_vec
<edge
> critical_edges
;
2657 /* Loop is not well formed. */
2658 if (num
<= 2 || loop
->inner
|| !single_exit (loop
))
2661 body
= get_loop_body (loop
);
2662 for (i
= 0; i
< num
; i
++)
2665 if (!aggressive_if_conv
2667 && EDGE_COUNT (bb
->preds
) > MAX_PHI_ARG_NUM
)
2669 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2671 "BB %d has complicated PHI with more than %u args.\n",
2672 bb
->index
, MAX_PHI_ARG_NUM
);
2677 if (bb
== loop
->latch
|| bb_with_exit_edge_p (loop
, bb
))
2680 stmt
= last_stmt (bb
);
2681 /* Skip basic blocks not ending with conditional branch. */
2682 if (!stmt
|| gimple_code (stmt
) != GIMPLE_COND
)
2685 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
2686 if (EDGE_CRITICAL_P (e
) && e
->dest
->loop_father
== loop
)
2687 critical_edges
.safe_push (e
);
2691 while (critical_edges
.length () > 0)
2693 e
= critical_edges
.pop ();
2694 /* Don't split if bb can be predicated along non-critical edge. */
2695 if (EDGE_COUNT (e
->dest
->preds
) > 2 || all_preds_critical_p (e
->dest
))
2702 /* Delete redundant statements produced by predication which prevents
2703 loop vectorization. */
2706 ifcvt_local_dce (basic_block bb
)
2711 gimple_stmt_iterator gsi
;
2712 auto_vec
<gimple
*> worklist
;
2713 enum gimple_code code
;
2714 use_operand_p use_p
;
2715 imm_use_iterator imm_iter
;
2717 worklist
.create (64);
2718 /* Consider all phi as live statements. */
2719 for (gsi
= gsi_start_phis (bb
); !gsi_end_p (gsi
); gsi_next (&gsi
))
2721 phi
= gsi_stmt (gsi
);
2722 gimple_set_plf (phi
, GF_PLF_2
, true);
2723 worklist
.safe_push (phi
);
2725 /* Consider load/store statements, CALL and COND as live. */
2726 for (gsi
= gsi_start_bb (bb
); !gsi_end_p (gsi
); gsi_next (&gsi
))
2728 stmt
= gsi_stmt (gsi
);
2729 if (gimple_store_p (stmt
)
2730 || gimple_assign_load_p (stmt
)
2731 || is_gimple_debug (stmt
))
2733 gimple_set_plf (stmt
, GF_PLF_2
, true);
2734 worklist
.safe_push (stmt
);
2737 code
= gimple_code (stmt
);
2738 if (code
== GIMPLE_COND
|| code
== GIMPLE_CALL
)
2740 gimple_set_plf (stmt
, GF_PLF_2
, true);
2741 worklist
.safe_push (stmt
);
2744 gimple_set_plf (stmt
, GF_PLF_2
, false);
2746 if (code
== GIMPLE_ASSIGN
)
2748 tree lhs
= gimple_assign_lhs (stmt
);
2749 FOR_EACH_IMM_USE_FAST (use_p
, imm_iter
, lhs
)
2751 stmt1
= USE_STMT (use_p
);
2752 if (gimple_bb (stmt1
) != bb
)
2754 gimple_set_plf (stmt
, GF_PLF_2
, true);
2755 worklist
.safe_push (stmt
);
2761 /* Propagate liveness through arguments of live stmt. */
2762 while (worklist
.length () > 0)
2765 use_operand_p use_p
;
2768 stmt
= worklist
.pop ();
2769 FOR_EACH_PHI_OR_STMT_USE (use_p
, stmt
, iter
, SSA_OP_USE
)
2771 use
= USE_FROM_PTR (use_p
);
2772 if (TREE_CODE (use
) != SSA_NAME
)
2774 stmt1
= SSA_NAME_DEF_STMT (use
);
2775 if (gimple_bb (stmt1
) != bb
2776 || gimple_plf (stmt1
, GF_PLF_2
))
2778 gimple_set_plf (stmt1
, GF_PLF_2
, true);
2779 worklist
.safe_push (stmt1
);
2782 /* Delete dead statements. */
2783 gsi
= gsi_start_bb (bb
);
2784 while (!gsi_end_p (gsi
))
2786 stmt
= gsi_stmt (gsi
);
2787 if (gimple_plf (stmt
, GF_PLF_2
))
2792 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2794 fprintf (dump_file
, "Delete dead stmt in bb#%d\n", bb
->index
);
2795 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
2797 gsi_remove (&gsi
, true);
2798 release_defs (stmt
);
2802 /* If-convert LOOP when it is legal. For the moment this pass has no
2803 profitability analysis. Returns non-zero todo flags when something
2807 tree_if_conversion (struct loop
*loop
)
2809 unsigned int todo
= 0;
2810 bool aggressive_if_conv
;
2816 any_pred_load_store
= false;
2817 any_complicated_phi
= false;
2819 /* Apply more aggressive if-conversion when loop or its outer loop were
2820 marked with simd pragma. When that's the case, we try to if-convert
2821 loop containing PHIs with more than MAX_PHI_ARG_NUM arguments. */
2822 aggressive_if_conv
= loop
->force_vectorize
;
2823 if (!aggressive_if_conv
)
2825 struct loop
*outer_loop
= loop_outer (loop
);
2826 if (outer_loop
&& outer_loop
->force_vectorize
)
2827 aggressive_if_conv
= true;
2830 if (!ifcvt_split_critical_edges (loop
, aggressive_if_conv
))
2833 if (!if_convertible_loop_p (loop
)
2834 || !dbg_cnt (if_conversion_tree
))
2837 if ((any_pred_load_store
|| any_complicated_phi
)
2838 && ((!flag_tree_loop_vectorize
&& !loop
->force_vectorize
)
2839 || loop
->dont_vectorize
))
2842 /* Since we have no cost model, always version loops unless the user
2843 specified -ftree-loop-if-convert or unless versioning is required.
2844 Either version this loop, or if the pattern is right for outer-loop
2845 vectorization, version the outer loop. In the latter case we will
2846 still if-convert the original inner loop. */
2847 if (any_pred_load_store
2848 || any_complicated_phi
2849 || flag_tree_loop_if_convert
!= 1)
2852 = (versionable_outer_loop_p (loop_outer (loop
))
2853 ? loop_outer (loop
) : loop
);
2854 struct loop
*nloop
= version_loop_for_if_conversion (vloop
);
2859 /* If versionable_outer_loop_p decided to version the
2860 outer loop, version also the inner loop of the non-vectorized
2861 loop copy. So we transform:
2865 if (LOOP_VECTORIZED (1, 3))
2871 loop3 (copy of loop1)
2872 if (LOOP_VECTORIZED (4, 5))
2873 loop4 (copy of loop2)
2875 loop5 (copy of loop4) */
2876 gcc_assert (nloop
->inner
&& nloop
->inner
->next
== NULL
);
2877 rloop
= nloop
->inner
;
2881 /* Now all statements are if-convertible. Combine all the basic
2882 blocks into one huge basic block doing the if-conversion
2884 combine_blocks (loop
);
2886 /* Delete dead predicate computations. */
2887 ifcvt_local_dce (loop
->header
);
2889 todo
|= TODO_cleanup_cfg
;
2896 for (i
= 0; i
< loop
->num_nodes
; i
++)
2897 free_bb_predicate (ifc_bbs
[i
]);
2911 /* Tree if-conversion pass management. */
2915 const pass_data pass_data_if_conversion
=
2917 GIMPLE_PASS
, /* type */
2919 OPTGROUP_NONE
, /* optinfo_flags */
2920 TV_TREE_LOOP_IFCVT
, /* tv_id */
2921 ( PROP_cfg
| PROP_ssa
), /* properties_required */
2922 0, /* properties_provided */
2923 0, /* properties_destroyed */
2924 0, /* todo_flags_start */
2925 0, /* todo_flags_finish */
2928 class pass_if_conversion
: public gimple_opt_pass
2931 pass_if_conversion (gcc::context
*ctxt
)
2932 : gimple_opt_pass (pass_data_if_conversion
, ctxt
)
2935 /* opt_pass methods: */
2936 virtual bool gate (function
*);
2937 virtual unsigned int execute (function
*);
2939 }; // class pass_if_conversion
2942 pass_if_conversion::gate (function
*fun
)
2944 return (((flag_tree_loop_vectorize
|| fun
->has_force_vectorize_loops
)
2945 && flag_tree_loop_if_convert
!= 0)
2946 || flag_tree_loop_if_convert
== 1);
2950 pass_if_conversion::execute (function
*fun
)
2955 if (number_of_loops (fun
) <= 1)
2958 FOR_EACH_LOOP (loop
, 0)
2959 if (flag_tree_loop_if_convert
== 1
2960 || ((flag_tree_loop_vectorize
|| loop
->force_vectorize
)
2961 && !loop
->dont_vectorize
))
2962 todo
|= tree_if_conversion (loop
);
2966 free_numbers_of_iterations_estimates (fun
);
2973 FOR_EACH_BB_FN (bb
, fun
)
2974 gcc_assert (!bb
->aux
);
2983 make_pass_if_conversion (gcc::context
*ctxt
)
2985 return new pass_if_conversion (ctxt
);