diff options
author | Richard Biener <rguenther@suse.de> | 2014-10-30 15:36:05 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2014-10-30 15:36:05 +0000 |
commit | d822570f733f2660b8bd5c78cf5077e654c4387e (patch) | |
tree | 138ab18df255eae4e18cb747ac189b901263aeae /gcc | |
parent | 665c06cec2b2b15addfe22e203c7d0e90f74424b (diff) | |
download | gcc-d822570f733f2660b8bd5c78cf5077e654c4387e.zip gcc-d822570f733f2660b8bd5c78cf5077e654c4387e.tar.gz gcc-d822570f733f2660b8bd5c78cf5077e654c4387e.tar.bz2 |
genmatch.c (capture_info::walk_c_expr): Ignore capture uses inside TREE_TYPE ().
2014-10-30 Richard Biener <rguenther@suse.de>
* 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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/convert.c | 2 | ||||
-rw-r--r-- | gcc/genmatch.c | 41 | ||||
-rw-r--r-- | gcc/gimple-ssa-strength-reduction.c | 10 | ||||
-rw-r--r-- | gcc/tree-ssa-dom.c | 2 |
5 files changed, 47 insertions, 20 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a123f95..6d014c0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,17 @@ 2014-10-30 Richard Biener <rguenther@suse.de> + * 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 <rguenther@suse.de> + * match.pd: Implement more patterns that simplify to a single value. * fold-const.c (fold_binary_loc): Remove them here. * tree-ssa-forwprop.c (simplify_bitwise_binary): Likewise. diff --git a/gcc/convert.c b/gcc/convert.c index 9ef27f6..07e2d75 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 ebdb7d3..35d852c 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 4de84cf..8187a10 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 6913885..6fa0dc6 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; |