diff mbox

[match-and-simplify] Mark conditional converts with '?'

Message ID alpine.LSU.2.11.1408121214270.20733@zhemvz.fhfr.qr
State New
Headers show

Commit Message

Richard Biener Aug. 12, 2014, 10:15 a.m. UTC
The following patch forces you to write convert?, convert1? or
convert2? to get a conditional convert.

Committed.

Richard.

2014-08-12  Richard Biener  <rguenther@suse.de>

	* genmatch.c (enum tree_code): Add CONVERT0.
	(main): Likewise.
	(parse_operation): Handle conditional converts specially.
	(lower_opt_convert): Handle CONVERT0.
	(parse_for): Likewise.

Comments

Jakub Jelinek Aug. 12, 2014, 10:47 a.m. UTC | #1
On Tue, Aug 12, 2014 at 12:15:20PM +0200, Richard Biener wrote:
> @@ -2422,6 +2441,7 @@ main(int argc, char **argv)
>    add_operator (SYM, # SYM, # TYPE, NARGS);
>  #define END_OF_BASE_TREE_CODES
>  #include "tree.def"
> +add_operator (CONVERT1, "CONVERT0", "tcc_unary", 1);

Pasto?  Shouldn't that be CONVERT0, ?

>  add_operator (CONVERT1, "CONVERT1", "tcc_unary", 1);
>  add_operator (CONVERT2, "CONVERT2", "tcc_unary", 1);
>  #undef END_OF_BASE_TREE_CODES

	Jakub
Richard Biener Aug. 12, 2014, 11:18 a.m. UTC | #2
On Tue, 12 Aug 2014, Jakub Jelinek wrote:

> On Tue, Aug 12, 2014 at 12:15:20PM +0200, Richard Biener wrote:
> > @@ -2422,6 +2441,7 @@ main(int argc, char **argv)
> >    add_operator (SYM, # SYM, # TYPE, NARGS);
> >  #define END_OF_BASE_TREE_CODES
> >  #include "tree.def"
> > +add_operator (CONVERT1, "CONVERT0", "tcc_unary", 1);
> 
> Pasto?  Shouldn't that be CONVERT0, ?

Yeah - fixed.

Richard.
diff mbox

Patch

Index: gcc/genmatch.c
===================================================================
--- gcc/genmatch.c	(revision 213849)
+++ gcc/genmatch.c	(working copy)
@@ -101,6 +101,7 @@  output_line_directive (FILE *f, source_l
 #define DEFTREECODE(SYM, STRING, TYPE, NARGS)   SYM,
 enum tree_code {
 #include "tree.def"
+CONVERT0,
 CONVERT1,
 CONVERT2,
 MAX_TREE_CODES
@@ -708,9 +709,9 @@  lower_opt_convert (operand *o)
   
   v1.safe_push (o);
   
-  enum tree_code opers[] = { CONVERT1, CONVERT2 };
+  enum tree_code opers[] = { CONVERT0, CONVERT1, CONVERT2 };
 
-  for (unsigned i = 0; i < 2; ++i)
+  for (unsigned i = 0; i < 3; ++i)
     {
       v2 = vNULL;
       for (unsigned j = 0; j < v1.length (); ++j)
@@ -2069,7 +2070,25 @@  get_number (cpp_reader *r)
 static e_operation *
 parse_operation (cpp_reader *r)
 {
-  return new e_operation (get_ident (r));
+  const char *id = get_ident (r);
+  const cpp_token *token = peek (r);
+  if (token->type == CPP_QUERY
+      && !(token->flags & PREV_WHITE))
+    {
+      if (strcmp (id, "convert") == 0)
+	id = "convert0";
+      else if (strcmp  (id, "convert0") == 0)
+	;
+      else if (strcmp  (id, "convert1") == 0)
+	;
+      else
+	fatal_at (token, "non-convert operator conditionalized");
+      eat_token (r, CPP_QUERY);
+    }
+  else if (strcmp  (id, "convert0") == 0
+	   || strcmp  (id, "convert1") == 0)
+    fatal_at (token, "expected '?' after conditional operator");
+  return new e_operation (id);
 }
 
 static struct operand * parse_op (cpp_reader *r);
@@ -2291,8 +2310,8 @@  parse_for (cpp_reader *r, source_locatio
 	break;
       const char *id = get_ident (r);
       id_base *idb = get_operator (id);
-      if (*idb == CONVERT1 || *idb == CONVERT2)
-	fatal_at (token, "convert1, convert2 cannot be used inside for");
+      if (*idb == CONVERT0 || *idb == CONVERT1 || *idb == CONVERT2)
+	fatal_at (token, "conditional operators cannot be used inside for");
       opers.safe_push (id);
     }
 
@@ -2422,6 +2441,7 @@  main(int argc, char **argv)
   add_operator (SYM, # SYM, # TYPE, NARGS);
 #define END_OF_BASE_TREE_CODES
 #include "tree.def"
+add_operator (CONVERT1, "CONVERT0", "tcc_unary", 1);
 add_operator (CONVERT1, "CONVERT1", "tcc_unary", 1);
 add_operator (CONVERT2, "CONVERT2", "tcc_unary", 1);
 #undef END_OF_BASE_TREE_CODES