[llvm-branch-commits] [flang] [flang][OpenMP] Extend `do concurrent` mapping to multi-range loops (PR #127634)
Sergio Afonso via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Fri Feb 21 04:44:04 PST 2025
================
@@ -102,6 +105,47 @@ mlir::Operation *findLoopIterationVarMemDecl(fir::DoLoopOp doLoop) {
return result.getDefiningOp();
}
+/// Collects the op(s) responsible for updating a loop's iteration variable with
+/// the current iteration number. For example, for the input IR:
+/// ```
+/// %i = fir.alloca i32 {bindc_name = "i"}
+/// %i_decl:2 = hlfir.declare %i ...
+/// ...
+/// fir.do_loop %i_iv = %lb to %ub step %step unordered {
+/// %1 = fir.convert %i_iv : (index) -> i32
+/// fir.store %1 to %i_decl#1 : !fir.ref<i32>
+/// ...
+/// }
+/// ```
+/// this function would return the first 2 ops in the `fir.do_loop`'s region.
+llvm::SetVector<mlir::Operation *>
+extractIndVarUpdateOps(fir::DoLoopOp doLoop) {
+ mlir::Value indVar = doLoop.getInductionVar();
+ llvm::SetVector<mlir::Operation *> indVarUpdateOps;
+
+ llvm::SmallVector<mlir::Value> toProcess;
+ toProcess.push_back(indVar);
+
+ llvm::DenseSet<mlir::Value> done;
+
+ while (!toProcess.empty()) {
+ mlir::Value val = toProcess.back();
+ toProcess.pop_back();
+
+ if (!done.insert(val).second)
+ continue;
+
+ for (mlir::Operation *user : val.getUsers()) {
+ indVarUpdateOps.insert(user);
+
+ for (mlir::Value result : user->getResults())
+ toProcess.push_back(result);
+ }
+ }
+
+ return std::move(indVarUpdateOps);
----------------
skatrak wrote:
Returning containers goes a bit against general recommendations, but if you prefer to keep this approach rather than populating an output `SmallVectorImpl &` argument with help of `llvm::is_contained()` (which is what `SetVector` does for small vectors), I'd suggest considering the following:
```suggestion
return std::move(indVarUpdateOps.takeVector());
```
That way, at least we don't leak implementation details of the structure we used to avoid duplicates.
https://github.com/llvm/llvm-project/pull/127634
More information about the llvm-branch-commits
mailing list