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