The following adds clique/base on __MEM to the GIMPLE parser and
to -gimple dumping.
Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.
gcc/c/
* gimple-parser.cc (c_parser_gimple_postfix_expression):
Parse optional clique : base specifier on __MEM.
gcc/
* tree-pretty-print.cc (dump_mem_ref): Dump clique : base
specifier for MEM_REF and TARGET_MEM_REF when dumping
GIMPLE format.
gcc/testsuite/
* gcc.dg/gimplefe-58.c: New testcase.
---
gcc/c/gimple-parser.cc | 32 +++++++++++++++++++++++++++++-
gcc/testsuite/gcc.dg/gimplefe-58.c | 17 ++++++++++++++++
gcc/tree-pretty-print.cc | 7 +++++++
3 files changed, 55 insertions(+), 1 deletion(-)
create mode 100644 gcc/testsuite/gcc.dg/gimplefe-58.c
diff --git a/gcc/c/gimple-parser.cc b/gcc/c/gimple-parser.cc
index d4c5001623e..52819a6587f 100644
--- a/gcc/c/gimple-parser.cc
+++ b/gcc/c/gimple-parser.cc
@@ -1529,7 +1529,8 @@ 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);
tree type = c_parser_gimple_typespec (parser);
@@ -1539,6 +1540,8 @@ c_parser_gimple_postfix_expression (gimple_parser &parser)
step.value = NULL_TREE;
index.value = NULL_TREE;
index2.value = NULL_TREE;
+ unsigned short clique = 0;
+ unsigned short base = 0;
if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
{
tree alias_type = NULL_TREE;
@@ -1620,6 +1623,27 @@ c_parser_gimple_postfix_expression (gimple_parser
&parser)
"expected constant step for %<__MEM%> "
"operand");
}
+ if (c_parser_next_token_is (parser, CPP_COMMA))
+ {
+ struct c_expr cl, ba;
+ c_parser_consume_token (parser);
+ cl = c_parser_gimple_postfix_expression (parser);
+ if (c_parser_require (parser,
+ CPP_COLON, "expected %<:%>"))
+ {
+ ba = c_parser_gimple_postfix_expression (parser);
+ if (!tree_fits_uhwi_p (cl.value)
+ || !tree_fits_uhwi_p (ba.value)
+ || compare_tree_int (cl.value,
+ (clique = tree_to_uhwi
+ (cl.value)))
+ || compare_tree_int (ba.value,
+ (base = tree_to_uhwi
+ (ba.value))))
+ error_at (cl.get_start (),
+ "invalid clique/base pair");
+ }
+ }
c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
"expected %<)%>");
}
@@ -1635,6 +1659,12 @@ c_parser_gimple_postfix_expression (gimple_parser
&parser)
else
expr.value = build2_loc (loc, MEM_REF,
type, ptr.value, alias_off.value);
+ if (clique != 0)
+ {
+ cfun->last_clique = MAX (cfun->last_clique, clique);
+ MR_DEPENDENCE_CLIQUE (expr.value) = clique;
+ MR_DEPENDENCE_BASE (expr.value) = base;
+ }
break;
}
else if (strcmp (IDENTIFIER_POINTER (id), "__VIEW_CONVERT") == 0)
diff --git a/gcc/testsuite/gcc.dg/gimplefe-58.c
b/gcc/testsuite/gcc.dg/gimplefe-58.c
new file mode 100644
index 00000000000..b209ab6d546
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gimplefe-58.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-fgimple" } */
+
+int __GIMPLE (ssa)
+foo (int * restrict p, int * q)
+{
+ int x;
+ int _1;
+ int _7;
+
+ __BB(2):
+ x_4 = __MEM <int> (q_3(D), 1:0);
+ __MEM <int> ((int *)p_5(D), 1 :1) = 1;
+ _1 = __MEM <int> (q_3(D), 1: 0);
+ _7 = _1 + x_4;
+ return _7;
+}
diff --git a/gcc/tree-pretty-print.cc b/gcc/tree-pretty-print.cc
index ba04911ae90..12e09320683 100644
--- a/gcc/tree-pretty-print.cc
+++ b/gcc/tree-pretty-print.cc
@@ -2004,6 +2004,13 @@ dump_mem_ref (pretty_printer *pp, tree node, int spc,
dump_flags_t flags)
spc, flags | TDF_SLIM, false);
}
}
+ if (MR_DEPENDENCE_CLIQUE (node) != 0)
+ {
+ pp_string (pp, ", ");
+ pp_decimal_int (pp, MR_DEPENDENCE_CLIQUE (node));
+ pp_colon (pp);
+ pp_decimal_int (pp, MR_DEPENDENCE_BASE (node));
+ }
pp_right_paren (pp);
}
else if (TREE_CODE (node) == MEM_REF
--
2.51.0