From e89065a17202234f50185ce3bf2a80efb2fef938 Mon Sep 17 00:00:00 2001 From: Sandra Loosemore Date: Tue, 8 Jun 2010 14:15:53 -0400 Subject: re PR tree-optimization/39874 (missing VRP (submission)) 2010-06-08 Sandra Loosemore PR tree-optimization/39874 PR middle-end/28685 gcc/ * gimple.h (maybe_fold_and_comparisons, maybe_fold_or_comparisons): Declare. * gimple-fold.c (canonicalize_bool, same_bool_comparison_p, same_bool_result_p): New. (and_var_with_comparison, and_var_with_comparison_1, and_comparisons_1, and_comparisons, maybe_fold_and_comparisons): New. (or_var_with_comparison, or_var_with_comparison_1, or_comparisons_1, or_comparisons, maybe_fold_or_comparisons): New. * tree-ssa-reassoc.c (eliminate_redundant_comparison): Use maybe_fold_and_comparisons or maybe_fold_or_comparisons instead of combine_comparisons. * tree-ssa-ifcombine.c (ifcombine_ifandif, ifcombine_iforif): Likewise. gcc/testsuite/ * gcc.dg/pr39874.c: New file. From-SVN: r160445 --- gcc/tree-ssa-ifcombine.c | 40 +++++++++++++++------------------------- 1 file changed, 15 insertions(+), 25 deletions(-) (limited to 'gcc/tree-ssa-ifcombine.c') diff --git a/gcc/tree-ssa-ifcombine.c b/gcc/tree-ssa-ifcombine.c index a20f704..bc551b2 100644 --- a/gcc/tree-ssa-ifcombine.c +++ b/gcc/tree-ssa-ifcombine.c @@ -366,21 +366,16 @@ ifcombine_ifandif (basic_block inner_cond_bb, basic_block outer_cond_bb) /* See if we have two comparisons that we can merge into one. */ else if (TREE_CODE_CLASS (gimple_cond_code (inner_cond)) == tcc_comparison - && TREE_CODE_CLASS (gimple_cond_code (outer_cond)) == tcc_comparison - && operand_equal_p (gimple_cond_lhs (inner_cond), - gimple_cond_lhs (outer_cond), 0) - && operand_equal_p (gimple_cond_rhs (inner_cond), - gimple_cond_rhs (outer_cond), 0)) + && TREE_CODE_CLASS (gimple_cond_code (outer_cond)) == tcc_comparison) { - enum tree_code code1 = gimple_cond_code (inner_cond); - enum tree_code code2 = gimple_cond_code (outer_cond); tree t; - if (!(t = combine_comparisons (UNKNOWN_LOCATION, - TRUTH_ANDIF_EXPR, code1, code2, - boolean_type_node, - gimple_cond_lhs (outer_cond), - gimple_cond_rhs (outer_cond)))) + if (!(t = maybe_fold_and_comparisons (gimple_cond_code (inner_cond), + gimple_cond_lhs (inner_cond), + gimple_cond_rhs (inner_cond), + gimple_cond_code (outer_cond), + gimple_cond_lhs (outer_cond), + gimple_cond_rhs (outer_cond)))) return false; t = canonicalize_cond_expr_cond (t); if (!t) @@ -518,22 +513,17 @@ ifcombine_iforif (basic_block inner_cond_bb, basic_block outer_cond_bb) /* See if we have two comparisons that we can merge into one. This happens for C++ operator overloading where for example GE_EXPR is implemented as GT_EXPR || EQ_EXPR. */ - else if (TREE_CODE_CLASS (gimple_cond_code (inner_cond)) == tcc_comparison - && TREE_CODE_CLASS (gimple_cond_code (outer_cond)) == tcc_comparison - && operand_equal_p (gimple_cond_lhs (inner_cond), - gimple_cond_lhs (outer_cond), 0) - && operand_equal_p (gimple_cond_rhs (inner_cond), - gimple_cond_rhs (outer_cond), 0)) + else if (TREE_CODE_CLASS (gimple_cond_code (inner_cond)) == tcc_comparison + && TREE_CODE_CLASS (gimple_cond_code (outer_cond)) == tcc_comparison) { - enum tree_code code1 = gimple_cond_code (inner_cond); - enum tree_code code2 = gimple_cond_code (outer_cond); tree t; - if (!(t = combine_comparisons (UNKNOWN_LOCATION, - TRUTH_ORIF_EXPR, code1, code2, - boolean_type_node, - gimple_cond_lhs (outer_cond), - gimple_cond_rhs (outer_cond)))) + if (!(t = maybe_fold_or_comparisons (gimple_cond_code (inner_cond), + gimple_cond_lhs (inner_cond), + gimple_cond_rhs (inner_cond), + gimple_cond_code (outer_cond), + gimple_cond_lhs (outer_cond), + gimple_cond_rhs (outer_cond)))) return false; t = canonicalize_cond_expr_cond (t); if (!t) -- cgit v1.1