[Mlir-commits] [mlir] [mlir][SCF] `scf.parallel`: Make reductions part of the terminator (PR #75314)
Ivan Butygin
llvmlistbot at llvm.org
Sat Dec 16 14:01:38 PST 2023
================
@@ -3008,81 +3004,64 @@ void ParallelOp::getSuccessorRegions(
// ReduceOp
//===----------------------------------------------------------------------===//
-void ReduceOp::build(
- OpBuilder &builder, OperationState &result, Value operand,
- function_ref<void(OpBuilder &, Location, Value, Value)> bodyBuilderFn) {
- auto type = operand.getType();
- result.addOperands(operand);
+void ReduceOp::build(OpBuilder &builder, OperationState &result) {}
- OpBuilder::InsertionGuard guard(builder);
- Region *bodyRegion = result.addRegion();
- Block *body = builder.createBlock(bodyRegion, {}, ArrayRef<Type>{type, type},
- {result.location, result.location});
- if (bodyBuilderFn)
- bodyBuilderFn(builder, result.location, body->getArgument(0),
- body->getArgument(1));
+void ReduceOp::build(OpBuilder &builder, OperationState &result,
+ ValueRange operands) {
+ result.addOperands(operands);
+ for (Value v : operands) {
+ OpBuilder::InsertionGuard guard(builder);
+ Region *bodyRegion = result.addRegion();
+ builder.createBlock(bodyRegion, {},
+ ArrayRef<Type>{v.getType(), v.getType()},
+ {result.location, result.location});
+ }
}
LogicalResult ReduceOp::verifyRegions() {
- // The region of a ReduceOp has two arguments of the same type as its operand.
- auto type = getOperand().getType();
- Block &block = getReductionOperator().front();
- if (block.empty())
- return emitOpError("the block inside reduce should not be empty");
- if (block.getNumArguments() != 2 ||
- llvm::any_of(block.getArguments(), [&](const BlockArgument &arg) {
- return arg.getType() != type;
- }))
- return emitOpError() << "expects two arguments to reduce block of type "
- << type;
-
- // Check that the block is terminated by a ReduceReturnOp.
- if (!isa<ReduceReturnOp>(block.getTerminator()))
- return emitOpError("the block inside reduce should be terminated with a "
- "'scf.reduce.return' op");
-
- return success();
-}
-
-ParseResult ReduceOp::parse(OpAsmParser &parser, OperationState &result) {
- // Parse an opening `(` followed by the reduced value followed by `)`
- OpAsmParser::UnresolvedOperand operand;
- if (parser.parseLParen() || parser.parseOperand(operand) ||
- parser.parseRParen())
- return failure();
-
- Type resultType;
- // Parse the type of the operand (and also what reduce computes on).
- if (parser.parseColonType(resultType) ||
- parser.resolveOperand(operand, resultType, result.operands))
- return failure();
-
- // Now parse the body.
- Region *body = result.addRegion();
- if (parser.parseRegion(*body, /*arguments=*/{}, /*argTypes=*/{}))
- return failure();
+ // The region of a ReduceOp has two arguments of the same type as its operand
----------------
Hardcode84 wrote:
typo: its ~~operand~~ corresponding operand.
https://github.com/llvm/llvm-project/pull/75314
More information about the Mlir-commits
mailing list