================
@@ -5242,6 +5281,14 @@ static mlir::omp::DistributeOp 
genCompositeDistributeParallelDo(
   ConstructQueue::const_iterator parallelItem = std::next(distributeItem);
   ConstructQueue::const_iterator doItem = std::next(parallelItem);
 
+  // Clause expressions follow source nesting even though the composite
+  // operations place PARALLEL outside DISTRIBUTE.
+  mlir::omp::DistributeOperands distributeClauseOps;
+  genDistributeClauses(converter, semaCtx, stmtCtx, distributeItem->clauses,
----------------
MattPD wrote:

Moving `genDistributeClauses` before `genParallelOp` creates the 
`dist_schedule` operand's temporary outside PARALLEL, but `genOMPDispatch` 
still finalizes `stmtCtx` after the inner DISTRIBUTE operation. Each thread 
then destroys the same temporary. The DISTRIBUTE PARALLEL DO SIMD composite has 
the same problem.

You can reproduce this by saving the following to `repro.f90`, building with 
`flang -fopenmp -fopenmp-version=52 -module-dir /tmp repro.f90 -o repro`, and 
running `OMP_NUM_TEAMS=1 OMP_NUM_THREADS=4 ./repro`:

```fortran
module m
contains
  function get(n) result(r)
    integer, intent(in) :: n
    integer, allocatable :: r(:)
    allocate(r(n))
    r = 1
  end function
  subroutine s(n, a)
    integer :: n, i, a(n)
    !$omp teams distribute parallel do dist_schedule(static, size(get(n)))
    do i = 1, n
      a(i) = i
    end do
  end subroutine
end module
program p
  use m
  integer :: a(64)
  a = 0
  call s(64, a)
  print *, sum(a)
end program
```

At 9c59c04 and 1850727, this prints `2080` and then aborts with `double free or 
corruption`. The [merge 
base](https://github.com/llvm/llvm-project/commit/ae7f7ef515657eeb037e1cad045ade1a45cc7951)
 exits normally with `2080`. At 9c59c04, HLFIR places the call to `get` in 
`omp.teams` and its `hlfir.destroy` in `omp.parallel`. At the base, both 
execute inside PARALLEL. The program also exits normally at 9c59c04 when it 
runs with one thread or when the construct uses DISTRIBUTE without PARALLEL.

Could both composite helpers preserve the operand's source context and the 
required cleanup order while destroying each temporary exactly once?

https://github.com/llvm/llvm-project/pull/224431
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to