1 /* Combining of if-expressions on trees.
2 Copyright (C) 2007-2013 Free Software Foundation, Inc.
3 Contributed by Richard Guenther <rguenther@suse.de>
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
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/>. */
23 #include "coretypes.h"
26 #include "basic-block.h"
27 #include "tree-pretty-print.h"
29 #include "gimple-ssa.h"
31 #include "tree-phinodes.h"
32 #include "ssa-iterators.h"
33 #include "tree-pass.h"
35 /* This pass combines COND_EXPRs to simplify control flow. It
36 currently recognizes bit tests and comparisons in chains that
37 represent logical and or logical or of two COND_EXPRs.
39 It does so by walking basic blocks in a approximate reverse
40 post-dominator order and trying to match CFG patterns that
41 represent logical and or logical or of two COND_EXPRs.
42 Transformations are done if the COND_EXPR conditions match
45 1. two single bit tests X & (1 << Yn) (for logical and)
47 2. two bit tests X & Yn (for logical or)
49 3. two comparisons X OPn Y (for logical or)
51 To simplify this pass, removing basic blocks and dead code
52 is left to CFG cleanup and DCE. */
55 /* Recognize a if-then-else CFG pattern starting to match with the
56 COND_BB basic-block containing the COND_EXPR. The recognized
57 then end else blocks are stored to *THEN_BB and *ELSE_BB. If
58 *THEN_BB and/or *ELSE_BB are already set, they are required to
59 match the then and else basic-blocks to make the pattern match.
60 Returns true if the pattern matched, false otherwise. */
63 recognize_if_then_else (basic_block cond_bb
,
64 basic_block
*then_bb
, basic_block
*else_bb
)
68 if (EDGE_COUNT (cond_bb
->succs
) != 2)
71 /* Find the then/else edges. */
72 t
= EDGE_SUCC (cond_bb
, 0);
73 e
= EDGE_SUCC (cond_bb
, 1);
74 if (!(t
->flags
& EDGE_TRUE_VALUE
))
80 if (!(t
->flags
& EDGE_TRUE_VALUE
)
81 || !(e
->flags
& EDGE_FALSE_VALUE
))
84 /* Check if the edge destinations point to the required block. */
86 && t
->dest
!= *then_bb
)
89 && e
->dest
!= *else_bb
)
100 /* Verify if the basic block BB does not have side-effects. Return
101 true in this case, else false. */
104 bb_no_side_effects_p (basic_block bb
)
106 gimple_stmt_iterator gsi
;
108 for (gsi
= gsi_start_bb (bb
); !gsi_end_p (gsi
); gsi_next (&gsi
))
110 gimple stmt
= gsi_stmt (gsi
);
112 if (gimple_has_side_effects (stmt
)
113 || gimple_vuse (stmt
))
120 /* Verify if all PHI node arguments in DEST for edges from BB1 or
121 BB2 to DEST are the same. This makes the CFG merge point
122 free from side-effects. Return true in this case, else false. */
125 same_phi_args_p (basic_block bb1
, basic_block bb2
, basic_block dest
)
127 edge e1
= find_edge (bb1
, dest
);
128 edge e2
= find_edge (bb2
, dest
);
129 gimple_stmt_iterator gsi
;
132 for (gsi
= gsi_start_phis (dest
); !gsi_end_p (gsi
); gsi_next (&gsi
))
134 phi
= gsi_stmt (gsi
);
135 if (!operand_equal_p (PHI_ARG_DEF_FROM_EDGE (phi
, e1
),
136 PHI_ARG_DEF_FROM_EDGE (phi
, e2
), 0))
143 /* Return the best representative SSA name for CANDIDATE which is used
147 get_name_for_bit_test (tree candidate
)
149 /* Skip single-use names in favor of using the name from a
150 non-widening conversion definition. */
151 if (TREE_CODE (candidate
) == SSA_NAME
152 && has_single_use (candidate
))
154 gimple def_stmt
= SSA_NAME_DEF_STMT (candidate
);
155 if (is_gimple_assign (def_stmt
)
156 && CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (def_stmt
)))
158 if (TYPE_PRECISION (TREE_TYPE (candidate
))
159 <= TYPE_PRECISION (TREE_TYPE (gimple_assign_rhs1 (def_stmt
))))
160 return gimple_assign_rhs1 (def_stmt
);
167 /* Recognize a single bit test pattern in GIMPLE_COND and its defining
168 statements. Store the name being tested in *NAME and the bit
169 in *BIT. The GIMPLE_COND computes *NAME & (1 << *BIT).
170 Returns true if the pattern matched, false otherwise. */
173 recognize_single_bit_test (gimple cond
, tree
*name
, tree
*bit
, bool inv
)
177 /* Get at the definition of the result of the bit test. */
178 if (gimple_cond_code (cond
) != (inv
? EQ_EXPR
: NE_EXPR
)
179 || TREE_CODE (gimple_cond_lhs (cond
)) != SSA_NAME
180 || !integer_zerop (gimple_cond_rhs (cond
)))
182 stmt
= SSA_NAME_DEF_STMT (gimple_cond_lhs (cond
));
183 if (!is_gimple_assign (stmt
))
186 /* Look at which bit is tested. One form to recognize is
187 D.1985_5 = state_3(D) >> control1_4(D);
188 D.1986_6 = (int) D.1985_5;
190 if (D.1987_7 != 0) */
191 if (gimple_assign_rhs_code (stmt
) == BIT_AND_EXPR
192 && integer_onep (gimple_assign_rhs2 (stmt
))
193 && TREE_CODE (gimple_assign_rhs1 (stmt
)) == SSA_NAME
)
195 tree orig_name
= gimple_assign_rhs1 (stmt
);
197 /* Look through copies and conversions to eventually
198 find the stmt that computes the shift. */
199 stmt
= SSA_NAME_DEF_STMT (orig_name
);
201 while (is_gimple_assign (stmt
)
202 && ((CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (stmt
))
203 && (TYPE_PRECISION (TREE_TYPE (gimple_assign_lhs (stmt
)))
204 <= TYPE_PRECISION (TREE_TYPE (gimple_assign_rhs1 (stmt
)))))
205 || gimple_assign_ssa_name_copy_p (stmt
)))
206 stmt
= SSA_NAME_DEF_STMT (gimple_assign_rhs1 (stmt
));
208 /* If we found such, decompose it. */
209 if (is_gimple_assign (stmt
)
210 && gimple_assign_rhs_code (stmt
) == RSHIFT_EXPR
)
212 /* op0 & (1 << op1) */
213 *bit
= gimple_assign_rhs2 (stmt
);
214 *name
= gimple_assign_rhs1 (stmt
);
219 *bit
= integer_zero_node
;
220 *name
= get_name_for_bit_test (orig_name
);
227 D.1987_7 = op0 & (1 << CST)
228 if (D.1987_7 != 0) */
229 if (gimple_assign_rhs_code (stmt
) == BIT_AND_EXPR
230 && TREE_CODE (gimple_assign_rhs1 (stmt
)) == SSA_NAME
231 && integer_pow2p (gimple_assign_rhs2 (stmt
)))
233 *name
= gimple_assign_rhs1 (stmt
);
234 *bit
= build_int_cst (integer_type_node
,
235 tree_log2 (gimple_assign_rhs2 (stmt
)));
240 D.1986_6 = 1 << control1_4(D)
241 D.1987_7 = op0 & D.1986_6
242 if (D.1987_7 != 0) */
243 if (gimple_assign_rhs_code (stmt
) == BIT_AND_EXPR
244 && TREE_CODE (gimple_assign_rhs1 (stmt
)) == SSA_NAME
245 && TREE_CODE (gimple_assign_rhs2 (stmt
)) == SSA_NAME
)
249 /* Both arguments of the BIT_AND_EXPR can be the single-bit
250 specifying expression. */
251 tmp
= SSA_NAME_DEF_STMT (gimple_assign_rhs1 (stmt
));
252 if (is_gimple_assign (tmp
)
253 && gimple_assign_rhs_code (tmp
) == LSHIFT_EXPR
254 && integer_onep (gimple_assign_rhs1 (tmp
)))
256 *name
= gimple_assign_rhs2 (stmt
);
257 *bit
= gimple_assign_rhs2 (tmp
);
261 tmp
= SSA_NAME_DEF_STMT (gimple_assign_rhs2 (stmt
));
262 if (is_gimple_assign (tmp
)
263 && gimple_assign_rhs_code (tmp
) == LSHIFT_EXPR
264 && integer_onep (gimple_assign_rhs1 (tmp
)))
266 *name
= gimple_assign_rhs1 (stmt
);
267 *bit
= gimple_assign_rhs2 (tmp
);
275 /* Recognize a bit test pattern in a GIMPLE_COND and its defining
276 statements. Store the name being tested in *NAME and the bits
277 in *BITS. The COND_EXPR computes *NAME & *BITS.
278 Returns true if the pattern matched, false otherwise. */
281 recognize_bits_test (gimple cond
, tree
*name
, tree
*bits
, bool inv
)
285 /* Get at the definition of the result of the bit test. */
286 if (gimple_cond_code (cond
) != (inv
? EQ_EXPR
: NE_EXPR
)
287 || TREE_CODE (gimple_cond_lhs (cond
)) != SSA_NAME
288 || !integer_zerop (gimple_cond_rhs (cond
)))
290 stmt
= SSA_NAME_DEF_STMT (gimple_cond_lhs (cond
));
291 if (!is_gimple_assign (stmt
)
292 || gimple_assign_rhs_code (stmt
) != BIT_AND_EXPR
)
295 *name
= get_name_for_bit_test (gimple_assign_rhs1 (stmt
));
296 *bits
= gimple_assign_rhs2 (stmt
);
301 /* If-convert on a and pattern with a common else block. The inner
302 if is specified by its INNER_COND_BB, the outer by OUTER_COND_BB.
303 inner_inv, outer_inv and result_inv indicate whether the conditions
305 Returns true if the edges to the common else basic-block were merged. */
308 ifcombine_ifandif (basic_block inner_cond_bb
, bool inner_inv
,
309 basic_block outer_cond_bb
, bool outer_inv
, bool result_inv
)
311 gimple_stmt_iterator gsi
;
312 gimple inner_cond
, outer_cond
;
313 tree name1
, name2
, bit1
, bit2
, bits1
, bits2
;
315 inner_cond
= last_stmt (inner_cond_bb
);
317 || gimple_code (inner_cond
) != GIMPLE_COND
)
320 outer_cond
= last_stmt (outer_cond_bb
);
322 || gimple_code (outer_cond
) != GIMPLE_COND
)
325 /* See if we test a single bit of the same name in both tests. In
326 that case remove the outer test, merging both else edges,
327 and change the inner one to test for
328 name & (bit1 | bit2) == (bit1 | bit2). */
329 if (recognize_single_bit_test (inner_cond
, &name1
, &bit1
, inner_inv
)
330 && recognize_single_bit_test (outer_cond
, &name2
, &bit2
, outer_inv
)
336 gsi
= gsi_for_stmt (inner_cond
);
337 t
= fold_build2 (LSHIFT_EXPR
, TREE_TYPE (name1
),
338 build_int_cst (TREE_TYPE (name1
), 1), bit1
);
339 t2
= fold_build2 (LSHIFT_EXPR
, TREE_TYPE (name1
),
340 build_int_cst (TREE_TYPE (name1
), 1), bit2
);
341 t
= fold_build2 (BIT_IOR_EXPR
, TREE_TYPE (name1
), t
, t2
);
342 t
= force_gimple_operand_gsi (&gsi
, t
, true, NULL_TREE
,
343 true, GSI_SAME_STMT
);
344 t2
= fold_build2 (BIT_AND_EXPR
, TREE_TYPE (name1
), name1
, t
);
345 t2
= force_gimple_operand_gsi (&gsi
, t2
, true, NULL_TREE
,
346 true, GSI_SAME_STMT
);
347 t
= fold_build2 (result_inv
? NE_EXPR
: EQ_EXPR
,
348 boolean_type_node
, t2
, t
);
349 t
= canonicalize_cond_expr_cond (t
);
352 gimple_cond_set_condition_from_tree (inner_cond
, t
);
353 update_stmt (inner_cond
);
355 /* Leave CFG optimization to cfg_cleanup. */
356 gimple_cond_set_condition_from_tree (outer_cond
,
357 outer_inv
? boolean_false_node
: boolean_true_node
);
358 update_stmt (outer_cond
);
362 fprintf (dump_file
, "optimizing double bit test to ");
363 print_generic_expr (dump_file
, name1
, 0);
364 fprintf (dump_file
, " & T == T\nwith temporary T = (1 << ");
365 print_generic_expr (dump_file
, bit1
, 0);
366 fprintf (dump_file
, ") | (1 << ");
367 print_generic_expr (dump_file
, bit2
, 0);
368 fprintf (dump_file
, ")\n");
374 /* See if we have two bit tests of the same name in both tests.
375 In that case remove the outer test and change the inner one to
376 test for name & (bits1 | bits2) != 0. */
377 else if (recognize_bits_test (inner_cond
, &name1
, &bits1
, !inner_inv
)
378 && recognize_bits_test (outer_cond
, &name2
, &bits2
, !outer_inv
))
380 gimple_stmt_iterator gsi
;
383 /* Find the common name which is bit-tested. */
386 else if (bits1
== bits2
)
395 else if (name1
== bits2
)
401 else if (bits1
== name2
)
410 /* As we strip non-widening conversions in finding a common
411 name that is tested make sure to end up with an integral
412 type for building the bit operations. */
413 if (TYPE_PRECISION (TREE_TYPE (bits1
))
414 >= TYPE_PRECISION (TREE_TYPE (bits2
)))
416 bits1
= fold_convert (unsigned_type_for (TREE_TYPE (bits1
)), bits1
);
417 name1
= fold_convert (TREE_TYPE (bits1
), name1
);
418 bits2
= fold_convert (unsigned_type_for (TREE_TYPE (bits2
)), bits2
);
419 bits2
= fold_convert (TREE_TYPE (bits1
), bits2
);
423 bits2
= fold_convert (unsigned_type_for (TREE_TYPE (bits2
)), bits2
);
424 name1
= fold_convert (TREE_TYPE (bits2
), name1
);
425 bits1
= fold_convert (unsigned_type_for (TREE_TYPE (bits1
)), bits1
);
426 bits1
= fold_convert (TREE_TYPE (bits2
), bits1
);
430 gsi
= gsi_for_stmt (inner_cond
);
431 t
= fold_build2 (BIT_IOR_EXPR
, TREE_TYPE (name1
), bits1
, bits2
);
432 t
= force_gimple_operand_gsi (&gsi
, t
, true, NULL_TREE
,
433 true, GSI_SAME_STMT
);
434 t
= fold_build2 (BIT_AND_EXPR
, TREE_TYPE (name1
), name1
, t
);
435 t
= force_gimple_operand_gsi (&gsi
, t
, true, NULL_TREE
,
436 true, GSI_SAME_STMT
);
437 t
= fold_build2 (result_inv
? NE_EXPR
: EQ_EXPR
, boolean_type_node
, t
,
438 build_int_cst (TREE_TYPE (t
), 0));
439 t
= canonicalize_cond_expr_cond (t
);
442 gimple_cond_set_condition_from_tree (inner_cond
, t
);
443 update_stmt (inner_cond
);
445 /* Leave CFG optimization to cfg_cleanup. */
446 gimple_cond_set_condition_from_tree (outer_cond
,
447 outer_inv
? boolean_false_node
: boolean_true_node
);
448 update_stmt (outer_cond
);
452 fprintf (dump_file
, "optimizing bits or bits test to ");
453 print_generic_expr (dump_file
, name1
, 0);
454 fprintf (dump_file
, " & T != 0\nwith temporary T = ");
455 print_generic_expr (dump_file
, bits1
, 0);
456 fprintf (dump_file
, " | ");
457 print_generic_expr (dump_file
, bits2
, 0);
458 fprintf (dump_file
, "\n");
464 /* See if we have two comparisons that we can merge into one. */
465 else if (TREE_CODE_CLASS (gimple_cond_code (inner_cond
)) == tcc_comparison
466 && TREE_CODE_CLASS (gimple_cond_code (outer_cond
)) == tcc_comparison
)
469 enum tree_code inner_cond_code
= gimple_cond_code (inner_cond
);
470 enum tree_code outer_cond_code
= gimple_cond_code (outer_cond
);
472 /* Invert comparisons if necessary (and possible). */
474 inner_cond_code
= invert_tree_comparison (inner_cond_code
,
475 HONOR_NANS (TYPE_MODE (TREE_TYPE (gimple_cond_lhs (inner_cond
)))));
476 if (inner_cond_code
== ERROR_MARK
)
479 outer_cond_code
= invert_tree_comparison (outer_cond_code
,
480 HONOR_NANS (TYPE_MODE (TREE_TYPE (gimple_cond_lhs (outer_cond
)))));
481 if (outer_cond_code
== ERROR_MARK
)
483 /* Don't return false so fast, try maybe_fold_or_comparisons? */
485 if (!(t
= maybe_fold_and_comparisons (inner_cond_code
,
486 gimple_cond_lhs (inner_cond
),
487 gimple_cond_rhs (inner_cond
),
489 gimple_cond_lhs (outer_cond
),
490 gimple_cond_rhs (outer_cond
))))
493 t
= fold_build1 (TRUTH_NOT_EXPR
, TREE_TYPE (t
), t
);
494 t
= canonicalize_cond_expr_cond (t
);
497 gimple_cond_set_condition_from_tree (inner_cond
, t
);
498 update_stmt (inner_cond
);
500 /* Leave CFG optimization to cfg_cleanup. */
501 gimple_cond_set_condition_from_tree (outer_cond
,
502 outer_inv
? boolean_false_node
: boolean_true_node
);
503 update_stmt (outer_cond
);
507 fprintf (dump_file
, "optimizing two comparisons to ");
508 print_generic_expr (dump_file
, t
, 0);
509 fprintf (dump_file
, "\n");
518 /* Recognize a CFG pattern and dispatch to the appropriate
519 if-conversion helper. We start with BB as the innermost
520 worker basic-block. Returns true if a transformation was done. */
523 tree_ssa_ifcombine_bb (basic_block inner_cond_bb
)
525 basic_block then_bb
= NULL
, else_bb
= NULL
;
527 if (!recognize_if_then_else (inner_cond_bb
, &then_bb
, &else_bb
))
530 /* Recognize && and || of two conditions with a common
531 then/else block which entry edges we can merge. That is:
537 This requires a single predecessor of the inner cond_bb. */
538 if (single_pred_p (inner_cond_bb
))
540 basic_block outer_cond_bb
= single_pred (inner_cond_bb
);
542 /* The && form is characterized by a common else_bb with
543 the two edges leading to it mergable. The latter is
544 guaranteed by matching PHI arguments in the else_bb and
545 the inner cond_bb having no side-effects. */
546 if (recognize_if_then_else (outer_cond_bb
, &inner_cond_bb
, &else_bb
)
547 && same_phi_args_p (outer_cond_bb
, inner_cond_bb
, else_bb
)
548 && bb_no_side_effects_p (inner_cond_bb
))
552 if (q) goto inner_cond_bb; else goto else_bb;
554 if (p) goto ...; else goto else_bb;
559 return ifcombine_ifandif (inner_cond_bb
, false, outer_cond_bb
, false,
563 /* And a version where the outer condition is negated. */
564 if (recognize_if_then_else (outer_cond_bb
, &else_bb
, &inner_cond_bb
)
565 && same_phi_args_p (outer_cond_bb
, inner_cond_bb
, else_bb
)
566 && bb_no_side_effects_p (inner_cond_bb
))
570 if (q) goto else_bb; else goto inner_cond_bb;
572 if (p) goto ...; else goto else_bb;
577 return ifcombine_ifandif (inner_cond_bb
, false, outer_cond_bb
, true,
581 /* The || form is characterized by a common then_bb with the
582 two edges leading to it mergable. The latter is guaranteed
583 by matching PHI arguments in the then_bb and the inner cond_bb
584 having no side-effects. */
585 if (recognize_if_then_else (outer_cond_bb
, &then_bb
, &inner_cond_bb
)
586 && same_phi_args_p (outer_cond_bb
, inner_cond_bb
, then_bb
)
587 && bb_no_side_effects_p (inner_cond_bb
))
591 if (q) goto then_bb; else goto inner_cond_bb;
593 if (q) goto then_bb; else goto ...;
597 return ifcombine_ifandif (inner_cond_bb
, true, outer_cond_bb
, true,
601 /* And a version where the outer condition is negated. */
602 if (recognize_if_then_else (outer_cond_bb
, &inner_cond_bb
, &then_bb
)
603 && same_phi_args_p (outer_cond_bb
, inner_cond_bb
, then_bb
)
604 && bb_no_side_effects_p (inner_cond_bb
))
608 if (q) goto inner_cond_bb; else goto then_bb;
610 if (q) goto then_bb; else goto ...;
614 return ifcombine_ifandif (inner_cond_bb
, true, outer_cond_bb
, false,
622 /* Main entry for the tree if-conversion pass. */
625 tree_ssa_ifcombine (void)
628 bool cfg_changed
= false;
631 bbs
= single_pred_before_succ_order ();
632 calculate_dominance_info (CDI_DOMINATORS
);
634 for (i
= 0; i
< n_basic_blocks
- NUM_FIXED_BLOCKS
; ++i
)
636 basic_block bb
= bbs
[i
];
637 gimple stmt
= last_stmt (bb
);
640 && gimple_code (stmt
) == GIMPLE_COND
)
641 cfg_changed
|= tree_ssa_ifcombine_bb (bb
);
646 return cfg_changed
? TODO_cleanup_cfg
: 0;
650 gate_ifcombine (void)
657 const pass_data pass_data_tree_ifcombine
=
659 GIMPLE_PASS
, /* type */
660 "ifcombine", /* name */
661 OPTGROUP_NONE
, /* optinfo_flags */
663 true, /* has_execute */
664 TV_TREE_IFCOMBINE
, /* tv_id */
665 ( PROP_cfg
| PROP_ssa
), /* properties_required */
666 0, /* properties_provided */
667 0, /* properties_destroyed */
668 0, /* todo_flags_start */
669 ( TODO_update_ssa
| TODO_verify_ssa
), /* todo_flags_finish */
672 class pass_tree_ifcombine
: public gimple_opt_pass
675 pass_tree_ifcombine (gcc::context
*ctxt
)
676 : gimple_opt_pass (pass_data_tree_ifcombine
, ctxt
)
679 /* opt_pass methods: */
680 bool gate () { return gate_ifcombine (); }
681 unsigned int execute () { return tree_ssa_ifcombine (); }
683 }; // class pass_tree_ifcombine
688 make_pass_tree_ifcombine (gcc::context
*ctxt
)
690 return new pass_tree_ifcombine (ctxt
);