[flang][hlfir] Add hlfir.forall_index operation
authorJean Perier <jperier@nvidia.com>
Fri, 5 May 2023 07:13:50 +0000 (09:13 +0200)
committerJean Perier <jperier@nvidia.com>
Fri, 5 May 2023 07:17:50 +0000 (09:17 +0200)
commit0aa80b42ac975a10087c4356b475a188ef1f5afa
tree8c95c3820ea2bd38d81989577e0379c34bddd687
parent309bfecf7dddb9d6530fa95656bbcdd82423fd44
[flang][hlfir] Add hlfir.forall_index operation

This is the last piece required to lower Forall (except pointer
assignments, where an operation may be needed to deal with bounds
remapping).

Lowering requires symbols to be mapped to memory SSA values produced
by a fir_FortranVariableOpInterface operation. This applies to
forall index-values, that are symbols.

fir.alloca/fir.store/hlfir.declare are not allowed inside the body of
an hlfir.forall that only accept operations with the
hlfir_OrderedAssignmentTreeOpInterface so that the forall structure is
well defined and easy to transform.
Allowing such operations in the forall body would open the doors to
generating ill-formed programs where such operation would be used for
non index-values.

Instead, add an hlfir.forall_index with both required interface to
produce a memory address for a forall index.

As a bonus, since forall index-value are by nature read-only, the
loads of hlfir.forall_index can be canonicalized, which will help
simplifying the hlfir.forall nested code (it is unclear we will be
able to tell MLIR enough about hlfir.forall and hlfir.where structure
so that it could safely do a generic mem-to-reg inside it, and getting
rid of read-effect operations will benefit the forall rewrite pass).

Differential Revision: https://reviews.llvm.org/D149836
flang/include/flang/Optimizer/HLFIR/HLFIROps.td
flang/lib/Optimizer/HLFIR/IR/HLFIROps.cpp
flang/test/HLFIR/forall-index.fir [new file with mode: 0644]