mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-10-07 19:03:57 +00:00
[flang][openacc][openmp] Update stride computation for bounds (#72168)
This patch updates the stride computation for the outer dimensions of multidimensional arrays where the stride is read from the descriptor. For the inner dimension, the stride is the element size in bytes. Then it is multiplied by the n-1 extent for outer dimensions.
This commit is contained in:
parent
a40900211a
commit
447af1ce99
@ -597,6 +597,7 @@ genBoundsOpsFromBox(fir::FirOpBuilder &builder, mlir::Location loc,
|
||||
mlir::Value one = builder.createIntegerConstant(loc, idxTy, 1);
|
||||
assert(box.getType().isa<fir::BaseBoxType>() &&
|
||||
"expect fir.box or fir.class");
|
||||
mlir::Value byteStride;
|
||||
for (unsigned dim = 0; dim < dataExv.rank(); ++dim) {
|
||||
mlir::Value d = builder.createIntegerConstant(loc, idxTy, dim);
|
||||
mlir::Value baseLb =
|
||||
@ -606,9 +607,13 @@ genBoundsOpsFromBox(fir::FirOpBuilder &builder, mlir::Location loc,
|
||||
mlir::Value lb = builder.createIntegerConstant(loc, idxTy, 0);
|
||||
mlir::Value ub =
|
||||
builder.create<mlir::arith::SubIOp>(loc, dimInfo.getExtent(), one);
|
||||
mlir::Value bound =
|
||||
builder.create<BoundsOp>(loc, boundTy, lb, ub, mlir::Value(),
|
||||
dimInfo.getByteStride(), true, baseLb);
|
||||
if (dim == 0) // First stride is the element size.
|
||||
byteStride = dimInfo.getByteStride();
|
||||
mlir::Value bound = builder.create<BoundsOp>(
|
||||
loc, boundTy, lb, ub, mlir::Value(), byteStride, true, baseLb);
|
||||
// Compute the stride for the next dimension.
|
||||
byteStride = builder.create<mlir::arith::MulIOp>(loc, byteStride,
|
||||
dimInfo.getExtent());
|
||||
bounds.push_back(bound);
|
||||
}
|
||||
return bounds;
|
||||
|
@ -102,4 +102,26 @@ contains
|
||||
! HLFIR: %[[PRESENT:.*]] = acc.present varPtr(%[[DECL_ARG0]]#1 : !fir.ref<!fir.array<?xf32>>) bounds(%[[BOUND]]) -> !fir.ref<!fir.array<?xf32>> {name = "a"}
|
||||
! CHECK: acc.kernels dataOperands(%[[PRESENT]] : !fir.ref<!fir.array<?xf32>>)
|
||||
|
||||
subroutine acc_multi_strides(a)
|
||||
real, dimension(:,:,:) :: a
|
||||
|
||||
!$acc kernels present(a)
|
||||
!$acc end kernels
|
||||
end subroutine
|
||||
|
||||
! CHECK-LABEL: func.func @_QMopenacc_boundsPacc_multi_strides(
|
||||
! CHECK-SAME: %[[ARG0:.*]]: !fir.box<!fir.array<?x?x?xf32>> {fir.bindc_name = "a"})
|
||||
! HLFIR: %[[DECL_ARG0:.*]]:2 = hlfir.declare %[[ARG0]] {uniq_name = "_QMopenacc_boundsFacc_multi_stridesEa"} : (!fir.box<!fir.array<?x?x?xf32>>) -> (!fir.box<!fir.array<?x?x?xf32>>, !fir.box<!fir.array<?x?x?xf32>>)
|
||||
! HLFIR: %[[BOX_DIMS0:.*]]:3 = fir.box_dims %[[DECL_ARG0]]#1, %c0{{.*}} : (!fir.box<!fir.array<?x?x?xf32>>, index) -> (index, index, index)
|
||||
! HLFIR: %[[BOUNDS0:.*]] = acc.bounds lowerbound(%{{.*}} : index) upperbound(%{{.*}} : index) stride(%[[BOX_DIMS0]]#2 : index) startIdx(%{{.*}} : index) {strideInBytes = true}
|
||||
! HLFIR: %[[STRIDE1:.*]] = arith.muli %[[BOX_DIMS0]]#2, %[[BOX_DIMS0]]#1 : index
|
||||
! HLFIR: %[[BOX_DIMS1:.*]]:3 = fir.box_dims %[[DECL_ARG0]]#1, %c1{{.*}} : (!fir.box<!fir.array<?x?x?xf32>>, index) -> (index, index, index)
|
||||
! HLFIR: %[[BOUNDS1:.*]] = acc.bounds lowerbound(%{{.*}} : index) upperbound(%{{.*}} : index) stride(%[[STRIDE1]] : index) startIdx(%{{.*}} : index) {strideInBytes = true}
|
||||
! HLFIR: %[[STRIDE2:.*]] = arith.muli %[[STRIDE1]], %[[BOX_DIMS1]]#1 : index
|
||||
! HLFIR: %[[BOX_DIMS2:.*]]:3 = fir.box_dims %[[DECL_ARG0]]#1, %c2{{.*}} : (!fir.box<!fir.array<?x?x?xf32>>, index) -> (index, index, index)
|
||||
! HLFIR: %[[BOUNDS2:.*]] = acc.bounds lowerbound(%{{.*}} : index) upperbound(%{{.*}} : index) stride(%[[STRIDE2]] : index) startIdx(%{{.*}} : index) {strideInBytes = true}
|
||||
! HLFIR: %[[BOX_ADDR:.*]] = fir.box_addr %[[DECL_ARG0]]#1 : (!fir.box<!fir.array<?x?x?xf32>>) -> !fir.ref<!fir.array<?x?x?xf32>>
|
||||
! HLFIR: %[[PRESENT:.*]] = acc.present varPtr(%[[BOX_ADDR]] : !fir.ref<!fir.array<?x?x?xf32>>) bounds(%29, %33, %37) -> !fir.ref<!fir.array<?x?x?xf32>> {name = "a"}
|
||||
! HLFIR: acc.kernels dataOperands(%[[PRESENT]] : !fir.ref<!fir.array<?x?x?xf32>>) {
|
||||
|
||||
end module
|
||||
|
Loading…
Reference in New Issue
Block a user