Skip to content

Commit 9365ed1

Browse files
authored
[flang][openacc] Add ability to link acc.declare_enter with acc.declare_exit ops (#72476)
1 parent c6f7b63 commit 9365ed1

File tree

5 files changed

+64
-36
lines changed

5 files changed

+64
-36
lines changed

flang/lib/Lower/OpenACC.cpp

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,8 @@ static void createDeclareAllocFuncWithArg(mlir::OpBuilder &modBuilder,
163163
builder, loc, boxAddrOp.getResult(), asFortran, bounds,
164164
/*structured=*/false, /*implicit=*/false, clause, boxAddrOp.getType());
165165
builder.create<mlir::acc::DeclareEnterOp>(
166-
loc, mlir::ValueRange(entryOp.getAccPtr()));
166+
loc, mlir::acc::DeclareTokenType::get(entryOp.getContext()),
167+
mlir::ValueRange(entryOp.getAccPtr()));
167168

168169
modBuilder.setInsertionPointAfter(registerFuncOp);
169170
builder.restoreInsertionPoint(crtInsPt);
@@ -195,7 +196,7 @@ static void createDeclareDeallocFuncWithArg(
195196
/*structured=*/false, /*implicit=*/false, clause,
196197
boxAddrOp.getType());
197198
builder.create<mlir::acc::DeclareExitOp>(
198-
loc, mlir::ValueRange(entryOp.getAccPtr()));
199+
loc, mlir::Value{}, mlir::ValueRange(entryOp.getAccPtr()));
199200

