Re: [PATCH 1/2] gimplefe: Add support for REF_REVERSE_STORAGE_ORDER on mem
Richard Biener <[email protected]>
| Newsgroups | gmane.comp.gcc.patches |
|---|---|
| Message-ID | <CAFiYyc0nyeLLjhwpm0yRfb3OZaHAJPRwgP39h9yD0UduzcdYvQ@mail.gmail.com> |
On Sun, Aug 9, 2026 at 12:20 AM Andrea Pinski <[email protected]> wrote: > > 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 ] But this breaks existing IL, no? Also, why a number ... and why in the deref part? I'd have expected this to be part of the <type-name ...> part, alongside the alignment specification? > [ ',' 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 >