@@ -5254,17 +5254,21 @@ static mlir::ParseResult parseSpecifierList(
52545254 if (failed (parser.parseLParen ()))
52555255 return mlir::failure ();
52565256
5257+ llvm::SmallVector<bool > isByRefVec;
52575258 llvm::SmallVector<mlir::SymbolRefAttr> spceifierSymbolVec;
52585259 llvm::SmallVector<fir::ReduceAttr> attributes;
52595260
52605261 if (failed (parser.parseCommaSeparatedList ([&]() {
5262+ if (isReduce)
5263+ isByRefVec.push_back (
5264+ parser.parseOptionalKeyword (" byref" ).succeeded ());
5265+
52615266 if (failed (parser.parseAttribute (spceifierSymbolVec.emplace_back ())))
52625267 return mlir::failure ();
52635268
52645269 if (isReduce &&
5265- failed (parser.parseAttribute (attributes.emplace_back ()))) {
5270+ failed (parser.parseAttribute (attributes.emplace_back ())))
52665271 return mlir::failure ();
5267- }
52685272
52695273 if (parser.parseOperand (specifierOperands.emplace_back ()) ||
52705274 parser.parseArrow () ||
@@ -5301,6 +5305,13 @@ static mlir::ParseResult parseSpecifierList(
53015305 std::get<1 >(operandType), result.operands ))
53025306 return mlir::failure ();
53035307
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+
53045315 llvm::SmallVector<mlir::Attribute> symbolAttrs (spceifierSymbolVec.begin (),
53055316 spceifierSymbolVec.end ());
53065317 result.addAttribute (symsAttrName, builder.getArrayAttr (symbolAttrs));
@@ -5411,11 +5422,15 @@ void fir::DoConcurrentLoopOp::print(mlir::OpAsmPrinter &p) {
54115422 if (!getReduceVars ().empty ()) {
54125423 p << " reduce(" ;
54135424 llvm::interleaveComma (
5414- llvm::zip_equal (getReduceSymsAttr (), getReduceAttrsAttr (),
5415- getReduceVars (), getRegionReduceArgs ()),
5425+ llvm::zip_equal (getReduceByrefAttr ().asArrayRef (), getReduceSymsAttr (),
5426+ getReduceAttrsAttr (), getReduceVars (),
5427+ getRegionReduceArgs ()),
54165428 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);
54195434 });
54205435 p << " : " ;
54215436 llvm::interleaveComma (getReduceVars (), p,
0 commit comments