diff options
Diffstat (limited to 'gcc/tree-if-conv.c')
-rw-r--r-- | gcc/tree-if-conv.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c index b165dc0..e88ddc9 100644 --- a/gcc/tree-if-conv.c +++ b/gcc/tree-if-conv.c @@ -120,6 +120,7 @@ along with GCC; see the file COPYING3. If not see #include "tree-ssa-sccvn.h" #include "tree-cfgcleanup.h" #include "tree-ssa-dse.h" +#include "tree-vectorizer.h" /* Only handle PHIs with no more arguments unless we are asked to by simd pragma. */ @@ -1732,7 +1733,11 @@ is_cond_scalar_reduction (gimple *phi, gimple **reduc, tree arg_0, tree arg_1, reduction_op = gimple_assign_rhs_code (stmt); } - if (reduction_op != PLUS_EXPR && reduction_op != MINUS_EXPR) + if (reduction_op != PLUS_EXPR + && reduction_op != MINUS_EXPR + && reduction_op != BIT_IOR_EXPR + && reduction_op != BIT_XOR_EXPR + && reduction_op != BIT_AND_EXPR) return false; r_op1 = gimple_assign_rhs1 (stmt); r_op2 = gimple_assign_rhs2 (stmt); @@ -1742,7 +1747,7 @@ is_cond_scalar_reduction (gimple *phi, gimple **reduc, tree arg_0, tree arg_1, /* Make R_OP1 to hold reduction variable. */ if (r_nop2 == PHI_RESULT (header_phi) - && reduction_op == PLUS_EXPR) + && commutative_tree_code (reduction_op)) { std::swap (r_op1, r_op2); std::swap (r_nop1, r_nop2); @@ -1811,7 +1816,8 @@ convert_scalar_cond_reduction (gimple *reduc, gimple_stmt_iterator *gsi, tree rhs1 = gimple_assign_rhs1 (reduc); tree tmp = make_temp_ssa_name (TREE_TYPE (rhs1), NULL, "_ifc_"); tree c; - tree zero = build_zero_cst (TREE_TYPE (rhs1)); + enum tree_code reduction_op = gimple_assign_rhs_code (reduc); + tree op_nochange = neutral_op_for_reduction (TREE_TYPE (rhs1), reduction_op, NULL); gimple_seq stmts = NULL; if (dump_file && (dump_flags & TDF_DETAILS)) @@ -1824,14 +1830,14 @@ convert_scalar_cond_reduction (gimple *reduc, gimple_stmt_iterator *gsi, of reduction rhs. */ c = fold_build_cond_expr (TREE_TYPE (rhs1), unshare_expr (cond), - swap ? zero : op1, - swap ? op1 : zero); + swap ? op_nochange : op1, + swap ? op1 : op_nochange); /* Create assignment stmt and insert it at GSI. */ new_assign = gimple_build_assign (tmp, c); gsi_insert_before (gsi, new_assign, GSI_SAME_STMT); - /* Build rhs for unconditional increment/decrement. */ - rhs = gimple_build (&stmts, gimple_assign_rhs_code (reduc), + /* Build rhs for unconditional increment/decrement/logic_operation. */ + rhs = gimple_build (&stmts, reduction_op, TREE_TYPE (rhs1), op0, tmp); if (has_nop) |