[flang-commits] [flang] [flang][acc] Fix mappableTy.generateAccBounds to correctly handle dynamic-sized arrays (PR #155666)
via flang-commits
flang-commits at lists.llvm.org
Wed Aug 27 14:31:14 PDT 2025
https://github.com/khaki3 updated https://github.com/llvm/llvm-project/pull/155666
>From b2b1ab85242d416d76a798f9266cbb2d11e7f4d1 Mon Sep 17 00:00:00 2001
From: Kazuaki Matsumura <kmatsumura at nvidia.com>
Date: Wed, 27 Aug 2025 10:45:31 -0700
Subject: [PATCH 1/2] Fix mappableTy.generateAccBounds
---
.../OpenACC/Support/FIROpenACCTypeInterfaces.cpp | 8 +++-----
flang/test/Fir/OpenACC/openacc-mappable.fir | 4 ++--
2 files changed, 5 insertions(+), 7 deletions(-)
diff --git a/flang/lib/Optimizer/OpenACC/Support/FIROpenACCTypeInterfaces.cpp b/flang/lib/Optimizer/OpenACC/Support/FIROpenACCTypeInterfaces.cpp
index 5b6d904fb0d59..9b4db4900258b 100644
--- a/flang/lib/Optimizer/OpenACC/Support/FIROpenACCTypeInterfaces.cpp
+++ b/flang/lib/Optimizer/OpenACC/Support/FIROpenACCTypeInterfaces.cpp
@@ -243,8 +243,6 @@ generateSeqTyAccBounds(fir::SequenceType seqType, mlir::Value var,
mlir::dyn_cast_if_present<fir::ShapeOp>(shape.getDefiningOp())) {
mlir::Value cummulativeExtent = one;
for (auto extent : shapeOp.getExtents()) {
- mlir::Value upperbound =
- mlir::arith::SubIOp::create(builder, loc, extent, one);
mlir::Value stride = one;
if (strideIncludeLowerExtent) {
stride = cummulativeExtent;
@@ -254,7 +252,7 @@ generateSeqTyAccBounds(fir::SequenceType seqType, mlir::Value var,
auto accBound = mlir::acc::DataBoundsOp::create(
builder, loc,
mlir::acc::DataBoundsType::get(builder.getContext()),
- /*lowerbound=*/zero, /*upperbound=*/upperbound,
+ /*lowerbound=*/one, /*upperbound=*/extent,
/*extent=*/extent, /*stride=*/stride, /*strideInBytes=*/false,
/*startIdx=*/one);
accBounds.push_back(accBound);
@@ -282,9 +280,9 @@ generateSeqTyAccBounds(fir::SequenceType seqType, mlir::Value var,
auto accBound = mlir::acc::DataBoundsOp::create(
builder, loc,
mlir::acc::DataBoundsType::get(builder.getContext()),
- /*lowerbound=*/zero, /*upperbound=*/upperbound,
+ /*lowerbound=*/lowerbound, /*upperbound=*/upperbound,
/*extent=*/extent, /*stride=*/stride, /*strideInBytes=*/false,
- /*startIdx=*/lowerbound);
+ /*startIdx=*/one);
accBounds.push_back(accBound);
}
}
diff --git a/flang/test/Fir/OpenACC/openacc-mappable.fir b/flang/test/Fir/OpenACC/openacc-mappable.fir
index 71576f4b71075..3535bfaae3c30 100644
--- a/flang/test/Fir/OpenACC/openacc-mappable.fir
+++ b/flang/test/Fir/OpenACC/openacc-mappable.fir
@@ -62,12 +62,12 @@ module attributes {dlti.dl_spec = #dlti.dl_spec<f16 = dense<16> : vector<2xi64>,
// CHECK: Visiting: %{{.*}} = acc.copyin varPtr(%{{.*}} : !fir.ref<!fir.array<?xf32>>) -> !fir.ref<!fir.array<?xf32>> {name = "arr1", structured = false}
// CHECK: Pointer-like and Mappable: !fir.ref<!fir.array<?xf32>>
// CHECK: Type category: array
- // CHECK: Bound[0]: %{{.*}} = acc.bounds lowerbound(%c0{{.*}} : index) upperbound(%{{.*}} : index) extent(%{{.*}} : index) stride(%c1{{.*}} : index) startIdx(%c1{{.*}} : index)
+ // CHECK: Bound[0]: %{{.*}} = acc.bounds lowerbound(%c1{{.*}} : index) upperbound(%{{.*}} : index) extent(%{{.*}} : index) stride(%c1{{.*}} : index) startIdx(%c1{{.*}} : index)
// CHECK: Visiting: %{{.*}} = acc.copyin varPtr(%{{.*}} : !fir.ref<!fir.array<?xf32>>) -> !fir.ref<!fir.array<?xf32>> {name = "arr2", structured = false}
// CHECK: Pointer-like and Mappable: !fir.ref<!fir.array<?xf32>>
// CHECK: Type category: array
- // CHECK: Bound[0]: %{{.*}} = acc.bounds lowerbound(%c0{{.*}} : index) upperbound(%{{.*}} : index) extent(%{{.*}} : index) stride(%c1{{.*}} : index) startIdx(%c2{{.*}} : index)
+ // CHECK: Bound[0]: %{{.*}} = acc.bounds lowerbound(%c2{{.*}} : index) upperbound(%{{.*}} : index) extent(%{{.*}} : index) stride(%c1{{.*}} : index) startIdx(%c1{{.*}} : index)
// CHECK: Visiting: %{{.*}} = acc.copyin varPtr(%{{.*}} : !fir.ref<!fir.array<10xf32>>) -> !fir.ref<!fir.array<10xf32>> {name = "arr3", structured = false}
// CHECK: Pointer-like and Mappable: !fir.ref<!fir.array<10xf32>>
>From 8e5f953aeaf9523e5998bb83c87c5abbb848d126 Mon Sep 17 00:00:00 2001
From: Kazuaki Matsumura <kmatsumura at nvidia.com>
Date: Wed, 27 Aug 2025 14:29:57 -0700
Subject: [PATCH 2/2] Rework on the fix
---
.../OpenACC/Support/FIROpenACCTypeInterfaces.cpp | 10 +++++-----
flang/test/Fir/OpenACC/openacc-mappable.fir | 13 +++++++++++--
2 files changed, 16 insertions(+), 7 deletions(-)
diff --git a/flang/lib/Optimizer/OpenACC/Support/FIROpenACCTypeInterfaces.cpp b/flang/lib/Optimizer/OpenACC/Support/FIROpenACCTypeInterfaces.cpp
index 9b4db4900258b..c9aff592c95a3 100644
--- a/flang/lib/Optimizer/OpenACC/Support/FIROpenACCTypeInterfaces.cpp
+++ b/flang/lib/Optimizer/OpenACC/Support/FIROpenACCTypeInterfaces.cpp
@@ -243,6 +243,8 @@ generateSeqTyAccBounds(fir::SequenceType seqType, mlir::Value var,
mlir::dyn_cast_if_present<fir::ShapeOp>(shape.getDefiningOp())) {
mlir::Value cummulativeExtent = one;
for (auto extent : shapeOp.getExtents()) {
+ mlir::Value upperbound =
+ mlir::arith::SubIOp::create(builder, loc, extent, one);
mlir::Value stride = one;
if (strideIncludeLowerExtent) {
stride = cummulativeExtent;
@@ -252,7 +254,7 @@ generateSeqTyAccBounds(fir::SequenceType seqType, mlir::Value var,
auto accBound = mlir::acc::DataBoundsOp::create(
builder, loc,
mlir::acc::DataBoundsType::get(builder.getContext()),
- /*lowerbound=*/one, /*upperbound=*/extent,
+ /*lowerbound=*/zero, /*upperbound=*/upperbound,
/*extent=*/extent, /*stride=*/stride, /*strideInBytes=*/false,
/*startIdx=*/one);
accBounds.push_back(accBound);
@@ -269,8 +271,6 @@ generateSeqTyAccBounds(fir::SequenceType seqType, mlir::Value var,
mlir::Value extent = val;
mlir::Value upperbound =
mlir::arith::SubIOp::create(builder, loc, extent, one);
- upperbound = mlir::arith::AddIOp::create(builder, loc, lowerbound,
- upperbound);
mlir::Value stride = one;
if (strideIncludeLowerExtent) {
stride = cummulativeExtent;
@@ -280,9 +280,9 @@ generateSeqTyAccBounds(fir::SequenceType seqType, mlir::Value var,
auto accBound = mlir::acc::DataBoundsOp::create(
builder, loc,
mlir::acc::DataBoundsType::get(builder.getContext()),
- /*lowerbound=*/lowerbound, /*upperbound=*/upperbound,
+ /*lowerbound=*/zero, /*upperbound=*/upperbound,
/*extent=*/extent, /*stride=*/stride, /*strideInBytes=*/false,
- /*startIdx=*/one);
+ /*startIdx=*/lowerbound);
accBounds.push_back(accBound);
}
}
diff --git a/flang/test/Fir/OpenACC/openacc-mappable.fir b/flang/test/Fir/OpenACC/openacc-mappable.fir
index 3535bfaae3c30..eefcb69a410d5 100644
--- a/flang/test/Fir/OpenACC/openacc-mappable.fir
+++ b/flang/test/Fir/OpenACC/openacc-mappable.fir
@@ -62,12 +62,12 @@ module attributes {dlti.dl_spec = #dlti.dl_spec<f16 = dense<16> : vector<2xi64>,
// CHECK: Visiting: %{{.*}} = acc.copyin varPtr(%{{.*}} : !fir.ref<!fir.array<?xf32>>) -> !fir.ref<!fir.array<?xf32>> {name = "arr1", structured = false}
// CHECK: Pointer-like and Mappable: !fir.ref<!fir.array<?xf32>>
// CHECK: Type category: array
- // CHECK: Bound[0]: %{{.*}} = acc.bounds lowerbound(%c1{{.*}} : index) upperbound(%{{.*}} : index) extent(%{{.*}} : index) stride(%c1{{.*}} : index) startIdx(%c1{{.*}} : index)
+ // CHECK: Bound[0]: %{{.*}} = acc.bounds lowerbound(%c0{{.*}} : index) upperbound(%{{.*}} : index) extent(%{{.*}} : index) stride(%c1{{.*}} : index) startIdx(%c1{{.*}} : index)
// CHECK: Visiting: %{{.*}} = acc.copyin varPtr(%{{.*}} : !fir.ref<!fir.array<?xf32>>) -> !fir.ref<!fir.array<?xf32>> {name = "arr2", structured = false}
// CHECK: Pointer-like and Mappable: !fir.ref<!fir.array<?xf32>>
// CHECK: Type category: array
- // CHECK: Bound[0]: %{{.*}} = acc.bounds lowerbound(%c2{{.*}} : index) upperbound(%{{.*}} : index) extent(%{{.*}} : index) stride(%c1{{.*}} : index) startIdx(%c1{{.*}} : index)
+ // CHECK: Bound[0]: %{{.*}} = acc.bounds lowerbound(%c0{{.*}} : index) upperbound(%{{.*}} : index) extent(%{{.*}} : index) stride(%c1{{.*}} : index) startIdx(%c2{{.*}} : index)
// CHECK: Visiting: %{{.*}} = acc.copyin varPtr(%{{.*}} : !fir.ref<!fir.array<10xf32>>) -> !fir.ref<!fir.array<10xf32>> {name = "arr3", structured = false}
// CHECK: Pointer-like and Mappable: !fir.ref<!fir.array<10xf32>>
@@ -75,4 +75,13 @@ module attributes {dlti.dl_spec = #dlti.dl_spec<f16 = dense<16> : vector<2xi64>,
// CHECK: Size: 40
// CHECK: Offset: 0
// CHECK: Bound[0]: %{{.*}} = acc.bounds lowerbound(%c0{{.*}} : index) upperbound(%{{.*}} : index) extent(%c10{{.*}} : index) stride(%c1{{.*}} : index) startIdx(%c1{{.*}} : index)
+
+ // CHECK: acc.copyin
+ // CHECK: acc.copyin
+ // CHECK: fir.shape_shift %c2, %[[EXTENT:.*]] : (index, index) -> !fir.shapeshift<1>
+ // CHECK: acc.copyin
+ // CHECK: %[[SUBI:.*]] = arith.subi %[[EXTENT]], %c1{{.*}} : index
+ // CHECK: %{{.*}} = acc.bounds lowerbound(%c0{{.*}} : index) upperbound(%[[SUBI]] : index) extent(%{{.*}} : index) stride(%c1{{.*}} : index) startIdx(%c2{{.*}} : index)
+ // CHECK: acc.copyin
+ // CHECK: acc.copyin
}
More information about the flang-commits
mailing list