[flang-commits] [flang] [flang][OpenMP] Fix construct privatization in default clause (PR #72510)

via flang-commits flang-commits at lists.llvm.org
Tue Mar 26 23:54:38 PDT 2024


NimishMishra wrote:

Thanks @luporl. Yeah, I think recursion is the best way to go forward. I made the required changes for a recursive solution, and for the following:

```
program main
      integer :: y, z
      !$omp parallel default(private) firstprivate(y)
      do i = 1, 10 
            y = 1
            do j = 1, 10
            z = 20
            !$omp parallel default(private)
                y = 2
            !$omp end parallel
            end do
        end do
      !$omp end parallel 
end program
```

I have the following FIR:

```
%0 = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFEi"}
    %1 = fir.declare %0 {uniq_name = "_QFEi"} : (!fir.ref<i32>) -> !fir.ref<i32>
    %2 = fir.alloca i32 {bindc_name = "j", uniq_name = "_QFEj"}
    %3 = fir.declare %2 {uniq_name = "_QFEj"} : (!fir.ref<i32>) -> !fir.ref<i32>
    %4 = fir.alloca i32 {bindc_name = "y", uniq_name = "_QFEy"}
    %5 = fir.declare %4 {uniq_name = "_QFEy"} : (!fir.ref<i32>) -> !fir.ref<i32>
    %6 = fir.alloca i32 {bindc_name = "z", uniq_name = "_QFEz"}
    %7 = fir.declare %6 {uniq_name = "_QFEz"} : (!fir.ref<i32>) -> !fir.ref<i32>
    omp.parallel {
      %8 = fir.alloca i32 {bindc_name = "j", pinned}
      %9 = fir.declare %8 {uniq_name = "_QFEj"} : (!fir.ref<i32>) -> !fir.ref<i32>
      %10 = fir.alloca i32 {bindc_name = "i", pinned}
      %11 = fir.declare %10 {uniq_name = "_QFEi"} : (!fir.ref<i32>) -> !fir.ref<i32>
      %12 = fir.alloca i32 {bindc_name = "y", pinned, uniq_name = "_QFEy"}
      %13 = fir.declare %12 {uniq_name = "_QFEy"} : (!fir.ref<i32>) -> !fir.ref<i32>
      %14 = fir.load %5 : !fir.ref<i32>
      fir.store %14 to %13 : !fir.ref<i32>
      %15 = fir.alloca i32 {bindc_name = "z", pinned, uniq_name = "_QFEz"}
      %16 = fir.declare %15 {uniq_name = "_QFEz"} : (!fir.ref<i32>) -> !fir.ref<i32>
      %17 = fir.convert %c1_i32 : (i32) -> index
      %18 = fir.convert %c10_i32 : (i32) -> index
      %19 = fir.convert %17 : (index) -> i32
      %20:2 = fir.do_loop %arg0 = %17 to %18 step %c1 iter_args(%arg1 = %19) -> (index, i32) {
        fir.store %arg1 to %11 : !fir.ref<i32>
        fir.store %c1_i32 to %13 : !fir.ref<i32>
        %21 = fir.convert %c1_i32 : (i32) -> index
        %22 = fir.convert %c10_i32 : (i32) -> index
        %23 = fir.convert %21 : (index) -> i32
        %24:2 = fir.do_loop %arg2 = %21 to %22 step %c1 iter_args(%arg3 = %23) -> (index, i32) {
          fir.store %arg3 to %9 : !fir.ref<i32>
          fir.store %c20_i32 to %16 : !fir.ref<i32>
          omp.parallel {
            %33 = fir.alloca i32 {bindc_name = "y", pinned, uniq_name = "_QFEy"}
            %34 = fir.declare %33 {uniq_name = "_QFEy"} : (!fir.ref<i32>) -> !fir.ref<i32>
            fir.store %c2_i32 to %34 : !fir.ref<i32>
            omp.terminator
          }
          %29 = arith.addi %arg2, %c1 : index
          %30 = fir.convert %c1 : (index) -> i32
          %31 = fir.load %9 : !fir.ref<i32>
          %32 = arith.addi %31, %30 : i32
          fir.result %29, %32 : index, i32
        }
        fir.store %24#1 to %9 : !fir.ref<i32>
        %25 = arith.addi %arg0, %c1 : index
        %26 = fir.convert %c1 : (index) -> i32
        %27 = fir.load %11 : !fir.ref<i32>
        %28 = arith.addi %27, %26 : i32
        fir.result %25, %28 : index, i32
      }
      fir.store %20#1 to %11 : !fir.ref<i32>
      omp.terminator
```

The behaviour of the IR seems fine to me. Is it okay with you? I'll push the revision thereafter.

https://github.com/llvm/llvm-project/pull/72510


More information about the flang-commits mailing list