genmatch.c (capture_info::walk_c_expr): Ignore capture uses inside TREE_TYPE ().
authorRichard Biener <rguenther@suse.de>
Thu, 30 Oct 2014 15:36:05 +0000 (15:36 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 30 Oct 2014 15:36:05 +0000 (15:36 +0000)
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

gcc/ChangeLog
gcc/convert.c
gcc/genmatch.c
gcc/gimple-ssa-strength-reduction.c
gcc/tree-ssa-dom.c

index a123f9599fe05d0d85287339c013ffafd33a4249..6d014c08f435ddacc0248ff9dba39b9364ddc9cb 100644 (file)
@@ -1,3 +1,15 @@
+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.
index 9ef27f6347f8257e6bc6c24a1f484e02ebe51b3e..07e2d75e5ee49d0847629aa242b66debb98ccf21 100644 (file)
@@ -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
index ebdb7d35859c054bcbbbfb5baf04de985a79aef5..35d852c925931a108e7a891e248b8922c5cb7c4e 100644 (file)
@@ -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;
+       }
+    }
 }
 
 
index 4de84cfec171a3571965aa8da4c1826732082215..8187a10754cd8282cf3f72636132f831a4bb7a19 100644 (file)
@@ -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))
            {
index 691388523b3e20372d389c4f5ef7ca83f7bb3560..6fa0dc6b1063e4c2a72411e93e068d75fd96fdf6 100644 (file)
@@ -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;