200201
mlir::Value varPtr;
201202
if constexpr (std::is_same_v<ExitOp, mlir::acc::CopyoutOp> ||
@@ -2762,7 +2763,13 @@ static void createDeclareGlobalOp(mlir::OpBuilder &modBuilder,
27622763
EntryOp entryOp = createDataEntryOp<EntryOp>(
27632764
builder, loc, addrOp.getResTy(), asFortran, bounds,
27642765
/*structured=*/false, implicit, clause, addrOp.getResTy().getType());
2765-
builder.create<DeclareOp>(loc, mlir::ValueRange(entryOp.getAccPtr()));
2766+
if constexpr (std::is_same_v<DeclareOp, mlir::acc::DeclareEnterOp>)
2767+
builder.create<DeclareOp>(
2768+
loc, mlir::acc::DeclareTokenType::get(entryOp.getContext()),
2769+
mlir::ValueRange(entryOp.getAccPtr()));
2770+
else
2771+
builder.create<DeclareOp>(loc, mlir::Value{},
2772+
mlir::ValueRange(entryOp.getAccPtr()));
27662773
mlir::Value varPtr;
27672774
if constexpr (std::is_same_v<GlobalOp, mlir::acc::GlobalDestructorOp>) {
27682775
builder.create<ExitOp>(entryOp.getLoc(), entryOp.getAccPtr(), varPtr,
@@ -2812,7 +2819,8 @@ static void createDeclareAllocFunc(mlir::OpBuilder &modBuilder,
28122819
builder, loc, boxAddrOp.getResult(), asFortran, bounds,
28132820
/*structured=*/false, /*implicit=*/false, clause, boxAddrOp.getType());
28142821
builder.create<mlir::acc::DeclareEnterOp>(
2815-
loc, mlir::ValueRange(entryOp.getAccPtr()));
2822+
loc, mlir::acc::DeclareTokenType::get(entryOp.getContext()),
2823+
mlir::ValueRange(entryOp.getAccPtr()));
28162824

28172825
modBuilder.setInsertionPointAfter(registerFuncOp);
28182826
}
@@ -2850,7 +2858,7 @@ static void createDeclareDeallocFunc(mlir::OpBuilder &modBuilder,
28502858
boxAddrOp.getType());
28512859

28522860
builder.create<mlir::acc::DeclareExitOp>(
2853-
loc, mlir::ValueRange(entryOp.getAccPtr()));
2861+
loc, mlir::Value{}, mlir::ValueRange(entryOp.getAccPtr()));
28542862

28552863
mlir::Value varPtr;
28562864
if constexpr (std::is_same_v<ExitOp, mlir::acc::CopyoutOp> ||
@@ -3092,34 +3100,37 @@ genDeclareInFunction(Fortran::lower::AbstractConverter &converter,
30923100

30933101
mlir::func::FuncOp funcOp = builder.getFunction();
30943102
auto ops = funcOp.getOps<mlir::acc::DeclareEnterOp>();
3103+
mlir::Value declareToken;
30953104
if (ops.empty()) {
3096-
builder.create<mlir::acc::DeclareEnterOp>(loc, dataClauseOperands);
3105+
declareToken = builder.create<mlir::acc::DeclareEnterOp>(
3106+
loc, mlir::acc::DeclareTokenType::get(builder.getContext()),
3107+
dataClauseOperands);
30973108
} else {
30983109
auto declareOp = *ops.begin();
30993110
auto newDeclareOp = builder.create<mlir::acc::DeclareEnterOp>(
3100-
loc, declareOp.getDataClauseOperands());
3111+
loc, mlir::acc::DeclareTokenType::get(builder.getContext()),
3112+
declareOp.getDataClauseOperands());
31013113
newDeclareOp.getDataClauseOperandsMutable().append(dataClauseOperands);
3114+
declareToken = newDeclareOp.getToken();
31023115
declareOp.erase();
31033116
}
31043117

31053118
openAccCtx.attachCleanup([&builder, loc, createEntryOperands,
31063119
copyEntryOperands, copyoutEntryOperands,
3107-
deviceResidentEntryOperands]() {
3120+
deviceResidentEntryOperands, declareToken]() {
31083121
llvm::SmallVector<mlir::Value> operands;
31093122
operands.append(createEntryOperands);
31103123
operands.append(deviceResidentEntryOperands);
31113124
operands.append(copyEntryOperands);
31123125
operands.append(copyoutEntryOperands);
31133126

3114-
if (!operands.empty()) {
3115-
mlir::func::FuncOp funcOp = builder.getFunction();
3116-
auto ops = funcOp.getOps<mlir::acc::DeclareExitOp>();
3117-
if (ops.empty()) {
3118-
builder.create<mlir::acc::DeclareExitOp>(loc, operands);
3119-
} else {
3120-
auto declareOp = *ops.begin();
3121-
declareOp.getDataClauseOperandsMutable().append(operands);
3122-
}
3127+
mlir::func::FuncOp funcOp = builder.getFunction();
3128+
auto ops = funcOp.getOps<mlir::acc::DeclareExitOp>();
3129+
if (ops.empty()) {
3130+
builder.create<mlir::acc::DeclareExitOp>(loc, declareToken, operands);
3131+
} else {
3132+
auto declareOp = *ops.begin();
3133+
declareOp.getDataClauseOperandsMutable().append(operands);
31233134
}
31243135

31253136
genDataExitOperations<mlir::acc::CreateOp, mlir::acc::DeleteOp>(

flang/test/Lower/OpenACC/HLFIR/acc-declare.f90

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@ subroutine acc_declare_copy()
2424
! ALL: %[[BOUND:.*]] = acc.bounds lowerbound(%{{.*}} : index) upperbound(%{{.*}} : index) extent(%{{.*}} : index) stride(%[[C1]] : index) startIdx(%[[C1]] : index)
2525
! FIR: %[[COPYIN:.*]] = acc.copyin varPtr(%[[DECL]] : !fir.ref<!fir.array<100xi32>>) bounds(%[[BOUND]]) -> !fir.ref<!fir.array<100xi32>> {dataClause = #acc<data_clause acc_copy>, name = "a"}
2626
! HLFIR: %[[COPYIN:.*]] = acc.copyin varPtr(%[[DECL]]#1 : !fir.ref<!fir.array<100xi32>>) bounds(%[[BOUND]]) -> !fir.ref<!fir.array<100xi32>> {dataClause = #acc<data_clause acc_copy>, name = "a"}
27-
! ALL: acc.declare_enter dataOperands(%[[COPYIN]] : !fir.ref<!fir.array<100xi32>>)
27+
! ALL: %[[TOKEN:.*]] = acc.declare_enter dataOperands(%[[COPYIN]] : !fir.ref<!fir.array<100xi32>>)
2828

2929
! ALL: %{{.*}}:2 = fir.do_loop %{{.*}} = %{{.*}} to %{{.*}} step %{{.*}} iter_args(%{{.*}} = %{{.*}}) -> (index, i32) {
3030
! ALL: }
31-
! ALL: acc.declare_exit dataOperands(%[[COPYIN]] : !fir.ref<!fir.array<100xi32>>)
31+
! ALL: acc.declare_exit token(%[[TOKEN]]) dataOperands(%[[COPYIN]] : !fir.ref<!fir.array<100xi32>>)
3232
! FIR: acc.copyout accPtr(%[[COPYIN]] : !fir.ref<!fir.array<100xi32>>) bounds(%[[BOUND]]) to varPtr(%[[DECL]] : !fir.ref<!fir.array<100xi32>>) {dataClause = #acc<data_clause acc_copy>, name = "a"}
3333
! HLFIR: acc.copyout accPtr(%[[COPYIN]] : !fir.ref<!fir.array<100xi32>>) bounds(%[[BOUND]]) to varPtr(%[[DECL]]#1 : !fir.ref<!fir.array<100xi32>>) {dataClause = #acc<data_clause acc_copy>, name = "a"}
3434

@@ -51,11 +51,11 @@ subroutine acc_declare_create()
5151
! ALL: %[[BOUND:.*]] = acc.bounds lowerbound(%{{.*}} : index) upperbound(%{{.*}} : index) extent(%{{.*}} : index) stride(%[[C1]] : index) startIdx(%[[C1]] : index)
5252
! FIR: %[[CREATE:.*]] = acc.create varPtr(%[[DECL]] : !fir.ref<!fir.array<100xi32>>) bounds(%[[BOUND]]) -> !fir.ref<!fir.array<100xi32>> {name = "a"}
5353
! HLFIR: %[[CREATE:.*]] = acc.create varPtr(%[[DECL]]#1 : !fir.ref<!fir.array<100xi32>>) bounds(%[[BOUND]]) -> !fir.ref<!fir.array<100xi32>> {name = "a"}
54-
! ALL: acc.declare_enter dataOperands(%[[CREATE]] : !fir.ref<!fir.array<100xi32>>)
54+
! ALL: %[[TOKEN:.*]] = acc.declare_enter dataOperands(%[[CREATE]] : !fir.ref<!fir.array<100xi32>>)
5555

5656
! ALL: %{{.*}}:2 = fir.do_loop %{{.*}} = %{{.*}} to %{{.*}} step %{{.*}} iter_args(%{{.*}} = %{{.*}}) -> (index, i32) {
5757
! ALL: }
58-
! ALL: acc.declare_exit dataOperands(%[[CREATE]] : !fir.ref<!fir.array<100xi32>>)
58+
! ALL: acc.declare_exit token(%[[TOKEN]]) dataOperands(%[[CREATE]] : !fir.ref<!fir.array<100xi32>>)
5959
! ALL: acc.delete accPtr(%[[CREATE]] : !fir.ref<!fir.array<100xi32>>) bounds(%[[BOUND]]) {dataClause = #acc<data_clause acc_create>, name = "a"}
6060
! ALL: return
6161

@@ -119,10 +119,10 @@ subroutine acc_declare_copyout()
119119
! HLFIR: %[[ADECL:.*]]:2 = hlfir.declare %[[A]](%{{.*}}) {acc.declare = #acc.declare<dataClause = acc_copyout>, uniq_name = "_QMacc_declareFacc_declare_copyoutEa"} : (!fir.ref<!fir.array<100xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<100xi32>>, !fir.ref<!fir.array<100xi32>>)
120120
! FIR: %[[CREATE:.*]] = acc.create varPtr(%[[ADECL]] : !fir.ref<!fir.array<100xi32>>) bounds(%{{.*}}) -> !fir.ref<!fir.array<100xi32>> {dataClause = #acc<data_clause acc_copyout>, name = "a"}
121121
! HLFIR: %[[CREATE:.*]] = acc.create varPtr(%[[ADECL]]#1 : !fir.ref<!fir.array<100xi32>>) bounds(%{{.*}}) -> !fir.ref<!fir.array<100xi32>> {dataClause = #acc<data_clause acc_copyout>, name = "a"}
122-
! ALL: acc.declare_enter dataOperands(%[[CREATE]] : !fir.ref<!fir.array<100xi32>>)
122+
! ALL: %[[TOKEN:.*]] = acc.declare_enter dataOperands(%[[CREATE]] : !fir.ref<!fir.array<100xi32>>)
123123
! ALL: %{{.*}}:2 = fir.do_loop %{{.*}} = %{{.*}} to %{{.*}} step %{{.*}} iter_args(%arg{{.*}} = %{{.*}}) -> (index, i32)
124124

125-
! ALL: acc.declare_exit dataOperands(%[[CREATE]] : !fir.ref<!fir.array<100xi32>>)
125+
! ALL: acc.declare_exit token(%[[TOKEN]]) dataOperands(%[[CREATE]] : !fir.ref<!fir.array<100xi32>>)
126126
! FIR: acc.copyout accPtr(%[[CREATE]] : !fir.ref<!fir.array<100xi32>>) bounds(%{{.*}}) to varPtr(%[[ADECL]] : !fir.ref<!fir.array<100xi32>>) {name = "a"}
127127
! HLFIR: acc.copyout accPtr(%[[CREATE]] : !fir.ref<!fir.array<100xi32>>) bounds(%{{.*}}) to varPtr(%[[ADECL]]#1 : !fir.ref<!fir.array<100xi32>>) {name = "a"}
128128
! ALL: return
@@ -178,9 +178,9 @@ subroutine acc_declare_device_resident(a)
178178
! HLFIR: %[[DECL:.*]]:2 = hlfir.declare %[[ARG0]](%{{.*}}) {acc.declare = #acc.declare<dataClause = acc_declare_device_resident>, uniq_name = "_QMacc_declareFacc_declare_device_residentEa"} : (!fir.ref<!fir.array<100xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<100xi32>>, !fir.ref<!fir.array<100xi32>>)
179179
! FIR: %[[DEVICERES:.*]] = acc.declare_device_resident varPtr(%[[DECL]] : !fir.ref<!fir.array<100xi32>>) bounds(%{{.*}}) -> !fir.ref<!fir.array<100xi32>> {name = "a"}
180180
! HLFIR: %[[DEVICERES:.*]] = acc.declare_device_resident varPtr(%[[DECL]]#1 : !fir.ref<!fir.array<100xi32>>) bounds(%{{.*}}) -> !fir.ref<!fir.array<100xi32>> {name = "a"}
181-
! ALL: acc.declare_enter dataOperands(%[[DEVICERES]] : !fir.ref<!fir.array<100xi32>>)
181+
! ALL: %[[TOKEN:.*]] = acc.declare_enter dataOperands(%[[DEVICERES]] : !fir.ref<!fir.array<100xi32>>)
182182
! ALL: %{{.*}}:2 = fir.do_loop %{{.*}} = %{{.*}} to %{{.*}} step %{{.*}} iter_args(%arg{{.*}} = %{{.*}}) -> (index, i32)
183-
! ALL: acc.declare_exit dataOperands(%[[DEVICERES]] : !fir.ref<!fir.array<100xi32>>)
183+
! ALL: acc.declare_exit token(%[[TOKEN]]) dataOperands(%[[DEVICERES]] : !fir.ref<!fir.array<100xi32>>)
184184
! ALL: acc.delete accPtr(%[[DEVICERES]] : !fir.ref<!fir.array<100xi32>>) bounds(%{{.*}}) {dataClause = #acc<data_clause acc_declare_device_resident>, name = "a"}
185185

186186
subroutine acc_declare_device_resident2()
@@ -195,8 +195,8 @@ subroutine acc_declare_device_resident2()
195195
! HLFIR: %[[DECL:.*]]:2 = hlfir.declare %[[ALLOCA]](%{{.*}}) {acc.declare = #acc.declare<dataClause = acc_declare_device_resident>, uniq_name = "_QMacc_declareFacc_declare_device_resident2Edataparam"} : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<100xf32>>, !fir.ref<!fir.array<100xf32>>)
196196
! FIR: %[[DEVICERES:.*]] = acc.declare_device_resident varPtr(%[[DECL]] : !fir.ref<!fir.array<100xf32>>) bounds(%{{.*}}) -> !fir.ref<!fir.array<100xf32>> {name = "dataparam"}
197197
! HLFIR: %[[DEVICERES:.*]] = acc.declare_device_resident varPtr(%[[DECL]]#1 : !fir.ref<!fir.array<100xf32>>) bounds(%{{.*}}) -> !fir.ref<!fir.array<100xf32>> {name = "dataparam"}
198-
! ALL: acc.declare_enter dataOperands(%[[DEVICERES]] : !fir.ref<!fir.array<100xf32>>)
199-
! ALL: acc.declare_exit dataOperands(%[[DEVICERES]] : !fir.ref<!fir.array<100xf32>>)
198+
! ALL: %[[TOKEN:.*]] = acc.declare_enter dataOperands(%[[DEVICERES]] : !fir.ref<!fir.array<100xf32>>)
199+
! ALL: acc.declare_exit token(%[[TOKEN]]) dataOperands(%[[DEVICERES]] : !fir.ref<!fir.array<100xf32>>)
200200
! ALL: acc.delete accPtr(%[[DEVICERES]] : !fir.ref<!fir.array<100xf32>>) bounds(%{{.*}}) {dataClause = #acc<data_clause acc_declare_device_resident>, name = "dataparam"}
201201

202202
subroutine acc_declare_link2()
@@ -234,10 +234,10 @@ function acc_declare_in_func()
234234

235235
! ALL-LABEL: func.func @_QMacc_declarePacc_declare_in_func() -> f32 {
236236
! HLFIR: %[[DEVICE_RESIDENT:.*]] = acc.declare_device_resident varPtr(%{{.*}}#1 : !fir.ref<!fir.array<1024xf32>>) bounds(%{{.*}}) -> !fir.ref<!fir.array<1024xf32>> {name = "a"}
237-
! HLFIR: acc.declare_enter dataOperands(%[[DEVICE_RESIDENT]] : !fir.ref<!fir.array<1024xf32>>)
237+
! HLFIR: %[[TOKEN:.*]] = acc.declare_enter dataOperands(%[[DEVICE_RESIDENT]] : !fir.ref<!fir.array<1024xf32>>)
238238

239239
! HLFIR: %[[LOAD:.*]] = fir.load %{{.*}}#1 : !fir.ref<f32>
240-
! HLFIR: acc.declare_exit dataOperands(%[[DEVICE_RESIDENT]] : !fir.ref<!fir.array<1024xf32>>)
240+
! HLFIR: acc.declare_exit token(%[[TOKEN]]) dataOperands(%[[DEVICE_RESIDENT]] : !fir.ref<!fir.array<1024xf32>>)
241241
! HLFIR: acc.delete accPtr(%[[DEVICE_RESIDENT]] : !fir.ref<!fir.array<1024xf32>>) bounds(%6) {dataClause = #acc<data_clause acc_declare_device_resident>, name = "a"}
242242
! HLFIR: return %[[LOAD]] : f32
243243
! ALL: }
@@ -254,10 +254,10 @@ function acc_declare_in_func2(i)
254254
! HLFIR: %[[ALLOCA_A:.*]] = fir.alloca !fir.array<1024xf32> {bindc_name = "a", uniq_name = "_QMacc_declareFacc_declare_in_func2Ea"}
255255
! HLFIR: %[[DECL_A:.*]]:2 = hlfir.declare %[[ALLOCA_A]](%{{.*}}) {acc.declare = #acc.declare<dataClause = acc_create>, uniq_name = "_QMacc_declareFacc_declare_in_func2Ea"} : (!fir.ref<!fir.array<1024xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<1024xf32>>, !fir.ref<!fir.array<1024xf32>>)
256256
! HLFIR: %[[CREATE:.*]] = acc.create varPtr(%[[DECL_A]]#1 : !fir.ref<!fir.array<1024xf32>>) bounds(%7) -> !fir.ref<!fir.array<1024xf32>> {name = "a"}
257-
! HLFIR: acc.declare_enter dataOperands(%[[CREATE]] : !fir.ref<!fir.array<1024xf32>>)
257+
! HLFIR: %[[TOKEN:.*]] = acc.declare_enter dataOperands(%[[CREATE]] : !fir.ref<!fir.array<1024xf32>>)
258258
! HLFIR: cf.br ^bb1
259259
! HLFIR: ^bb1:
260-
! HLFIR: acc.declare_exit dataOperands(%[[CREATE]] : !fir.ref<!fir.array<1024xf32>>)
260+
! HLFIR: acc.declare_exit token(%[[TOKEN]]) dataOperands(%[[CREATE]] : !fir.ref<!fir.array<1024xf32>>)
261261
! HLFIR: acc.delete accPtr(%[[CREATE]] : !fir.ref<!fir.array<1024xf32>>) bounds(%7) {dataClause = #acc<data_clause acc_create>, name = "a"}
262262
! ALL: return %{{.*}} : f32
263263
! ALL: }

mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1430,6 +1430,7 @@ def OpenACC_DeclareEnterOp : OpenACC_Op<"declare_enter", []> {
14301430
}];
14311431

14321432
let arguments = (ins Variadic<OpenACC_PointerLikeTypeInterface>:$dataClauseOperands);
1433+
let results = (outs OpenACC_DeclareTokenType:$token);
14331434

14341435
let assemblyFormat = [{
14351436
oilist(
@@ -1441,7 +1442,7 @@ def OpenACC_DeclareEnterOp : OpenACC_Op<"declare_enter", []> {
14411442
let hasVerifier = 1;
14421443
}
14431444

1444-
def OpenACC_DeclareExitOp : OpenACC_Op<"declare_exit", []> {
1445+
def OpenACC_DeclareExitOp : OpenACC_Op<"declare_exit", [AttrSizedOperandSegments]> {
14451446
let summary = "declare directive - exit from implicit data region";
14461447

14471448
let description = [{
@@ -1458,10 +1459,13 @@ def OpenACC_DeclareExitOp : OpenACC_Op<"declare_exit", []> {
14581459
```
14591460
}];
14601461

1461-
let arguments = (ins Variadic<OpenACC_PointerLikeTypeInterface>:$dataClauseOperands);
1462+
let arguments = (ins
1463+
Optional<OpenACC_DeclareTokenType>:$token,
1464+
Variadic<OpenACC_PointerLikeTypeInterface>:$dataClauseOperands);
14621465

14631466
let assemblyFormat = [{
14641467
oilist(
1468+
`token` `(` $token `)` |
14651469
`dataOperands` `(` $dataClauseOperands `:` type($dataClauseOperands) `)`
14661470
)
14671471
attr-dict-with-keyword

mlir/include/mlir/Dialect/OpenACC/OpenACCOpsTypes.td

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,13 @@ def OpenACC_DataBoundsType : OpenACC_Type<"DataBounds", "data_bounds_ty"> {
2424
let summary = "Type for representing acc data clause bounds information";
2525
}
2626

27+
def OpenACC_DeclareTokenType : OpenACC_Type<"DeclareToken", "declare_token"> {
28+
let summary = "declare token type";
29+
let description = [{
30+
`acc.declare_token` is a type returned by a `declare_enter` operation and
31+
can be passed to a `declare_exit` operation to represent an implicit
32+
data region.
33+
}];
34+
}
35+
2736
#endif // OPENACC_OPS_TYPES

mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1087,9 +1087,10 @@ LogicalResult AtomicCaptureOp::verifyRegions() { return verifyRegionsCommon(); }
10871087
//===----------------------------------------------------------------------===//
10881088

10891089
template <typename Op>
1090-
static LogicalResult checkDeclareOperands(Op &op,
1091-
const mlir::ValueRange &operands) {
1092-
if (operands.empty())
1090+
static LogicalResult
1091+
checkDeclareOperands(Op &op, const mlir::ValueRange &operands,
1092+
bool requireAtLeastOneOperand = true) {
1093+
if (operands.empty() && requireAtLeastOneOperand)
10931094
return emitError(
10941095
op->getLoc(),
10951096
"at least one operand must appear on the declare operation");
@@ -1151,6 +1152,9 @@ LogicalResult acc::DeclareEnterOp::verify() {
11511152
//===----------------------------------------------------------------------===//
11521153

11531154
LogicalResult acc::DeclareExitOp::verify() {
1155+
if (getToken())
1156+
return checkDeclareOperands(*this, this->getDataClauseOperands(),
1157+
/*requireAtLeastOneOperand=*/false);
11541158
return checkDeclareOperands(*this, this->getDataClauseOperands());
11551159
}
11561160

0 commit comments

Comments
 (0)