[flang-commits] [flang] [flang] Do not hoist all scalar sub-expressions from WHERE constructs (PR #91395)
Valentin Clement バレンタイン クレメン via flang-commits
flang-commits at lists.llvm.org
Fri May 10 09:46:10 PDT 2024
================
@@ -907,13 +918,36 @@ void MaskedArrayExpr::generateNoneElementalPart(fir::FirOpBuilder &builder,
mlir::IRMapping &mapper) {
assert(!noneElementalPartWasGenerated &&
"none elemental parts already generated");
- // Clone all operations, except the elemental and the final yield.
- mlir::Block::OpListType &ops = region.back().getOperations();
- assert(!ops.empty() && "yield block cannot be empty");
- auto end = ops.end();
- for (auto opIt = ops.begin(); std::next(opIt) != end; ++opIt)
- if (!elementalParts.contains(&*opIt))
- (void)builder.clone(*opIt, mapper);
+ if (isOuterMaskExpr) {
+ // The outer mask expression is actually not masked, it is dealt as
+ // such so that its elemental part, if any, can be inlined in the WHERE
+ // loops. But all of the operations outside of hlfir.elemental/
+ // hlfir.elemental_addr must be emitted now because their value may be
+ // required to deduce the mask shape and the WHERE loop bounds.
+ for (mlir::Operation &op : region.back().without_terminator())
+ if (!elementalParts.contains(&op))
+ (void)builder.clone(op, mapper);
+ } else {
+ // For actual masked expressions, Fortran requires elemental expressions,
+ // even the scalar ones that are no encoded with hlfir.elemental, to be
----------------
clementval wrote:
```suggestion
// even the scalar ones that are not encoded with hlfir.elemental, to be
```
?
https://github.com/llvm/llvm-project/pull/91395
More information about the flang-commits
mailing list