From d822570f733f2660b8bd5c78cf5077e654c4387e Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Thu, 30 Oct 2014 15:36:05 +0000 Subject: [PATCH] genmatch.c (capture_info::walk_c_expr): Ignore capture uses inside TREE_TYPE (). 2014-10-30 Richard Biener * genmatch.c (capture_info::walk_c_expr): Ignore capture uses inside TREE_TYPE (). * gimple-ssa-strength-reduction.c (stmt_cost): Use CASE_CONVERT. (find_candidates_dom_walker::before_dom_children): Likewise. (replace_mult_candidate): Use CONVERT_EXPR_CODE_P. (replace_profitable_candidates): Likewise. * tree-ssa-dom.c (initialize_hash_element): Canonicalize CONVERT_EXPR_CODE_P to CONVERT_EXPR. * convert.c (convert_to_integer): Use CASE_CONVERT. From-SVN: r216939 --- gcc/ChangeLog | 12 +++++++++ gcc/convert.c | 2 +- gcc/genmatch.c | 41 +++++++++++++++++++---------- gcc/gimple-ssa-strength-reduction.c | 10 +++---- gcc/tree-ssa-dom.c | 2 ++ 5 files changed, 47 insertions(+), 20 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a123f9599fe..6d014c08f43 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2014-10-30 Richard Biener + + * genmatch.c (capture_info::walk_c_expr): Ignore capture + uses inside TREE_TYPE (). + * gimple-ssa-strength-reduction.c (stmt_cost): Use CASE_CONVERT. + (find_candidates_dom_walker::before_dom_children): Likewise. + (replace_mult_candidate): Use CONVERT_EXPR_CODE_P. + (replace_profitable_candidates): Likewise. + * tree-ssa-dom.c (initialize_hash_element): Canonicalize + CONVERT_EXPR_CODE_P to CONVERT_EXPR. + * convert.c (convert_to_integer): Use CASE_CONVERT. + 2014-10-30 Richard Biener * match.pd: Implement more patterns that simplify to a single value. diff --git a/gcc/convert.c b/gcc/convert.c index 9ef27f6347f..07e2d75e5ee 100644 --- a/gcc/convert.c +++ b/gcc/convert.c @@ -831,7 +831,7 @@ convert_to_integer (tree type, tree expr) TREE_OPERAND (expr, 0)))); } - case NOP_EXPR: + CASE_CONVERT: /* Don't introduce a "can't convert between vector values of different size" error. */ if (TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0))) == VECTOR_TYPE diff --git a/gcc/genmatch.c b/gcc/genmatch.c index ebdb7d35859..35d852c9259 100644 --- a/gcc/genmatch.c +++ b/gcc/genmatch.c @@ -2004,21 +2004,34 @@ capture_info::walk_result (operand *o, bool conditional_p) void capture_info::walk_c_expr (c_expr *e) { - /* Give up for C exprs mentioning captures. */ + /* Give up for C exprs mentioning captures not inside TREE_TYPE (). */ + unsigned p_depth = 0; for (unsigned i = 0; i < e->code.length (); ++i) - if (e->code[i].type == CPP_ATSIGN - && (e->code[i+1].type == CPP_NUMBER - || e->code[i+1].type == CPP_NAME) - && !(e->code[i+1].flags & PREV_WHITE)) - { - const cpp_token *n = &e->code[i+1]; - const char *id; - if (n->type == CPP_NUMBER) - id = (const char *)n->val.str.text; - else - id = (const char *)CPP_HASHNODE (n->val.node.node)->ident.str; - info[(*e->capture_ids)[id]].force_no_side_effects_p = true; - } + { + const cpp_token *t = &e->code[i]; + const cpp_token *n = i < e->code.length () - 1 ? &e->code[i+1] : NULL; + if (t->type == CPP_NAME + && strcmp ((const char *)CPP_HASHNODE + (t->val.node.node)->ident.str, "TREE_TYPE") == 0 + && n->type == CPP_OPEN_PAREN) + p_depth++; + else if (t->type == CPP_CLOSE_PAREN + && p_depth > 0) + p_depth--; + else if (p_depth == 0 + && t->type == CPP_ATSIGN + && (n->type == CPP_NUMBER + || n->type == CPP_NAME) + && !(n->flags & PREV_WHITE)) + { + const char *id; + if (n->type == CPP_NUMBER) + id = (const char *)n->val.str.text; + else + id = (const char *)CPP_HASHNODE (n->val.node.node)->ident.str; + info[(*e->capture_ids)[id]].force_no_side_effects_p = true; + } + } } diff --git a/gcc/gimple-ssa-strength-reduction.c b/gcc/gimple-ssa-strength-reduction.c index 4de84cfec17..8187a10754c 100644 --- a/gcc/gimple-ssa-strength-reduction.c +++ b/gcc/gimple-ssa-strength-reduction.c @@ -705,7 +705,7 @@ stmt_cost (gimple gs, bool speed) case NEGATE_EXPR: return neg_cost (speed, lhs_mode); - case NOP_EXPR: + CASE_CONVERT: return convert_cost (lhs_mode, TYPE_MODE (TREE_TYPE (rhs1)), speed); /* Note that we don't assign costs to copies that in most cases @@ -1715,7 +1715,7 @@ find_candidates_dom_walker::before_dom_children (basic_block bb) rhs2 = gimple_assign_rhs2 (gs); /* Fall-through. */ - case NOP_EXPR: + CASE_CONVERT: case MODIFY_EXPR: case NEGATE_EXPR: rhs1 = gimple_assign_rhs1 (gs); @@ -1743,7 +1743,7 @@ find_candidates_dom_walker::before_dom_children (basic_block bb) slsr_process_neg (gs, rhs1, speed); break; - case NOP_EXPR: + CASE_CONVERT: slsr_process_cast (gs, rhs1, speed); break; @@ -2033,7 +2033,7 @@ replace_mult_candidate (slsr_cand_t c, tree basis_name, widest_int bump) /* It is not useful to replace casts, copies, or adds of an SSA name and a constant. */ && cand_code != MODIFY_EXPR - && cand_code != NOP_EXPR + && !CONVERT_EXPR_CODE_P (cand_code) && cand_code != PLUS_EXPR && cand_code != POINTER_PLUS_EXPR && cand_code != MINUS_EXPR) @@ -3472,7 +3472,7 @@ replace_profitable_candidates (slsr_cand_t c) if (i >= 0 && profitable_increment_p (i) && orig_code != MODIFY_EXPR - && orig_code != NOP_EXPR) + && !CONVERT_EXPR_CODE_P (orig_code)) { if (phi_dependent_cand_p (c)) { diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c index 691388523b3..6fa0dc6b106 100644 --- a/gcc/tree-ssa-dom.c +++ b/gcc/tree-ssa-dom.c @@ -305,6 +305,8 @@ initialize_hash_element (gimple stmt, tree lhs, case GIMPLE_UNARY_RHS: expr->kind = EXPR_UNARY; expr->type = TREE_TYPE (gimple_assign_lhs (stmt)); + if (CONVERT_EXPR_CODE_P (subcode)) + subcode = CONVERT_EXPR; expr->ops.unary.op = subcode; expr->ops.unary.opnd = gimple_assign_rhs1 (stmt); break; -- 2.30.2