Ping (https://gcc.gnu.org/pipermail/gcc-patches/2024-September/662211.html)
On Wed, Sep 04, 2024 at 01:56:59PM +0200, Paul Iannetta wrote:
> Hi,
>
> Currently, the only pragma directives that can be added by a backend, only
> have
> access to the information on the same line as the pragma, which is enough for
> modifying a global state.
>
> This means that a loop target pragma could look like this:
> #pragma target begin keyword [options]
> <The loop>
> #pragma target end keyword
>
> However, the coupling between the code in-between the two pragmas and its
> semantic is not preserved; moreover it's not possible to know if a loop is
> included within the region at parse time. The second point, is that it does
> not
> work because all the pragmas are resolved at parse time, hence it is not
> possible to observe the state of the region when performing optimizations.
>
> It would be nice to have something similar to what clang offers (Language
> Extensions: Extensions for loop hint optimizations [1]). So that it's clear
> that
> the pragma is tied to a loop and there is no need for "begin" and "end"
> region-delimiters.
>
> Leaving aside OpenMP's pragma directives, the only loop-specific pragmas
> provided by GCC are "unroll" and "ivdep". The parsing of those are very much
> hard-wired into the front-ends. The function dealing with the parsing of
> loops
> in the C and C++ front-end all take "ivdep" and "unroll" as an explicit
> argument. The Fortran front-end deals with them a bit differently but they
> are
> very much hardwired as well there.
>
> This means that for each new loop-specific pragma all those functions should
> be
> augmented with a new parameter, and the loop structure be updated with a new
> field.
>
> My current idea to implement this is:
> (1) Add a field "struct loop_info tinfo" to the loop class in cfgloop.h
> (2) The tinfo structure would contain the fields for the target independent
> loop information (that is unroll, and ivdep).
> (3) More fields could be added to this structure through a TARGET macro, it
> would looks like:
>
> struct loop_info tinfo {
> bool ivdep;
> unsigned short unroll;
> #ifdef TARGET_LOOP_INFO_FIELDS
> TARGET_LOOP_INFO_FIELDS
> #endif
> };
>
> (4) The annot_expr_kind enum should be extendable in the same way through a
> TARGET macro (TARGET_ANNOTATE_EXPR).
> (5) The callback hook processing the pragma should receive a pointer to the
> TINFO structure.
> (6) A new hook should be introduced for creating the ANNOTATE_EXPR on the
> loop
> condition. This hook will be called by the loop parsing function.
> (7) The function replace_loop_annotate_in_block would iterate over the kinds
> described by the enum annot_expr_kind, and call a new hook to process the
> annotate expr.
>
> In summary, in would require a new structure, the modification of the
> prototypes of the loop parsing functions, two new TARGET macros, a new kind of
> pragma hook for loop-specific pragma, and two new TARGET hooks.
>
> I don't really like the fact that TARGET_LOOP_INFO_FIELDS and
> TARGET_ANNOTATE_EXPR contains enum and struct fragments, another approach
> could
> be to use a hash-table.
>
> Thanks,
> Paul
>
> [1]: https://clang.llvm.org/docs/LanguageExtensions.html#id39