[PATCH 1/2] gimplefe: Add support for REF_REVERSE_STORAGE_ORDER on mem

Andrea Pinski <[email protected]>
Newsgroups gmane.comp.gcc.patches
Message-ID <[email protected]>
While fixing PR 126729 and PR 126570, I found it was hard
to figure out if REF_REVERSE_STORAGE_ORDER was set on a MEM_REF.
Even for the gimple fe was able to set it.
This adds support to the gimple fe and also outputs
REF_REVERSE_STORAGE_ORDER for MEM_REF in gimple mode.

Bootstrapped and tested on x84_64-linux-gnu.

gcc/c/ChangeLog:

	* gimple-parser.cc (c_parser_gimple_postfix_expression):
	Allow for an optional `, 1/0` in front of the cb pair
	for MEM_REF.

gcc/ChangeLog:

	* tree-pretty-print.cc (dump_mem_ref): Dump REF_REVERSE_STORAGE_ORDER
	if it was set.

gcc/testsuite/ChangeLog:

	* gcc.dg/gimplefe-59.c: New test.

Signed-off-by: Andrea Pinski <[email protected]>
---
 gcc/c/gimple-parser.cc             | 34 ++++++++++++++++++++++++++++--
 gcc/testsuite/gcc.dg/gimplefe-59.c | 16 ++++++++++++++
 gcc/tree-pretty-print.cc           |  6 ++++++
 3 files changed, 54 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/gimplefe-59.c

diff --git a/gcc/c/gimple-parser.cc b/gcc/c/gimple-parser.cc
index 0fcb9ead83d..59cb29f420c 100644
--- a/gcc/c/gimple-parser.cc
+++ b/gcc/c/gimple-parser.cc
@@ -1530,6 +1530,7 @@ c_parser_gimple_postfix_expression (gimple_parser &parser)
 	      /* __MEM '<' type-name [ ',' number ] '>'
 	               '(' [ '(' type-name ')' ] unary-expression
 			   [ '+' number ]
+			   [ ',' number ]
 			   [ ',' number ':' number ] ')'  */
 	      location_t loc = c_parser_peek_token (parser)->location;
 	      c_parser_consume_token (parser);
@@ -1542,6 +1543,8 @@ c_parser_gimple_postfix_expression (gimple_parser &parser)
 	      index2.value = NULL_TREE;
 	      unsigned short clique = 0;
 	      unsigned short base = 0;
+	      bool reverse_order = false;
+	      struct c_expr ro;
 	      if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
 		{
 		  tree alias_type = NULL_TREE;
@@ -1626,10 +1629,29 @@ c_parser_gimple_postfix_expression (gimple_parser &parser)
 		  if (c_parser_next_token_is (parser, CPP_COMMA))
 		    {
 		      struct c_expr cl, ba;
+		      bool has_clb = true;
 		      c_parser_consume_token (parser);
 		      cl = c_parser_gimple_postfix_expression (parser);
-		      if (c_parser_require (parser,
-					    CPP_COLON, "expected %<:%>"))
+		      if (!c_parser_next_token_is (parser, CPP_COLON))
+			{
+			  ro = cl;
+			  unsigned HOST_WIDE_INT tmp = 0;
+			  if (!tree_fits_uhwi_p (ro.value)
+			      || (tmp = tree_to_uhwi (ro.value)) > 1)
+			    error_at (ro.get_start (),
+				      "invalid reverse order value");
+			  reverse_order = tmp;
+			  has_clb = false;
+			  if (c_parser_next_token_is (parser, CPP_COMMA))
+			    {
+			      c_parser_consume_token (parser);
+			      cl = c_parser_gimple_postfix_expression (parser);
+		              has_clb = true;
+			    }
+			}
+		      if (has_clb
+			  && c_parser_require (parser,
+					       CPP_COLON, "expected %<:%>"))
 			{
 			  ba = c_parser_gimple_postfix_expression (parser);
 			  if (!tree_fits_uhwi_p (cl.value)
@@ -1665,6 +1687,14 @@ c_parser_gimple_postfix_expression (gimple_parser &parser)
 		  MR_DEPENDENCE_CLIQUE (expr.value) = clique;
 		  MR_DEPENDENCE_BASE (expr.value) = base;
 		}
+	      if (reverse_order)
+		{
+		  if (TREE_CODE (expr.value) == MEM_REF)
+		    REF_REVERSE_STORAGE_ORDER (expr.value) = reverse_order;
+		  else
+		    error_at (ro.get_start (),
+			      "target mem ref cannot have reverse order");
+		}
 	      break;
 	    }
 	  else if (strcmp (IDENTIFIER_POINTER (id), "__VIEW_CONVERT") == 0)
diff --git a/gcc/testsuite/gcc.dg/gimplefe-59.c b/gcc/testsuite/gcc.dg/gimplefe-59.c
new file mode 100644
index 00000000000..296c088a2a0
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gimplefe-59.c
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-fgimple" } */
+
+/* test REF_REVERSE_STORAGE_ORDER parsing of gimple fe. */
+
+int __GIMPLE (ssa,guessed_local(1073741824))
+f2 (void * a, bool b, bool bb)
+{
+  int _1;
+
+  __BB(2,guessed_local(1073741824)):
+  _1 = __MEM <int> (a_5(D), 1);
+  return _1;
+
+}
+
diff --git a/gcc/tree-pretty-print.cc b/gcc/tree-pretty-print.cc
index bd60e5c15c1..316945c00ed 100644
--- a/gcc/tree-pretty-print.cc
+++ b/gcc/tree-pretty-print.cc
@@ -2075,6 +2075,12 @@ dump_mem_ref (pretty_printer *pp, tree node, int spc, dump_flags_t flags)
 				 spc, flags | TDF_SLIM, false);
 	    }
 	}
+      if (TREE_CODE (node) == MEM_REF
+	  && REF_REVERSE_STORAGE_ORDER (node))
+	{
+	  pp_string (pp, ", ");
+	  pp_decimal_int (pp, REF_REVERSE_STORAGE_ORDER (node));
+	}
       if (MR_DEPENDENCE_CLIQUE (node) != 0)
 	{
 	  pp_string (pp, ", ");
-- 
2.43.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.