From 933d1e773411b0115bcc3b32e97e035019c7f6a0 Mon Sep 17 00:00:00 2001 From: ergawy Date: Tue, 18 Feb 2025 06:17:17 -0600 Subject: [PATCH 1/3] [flang][OpenMP] Extend `do concurrent` mapping to multi-range loops Adds support for converting mulit-range loops to OpenMP (on the host only for now). The changes here "prepare" a loop nest for collapsing by sinking iteration variables to the innermost `fir.do_loop` op in the nest. --- flang/docs/DoConcurrentConversionToOpenMP.md | 29 ++++ .../OpenMP/DoConcurrentConversion.cpp | 139 +++++++++++++++++- .../multiple_iteration_ranges.f90 | 72 +++++++++ 3 files changed, 239 insertions(+), 1 deletion(-) create mode 100644 flang/test/Transforms/DoConcurrent/multiple_iteration_ranges.f90 diff --git a/flang/docs/DoConcurrentConversionToOpenMP.md b/flang/docs/DoConcurrentConversionToOpenMP.md index 19611615ee9d6..ecb4428d7d3ba 100644 --- a/flang/docs/DoConcurrentConversionToOpenMP.md +++ b/flang/docs/DoConcurrentConversionToOpenMP.md @@ -173,6 +173,35 @@ omp.parallel { +### Multi-range loops + +The pass currently supports multi-range loops as well. Given the following +example: + +```fortran + do concurrent(i=1:n, j=1:m) + a(i,j) = i * j + end do +``` + +The generated `omp.loop_nest` operation look like: + +``` +omp.loop_nest (%arg0, %arg1) + : index = (%17, %19) to (%18, %20) + inclusive step (%c1_2, %c1_4) { + fir.store %arg0 to %private_i#1 : !fir.ref + fir.store %arg1 to %private_j#1 : !fir.ref + ... + omp.yield +} +``` + +It is worth noting that we have privatized versions for both iteration +variables: `i` and `j`. These are locally allocated inside the parallel/target +OpenMP region similar to what the single-range example in previous section +shows. +