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
>