This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix PR65519


The following fixes PR65519 - we were using gimple_build from
gimple_simplify which isn't a good idea as that doesn't properly
fail when materializing stmts with operands we don't want
(SSA_NAME_OCCURS_IN_ABNORMAL_PHI).

Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.

Richard.

2015-03-24  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.

Index: gcc/genmatch.c
===================================================================
--- gcc/genmatch.c	(revision 221624)
+++ gcc/genmatch.c	(working copy)
@@ -1742,22 +1742,18 @@ expr::gen_transform (FILE *f, const char
 
   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
 	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: gcc/testsuite/gnat.dg/specs/opt2.ads
===================================================================
*** gcc/testsuite/gnat.dg/specs/opt2.ads	(revision 0)
--- gcc/testsuite/gnat.dg/specs/opt2.ads	(revision 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;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]