aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2014-10-30 15:36:05 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2014-10-30 15:36:05 +0000
commitd822570f733f2660b8bd5c78cf5077e654c4387e (patch)
tree138ab18df255eae4e18cb747ac189b901263aeae /gcc
parent665c06cec2b2b15addfe22e203c7d0e90f74424b (diff)
downloadgcc-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/ChangeLog12
-rw-r--r--gcc/convert.c2
-rw-r--r--gcc/genmatch.c41
-rw-r--r--gcc/gimple-ssa-strength-reduction.c10
-rw-r--r--gcc/tree-ssa-dom.c2
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;