llvm-project
9659d3a8 - [mlir][OpenACC] Forward dynamic boxed reduction extents (#211318)

Commit
96 days ago
[mlir][OpenACC] Forward dynamic boxed reduction extents (#211318) Example: ```fortran subroutine reduce(a, x, n) integer :: n, i real :: a(:), x(:) !$acc parallel loop reduction(+:a) do i = 1, n a(:) = a(:) + x(i) end do end subroutine ``` `ACCCGToGPU` represents each gang/thread-private array as a dynamically offset `memref.subview`. Converting this subview directly to a FIR pointer-like type loses the memref offset, causing different private copies to alias the same storage. Fix: extract the selected subview’s element offset, convert it to bytes, and create a zero-offset view at that address before converting to the FIR pointer-like type. This preserves the selected gang/thread-private slice. Before: ```mlir %subview = memref.subview %view[%block_id, 0] [1, %extent] [1, 1] : memref<?x?xf64> to memref<?xf64, strided<[1], offset: ?>> %result = fir.convert %subview : (memref<?xf64, strided<[1], offset: ?>>) -> !fir.heap<!fir.array<?xf64>> ``` After: ```mlir %subview = memref.subview %view[%block_id, 0] [1, %extent] [1, 1] : memref<?x?xf64> to memref<?xf64, strided<[1], offset: ?>> %base, %offset, %sizes, %strides = memref.extract_strided_metadata %subview : memref<?xf64, strided<[1], offset: ?>> -> memref<f64>, index, index, index %c8 = arith.constant 8 : index %byte_offset = arith.muli %offset, %c8 : index %private_view = memref.view %buffer[%byte_offset][%extent] : memref<?xi8> to memref<?xf64> %result = fir.convert %private_view : (memref<?xf64>) -> !fir.heap<!fir.array<?xf64>> ```
Author
Parents
Loading