@@ -5254,17 +5254,21 @@ static mlir::ParseResult parseSpecifierList(
5254
5254
if (failed (parser.parseLParen ()))
5255
5255
return mlir::failure ();
5256
5256
5257
+ llvm::SmallVector<bool > isByRefVec;
5257
5258
llvm::SmallVector<mlir::SymbolRefAttr> spceifierSymbolVec;
5258
5259
llvm::SmallVector<fir::ReduceAttr> attributes;
5259
5260
5260
5261
if (failed (parser.parseCommaSeparatedList ([&]() {
5262
+ if (isReduce)
5263
+ isByRefVec.push_back (
5264
+ parser.parseOptionalKeyword (" byref" ).succeeded ());
5265
+
5261
5266
if (failed (parser.parseAttribute (spceifierSymbolVec.emplace_back ())))
5262
5267
return mlir::failure ();
5263
5268
5264
5269
if (isReduce &&
5265
- failed (parser.parseAttribute (attributes.emplace_back ()))) {
5270
+ failed (parser.parseAttribute (attributes.emplace_back ())))
5266
5271
return mlir::failure ();
5267
- }
5268
5272
5269
5273
if (parser.parseOperand (specifierOperands.emplace_back ()) ||
5270
5274
parser.parseArrow () ||
@@ -5301,6 +5305,13 @@ static mlir::ParseResult parseSpecifierList(
5301
5305
std::get<1 >(operandType), result.operands ))
5302
5306
return mlir::failure ();
5303
5307
5308
+ if (isReduce)
5309
+ result.addAttribute (
5310
+ fir::DoConcurrentLoopOp::getReduceByrefAttrName (result.name ),
5311
+ isByRefVec.empty ()
5312
+ ? nullptr
5313
+ : mlir::DenseBoolArrayAttr::get (builder.getContext (), isByRefVec));
5314
+
5304
5315
llvm::SmallVector<mlir::Attribute> symbolAttrs (spceifierSymbolVec.begin (),
5305
5316
spceifierSymbolVec.end ());
5306
5317
result.addAttribute (symsAttrName, builder.getArrayAttr (symbolAttrs));
@@ -5411,11 +5422,15 @@ void fir::DoConcurrentLoopOp::print(mlir::OpAsmPrinter &p) {
5411
5422
if (!getReduceVars ().empty ()) {
5412
5423
p << " reduce(" ;
5413
5424
llvm::interleaveComma (
5414
- llvm::zip_equal (getReduceSymsAttr (), getReduceAttrsAttr (),
5415
- getReduceVars (), getRegionReduceArgs ()),
5425
+ llvm::zip_equal (getReduceByrefAttr ().asArrayRef (), getReduceSymsAttr (),
5426
+ getReduceAttrsAttr (), getReduceVars (),
5427
+ getRegionReduceArgs ()),
5416
5428
p, [&](auto it) {
5417
- p << std::get<0 >(it) << " " << std::get<1 >(it) << " "
5418
- << std::get<2 >(it) << " -> " << std::get<3 >(it);
5429
+ if (std::get<0 >(it))
5430
+ p << " byref " ;
5431
+
5432
+ p << std::get<1 >(it) << " " << std::get<2 >(it) << " "
5433
+ << std::get<3 >(it) << " -> " << std::get<4 >(it);
5419
5434
});
5420
5435
p << " : " ;
5421
5436
llvm::interleaveComma (getReduceVars (), p,
0 commit comments