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][match-and-simplify] "Handle" TREE_SIDE_EFFECTS operands properly


This handles them by not simplifying anything (for now).  It also
fixes two warnings that prevent bootstrap.

Committed.

Richard.

2014-07-15  Richard Biener  <rguenther@suse.de>

	* genmatch.c (decision_tree::gen_generic): Reject operands
	with TREE_SIDE_EFFECTS for now.
	(parse_for): Drop name of unused parameter.
	(main): Remove unused token.
	* match.pd: Remove ??? comment about TREE_SIDE_EFFECTS.

Index: gcc/genmatch.c
===================================================================
--- gcc/genmatch.c	(revision 212542)
+++ gcc/genmatch.c	(working copy)
@@ -1608,6 +1608,18 @@ decision_tree::gen_generic (FILE *f)
       fprintf (f, ")\n");
       fprintf (f, "{\n");
 
+      /* ???  For now reject all simplifications on operands with
+         side-effects as we are not prepared to properly wrap
+	 omitted parts with omit_one_operand and friends.  In
+	 principle we can do that automagically for a subset of
+	 transforms (and only reject the remaining cases).
+	 This fixes for example gcc.c-torture/execute/20050131-1.c.  */
+      fprintf (f, "if (TREE_SIDE_EFFECTS (op0)");
+      for (unsigned i = 1; i < n; ++i)
+	fprintf (f, "|| TREE_SIDE_EFFECTS (op%d)", i);
+      fprintf (f, ")\n"
+	       "  return NULL_TREE;\n");
+
       fprintf (f, "switch (code)\n"
 	       "{\n");
       for (unsigned i = 0; i < root->kids.length (); i++)
@@ -2013,7 +2025,7 @@ parse_match_and_simplify (cpp_reader *r,
 }
 
 void
-parse_for (cpp_reader *r, source_location match_location, vec<simplify *>& simplifiers) 
+parse_for (cpp_reader *r, source_location, vec<simplify *>& simplifiers) 
 {
   const char *user_id = get_ident (r);
   eat_ident (r, "in");
@@ -2074,7 +2086,6 @@ int
 main(int argc, char **argv)
 {
   cpp_reader *r;
-  const cpp_token *token;
 
   progname = "genmatch";
 
Index: gcc/match.pd
===================================================================
--- gcc/match.pd	(revision 212542)
+++ gcc/match.pd	(working copy)
@@ -46,11 +46,7 @@ along with GCC; see the file COPYING3.
   (trunc_mod @0 integer_onep)
   { build_zero_cst (type); })
 /* Same applies to modulo operations, but fold is inconsistent here
-   and simplifies 0 % x to 0.
-   ???  This also shows an issue with the GENERIC case - we have to
-   pass all dropped through omit_{one,two}_operand{,s} to preserve
-   their side-effects - seen gcc.c-torture/execute/20050131-1.c
-   execute failure.  Eventually we can autodetect this.  */
+   and simplifies 0 % x to 0.  */
 (match_and_simplify
   (trunc_mod integer_zerop@0 @1)
   if (!integer_zerop (@1))


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