re PR middle-end/65519 (unable to coalesce ssa_names 2 and 87 which are marked as...
authorRichard Biener <rguenther@suse.de>
Wed, 25 Mar 2015 08:46:20 +0000 (08:46 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 25 Mar 2015 08:46:20 +0000 (08:46 +0000)
2015-03-25  Richard Biener  <rguenther@suse.de>

PR middle-end/65519
* genmatch.c (expr::gen_transform): Re-write to avoid
using gimple_build.

* gnat.dg/specs/opt2.ads: New testcase.

From-SVN: r221654

gcc/ChangeLog
gcc/genmatch.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/specs/opt2.ads [new file with mode: 0644]

index e04cf2fb3f095782a7022217ded4ef0790a87968..3ae855b5ec310ce5323dd1ab1d0a9aea899112e6 100644 (file)
@@ -1,3 +1,9 @@
+2015-03-25  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/65519
+       * genmatch.c (expr::gen_transform): Re-write to avoid
+       using gimple_build.
+
 2015-03-25  Bin Cheng  <bin.cheng@arm.com>
 
        * doc/sourcebuild.texi (arm_tune_string_ops_prefer_neon): New.
index 6723c29901450db69eda28aeb62e4cdce30292f4..560a371dc9547caf79d8d1103c226a4704355704 100644 (file)
@@ -1742,22 +1742,18 @@ expr::gen_transform (FILE *f, const char *dest, bool gimple, int depth,
 
   if (gimple)
     {
-      /* ???  Have another helper that is like gimple_build but may
-        fail if seq == NULL.  */
-      fprintf (f, "  if (!seq)\n"
-              "    {\n"
-              "      res = gimple_simplify (%s, %s", opr, type);
+      /* ???  Building a stmt can fail for various reasons here, seq being
+         NULL or the stmt referencing SSA names occuring in abnormal PHIs.
+        So if we fail here we should continue matching other patterns.  */
+      fprintf (f, "  code_helper tem_code = %s;\n"
+              "  tree tem_ops[3] = { ", opr);
       for (unsigned i = 0; i < ops.length (); ++i)
-       fprintf (f, ", ops%d[%u]", depth, i);
-      fprintf (f, ", seq, valueize);\n");
-      fprintf (f, "      if (!res) return false;\n");
-      fprintf (f, "    }\n");
-      fprintf (f, "  else\n");
-      fprintf (f, "    res = gimple_build (seq, UNKNOWN_LOCATION, %s, %s",
-              opr, type);
-      for (unsigned i = 0; i < ops.length (); ++i)
-       fprintf (f, ", ops%d[%u]", depth, i);
-      fprintf (f, ", valueize);\n");
+       fprintf (f, "ops%d[%u]%s", depth, i,
+                i == ops.length () - 1 ? " };\n" : ", ");
+      fprintf (f, "  gimple_resimplify%d (seq, &tem_code, %s, tem_ops, valueize);\n",
+              ops.length (), type);
+      fprintf (f, "  res = maybe_push_res_to_seq (tem_code, %s, tem_ops, seq);\n"
+              "  if (!res) return false;\n", type);
     }
   else
     {
@@ -1771,7 +1767,7 @@ expr::gen_transform (FILE *f, const char *dest, bool gimple, int depth,
        fprintf (f, ", ops%d[%u]", depth, i);
       fprintf (f, ");\n");
     }
-  fprintf (f, "  %s = res;\n", dest);
+  fprintf (f, "%s = res;\n", dest);
   fprintf (f, "}\n");
 }
 
index a93a880bc91dca423a3be6ecc6fb6f65b9117cfb..fe8092a8e63ebe8461c49e494d3182fe8b77fdad 100644 (file)
@@ -1,3 +1,8 @@
+2015-03-25  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/65519
+       * gnat.dg/specs/opt2.ads: New testcase.
+
 2015-03-25  Bin Cheng  <bin.cheng@arm.com>
 
        * lib/target-supports.exp (arm_tune_string_ops_prefer_neon): New.
diff --git a/gcc/testsuite/gnat.dg/specs/opt2.ads b/gcc/testsuite/gnat.dg/specs/opt2.ads
new file mode 100644 (file)
index 0000000..9ea333d
--- /dev/null
@@ -0,0 +1,11 @@
+-- { dg-do compile }
+-- { dg-options "-O2" }
+
+with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
+with Interfaces;            use Interfaces;
+
+package Opt2 is
+
+  type Arr is array (Unsigned_32 range <>) of Unbounded_String;
+
+end P;