re PR tree-optimization/67306 (Patterns ICEs when moved using "simplify and match")
authorRichard Biener <rguenther@suse.de>
Tue, 25 Aug 2015 10:29:09 +0000 (10:29 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 25 Aug 2015 10:29:09 +0000 (10:29 +0000)
2015-08-25  Richard Biener  <rguenther@suse.de>

PR middle-end/67306
* genmatch.c (expr::gen_transform): Verify the result of
builtin_decl_implicit.
(dt_simplify::gen_1): Likewise.

From-SVN: r227163

gcc/ChangeLog
gcc/genmatch.c

index 7022a870ff9888ed20229af6b13c80c0c1dc8f33..517d1a4c55f7e96150b42fac768fd597d19c720d 100644 (file)
@@ -1,3 +1,10 @@
+2015-08-25  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/67306
+       * genmatch.c (expr::gen_transform): Verify the result of
+       builtin_decl_implicit.
+       (dt_simplify::gen_1): Likewise.
+
 2015-08-25  Thomas Preud'homme  <thomas.preudhomme@arm.com>
 
        * config/arm/constraints.md: Also list Cs and US ARM-specific
index f48e79d0b95f512f0867fdbaa8a46ac22237a9d4..d92d8080dd011111a5b4dd5902781d72e7f945e6 100644 (file)
@@ -2177,11 +2177,19 @@ expr::gen_transform (FILE *f, int indent, const char *dest, bool gimple,
        fprintf_indent (f, indent, "res = fold_build%d_loc (loc, %s, %s",
                        ops.length(), opr_name, type);
       else
-       fprintf_indent (f, indent, "res = build_call_expr_loc (loc, "
-                       "builtin_decl_implicit (%s), %d", opr_name, ops.length());
+       {
+         fprintf_indent (f, indent, "{\n");
+         fprintf_indent (f, indent, "  tree decl = builtin_decl_implicit (%s);\n",
+                         opr_name);
+         fprintf_indent (f, indent, "  if (!decl) return NULL_TREE;\n");
+         fprintf_indent (f, indent, "  res = build_call_expr_loc (loc, "
+                         "decl, %d", ops.length());
+       }
       for (unsigned i = 0; i < ops.length (); ++i)
        fprintf (f, ", ops%d[%u]", depth, i);
       fprintf (f, ");\n");
+      if (opr->kind != id_base::CODE)
+       fprintf_indent (f, indent, "}\n");
       if (*opr == CONVERT_EXPR)
        {
          indent -= 2;
@@ -3069,13 +3077,24 @@ dt_simplify::gen_1 (FILE *f, int indent, bool gimple, operand *result)
                                    *e->operation == CONVERT_EXPR
                                    ? "NOP_EXPR" : e->operation->id);
                  else
-                   fprintf_indent (f, indent,
-                                   "res = build_call_expr_loc "
-                                   "(loc, builtin_decl_implicit (%s), %d",
-                                   e->operation->id, e->ops.length());
+                   {
+                     fprintf_indent (f, indent,
+                                     "{\n");
+                     fprintf_indent (f, indent,
+                                     "  tree decl = builtin_decl_implicit (%s);\n",
+                                     e->operation->id);
+                     fprintf_indent (f, indent,
+                                     "  if (!decl) return NULL_TREE;\n");
+                     fprintf_indent (f, indent,
+                                     "  res = build_call_expr_loc "
+                                     "(loc, decl, %d",
+                                     e->ops.length());
+                   }
                  for (unsigned j = 0; j < e->ops.length (); ++j)
                    fprintf (f, ", res_op%d", j);
                  fprintf (f, ");\n");
+                 if (!is_a <operator_id *> (opr))
+                   fprintf_indent (f, indent, "}\n");
                }
            }
        }