@@ -989,8 +989,9 @@ void ParallelOp::build(OpBuilder &builder, OperationState &state,
989989 ParallelOp::build (
990990 builder, state, /* if_expr_var=*/ nullptr , /* num_threads_var=*/ nullptr ,
991991 /* allocate_vars=*/ ValueRange (), /* allocators_vars=*/ ValueRange (),
992- /* reduction_vars=*/ ValueRange (), /* reductions=*/ nullptr ,
993- /* proc_bind_val=*/ nullptr );
992+ /* reduction_vars=*/ ValueRange (), /* private_vars=*/ ValueRange (),
993+ /* reductions=*/ nullptr ,
994+ /* proc_bind_val=*/ nullptr , /* private_inits*/ nullptr );
994995 state.addAttributes (attributes);
995996}
996997
@@ -1607,6 +1608,84 @@ void PrivateClauseOp::build(OpBuilder &odsBuilder, OperationState &odsState,
16071608 SmallVector<Location>(1 , odsState.location ));
16081609}
16091610
1611+ static ParseResult parsePrivateVarList (
1612+ OpAsmParser &parser,
1613+ llvm::SmallVector<OpAsmParser::UnresolvedOperand, 4 > &privateVarsOperands,
1614+ llvm::SmallVector<Type, 1 > &privateVarsTypes, ArrayAttr &privateInitsAttr) {
1615+ SymbolRefAttr privatizerSym;
1616+ OpAsmParser::UnresolvedOperand arg;
1617+ OpAsmParser::UnresolvedOperand blockArg;
1618+ Type argType;
1619+
1620+ SmallVector<SymbolRefAttr> privateInitsVec;
1621+
1622+ auto parsePrivatizers = [&]() -> ParseResult {
1623+ if (parser.parseAttribute (privatizerSym) || parser.parseOperand (arg) ||
1624+ parser.parseArrow () || parser.parseOperand (blockArg)) {
1625+ return failure ();
1626+ }
1627+
1628+ privateInitsVec.push_back (privatizerSym);
1629+ privateVarsOperands.push_back (arg);
1630+ return success ();
1631+ };
1632+
1633+ auto parseTypes = [&]() -> ParseResult {
1634+ if (parser.parseType (argType))
1635+ return failure ();
1636+ privateVarsTypes.push_back (argType);
1637+ return success ();
1638+ };
1639+
1640+ if (parser.parseCommaSeparatedList (parsePrivatizers))
1641+ return failure ();
1642+
1643+ SmallVector<Attribute> privateInits (privateInitsVec.begin (),
1644+ privateInitsVec.end ());
1645+ privateInitsAttr = ArrayAttr::get (parser.getContext (), privateInits);
1646+
1647+ if (parser.parseColon ())
1648+ return failure ();
1649+
1650+ if (parser.parseCommaSeparatedList (parseTypes))
1651+ return failure ();
1652+
1653+ return success ();
1654+ }
1655+
1656+ static void printPrivateVarList (OpAsmPrinter &printer, Operation *op,
1657+ OperandRange privateVars,
1658+ TypeRange privateVarTypes,
1659+ std::optional<ArrayAttr> privateInitsAttr) {
1660+ auto ®ion = op->getRegion (0 );
1661+ unsigned argIndex = 0 ;
1662+ assert (privateVars.size () == privateVarTypes.size () &&
1663+ ((privateVars.empty ()) ||
1664+ (*privateInitsAttr &&
1665+ (privateInitsAttr->size () == privateVars.size ()))));
1666+
1667+ for (const auto &privateVar : privateVars) {
1668+ assert (privateInitsAttr);
1669+ const auto &blockArg = region.front ().getArgument (argIndex);
1670+ const auto &privateInitSym = (*privateInitsAttr)[argIndex];
1671+ printer << privateInitSym << " " << privateVar << " -> " << blockArg;
1672+
1673+ argIndex++;
1674+ if (argIndex < privateVars.size ())
1675+ printer << " , " ;
1676+ }
1677+
1678+ printer << " : " ;
1679+
1680+ argIndex = 0 ;
1681+ for (const auto &mapType : privateVarTypes) {
1682+ printer << mapType;
1683+ argIndex++;
1684+ if (argIndex < privateVarTypes.size ())
1685+ printer << " , " ;
1686+ }
1687+ }
1688+
16101689#define GET_ATTRDEF_CLASSES
16111690#include " mlir/Dialect/OpenMP/OpenMPOpsAttributes.cpp.inc"
16121691
0 commit comments