forked from OSchip/llvm-project
[mlir] Custom printing/parsing for Shape::AssumingOp
Summary: Additionally, this adds traits and builder methods to AssumingYieldOp and names the input witness to the AssumingOp. Differential Revision: https://reviews.llvm.org/D80187
This commit is contained in:
parent
44226c1fea
commit
fb6986ef69
|
@ -17,6 +17,7 @@
|
||||||
#include "mlir/IR/Dialect.h"
|
#include "mlir/IR/Dialect.h"
|
||||||
#include "mlir/IR/OpDefinition.h"
|
#include "mlir/IR/OpDefinition.h"
|
||||||
#include "mlir/IR/OpImplementation.h"
|
#include "mlir/IR/OpImplementation.h"
|
||||||
|
#include "mlir/Interfaces/ControlFlowInterfaces.h"
|
||||||
#include "mlir/Interfaces/InferTypeOpInterface.h"
|
#include "mlir/Interfaces/InferTypeOpInterface.h"
|
||||||
#include "mlir/Interfaces/SideEffectInterfaces.h"
|
#include "mlir/Interfaces/SideEffectInterfaces.h"
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
#define SHAPE_OPS
|
#define SHAPE_OPS
|
||||||
|
|
||||||
include "mlir/Dialect/Shape/IR/ShapeBase.td"
|
include "mlir/Dialect/Shape/IR/ShapeBase.td"
|
||||||
|
include "mlir/Interfaces/ControlFlowInterfaces.td"
|
||||||
include "mlir/Interfaces/InferTypeOpInterface.td"
|
include "mlir/Interfaces/InferTypeOpInterface.td"
|
||||||
include "mlir/Interfaces/SideEffectInterfaces.td"
|
include "mlir/Interfaces/SideEffectInterfaces.td"
|
||||||
|
|
||||||
|
@ -426,12 +427,16 @@ def Shape_AssumingOp : Shape_Op<"assuming",
|
||||||
nothing else. They should not exist after a program is fully lowered and
|
nothing else. They should not exist after a program is fully lowered and
|
||||||
ready to execute.
|
ready to execute.
|
||||||
}];
|
}];
|
||||||
let arguments = (ins Shape_WitnessType);
|
let arguments = (ins Shape_WitnessType:$witness);
|
||||||
let regions = (region SizedRegion<1>:$thenRegion);
|
let regions = (region SizedRegion<1>:$doRegion);
|
||||||
let results = (outs Variadic<AnyType>:$results);
|
let results = (outs Variadic<AnyType>:$results);
|
||||||
|
|
||||||
|
let printer = [{ return ::print(p, *this); }];
|
||||||
|
let parser = [{ return ::parse$cppClass(parser, result); }];
|
||||||
}
|
}
|
||||||
|
|
||||||
def Shape_AssumingYieldOp : Shape_Op<"assuming_yield", [Terminator]> {
|
def Shape_AssumingYieldOp : Shape_Op<"assuming_yield",
|
||||||
|
[NoSideEffect, ReturnLike, Terminator]> {
|
||||||
let summary = "Yield operation";
|
let summary = "Yield operation";
|
||||||
let description = [{
|
let description = [{
|
||||||
This yield operation represents a return operation within the assert_and_exec
|
This yield operation represents a return operation within the assert_and_exec
|
||||||
|
@ -441,6 +446,11 @@ def Shape_AssumingYieldOp : Shape_Op<"assuming_yield", [Terminator]> {
|
||||||
}];
|
}];
|
||||||
|
|
||||||
let arguments = (ins Variadic<AnyType>:$operands);
|
let arguments = (ins Variadic<AnyType>:$operands);
|
||||||
|
|
||||||
|
let builders = [
|
||||||
|
OpBuilder<"OpBuilder &builder, OperationState &result",
|
||||||
|
[{ /* nothing to do */ }]>
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
def Shape_CstrBroadcastableOp : Shape_Op<"cstr_broadcastable", []> {
|
def Shape_CstrBroadcastableOp : Shape_Op<"cstr_broadcastable", []> {
|
||||||
|
|
|
@ -8,6 +8,7 @@ add_mlir_dialect_library(MLIRShape
|
||||||
MLIRShapeOpsIncGen
|
MLIRShapeOpsIncGen
|
||||||
|
|
||||||
LINK_LIBS PUBLIC
|
LINK_LIBS PUBLIC
|
||||||
|
MLIRControlFlowInterfaces
|
||||||
MLIRDialect
|
MLIRDialect
|
||||||
MLIRInferTypeOpInterface
|
MLIRInferTypeOpInterface
|
||||||
MLIRIR
|
MLIRIR
|
||||||
|
|
|
@ -107,6 +107,50 @@ AnyOp::inferReturnTypes(MLIRContext *context, Optional<Location> location,
|
||||||
return success();
|
return success();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
// AssumingOp
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
static ParseResult parseAssumingOp(OpAsmParser &parser,
|
||||||
|
OperationState &result) {
|
||||||
|
result.regions.reserve(1);
|
||||||
|
Region *doRegion = result.addRegion();
|
||||||
|
|
||||||
|
auto &builder = parser.getBuilder();
|
||||||
|
OpAsmParser::OperandType cond;
|
||||||
|
if (parser.parseOperand(cond) ||
|
||||||
|
parser.resolveOperand(cond, builder.getType<WitnessType>(),
|
||||||
|
result.operands))
|
||||||
|
return failure();
|
||||||
|
|
||||||
|
// Parse optional results type list.
|
||||||
|
if (parser.parseOptionalArrowTypeList(result.types))
|
||||||
|
return failure();
|
||||||
|
|
||||||
|
// Parse the region and add a terminator if elided.
|
||||||
|
if (parser.parseRegion(*doRegion, /*arguments=*/{}, /*argTypes=*/{}))
|
||||||
|
return failure();
|
||||||
|
AssumingOp::ensureTerminator(*doRegion, parser.getBuilder(), result.location);
|
||||||
|
|
||||||
|
// Parse the optional attribute list.
|
||||||
|
if (parser.parseOptionalAttrDict(result.attributes))
|
||||||
|
return failure();
|
||||||
|
return success();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void print(OpAsmPrinter &p, AssumingOp op) {
|
||||||
|
bool yieldsResults = !op.results().empty();
|
||||||
|
|
||||||
|
p << AssumingOp::getOperationName() << " " << op.witness();
|
||||||
|
if (yieldsResults) {
|
||||||
|
p << " -> (" << op.getResultTypes() << ")";
|
||||||
|
}
|
||||||
|
p.printRegion(op.doRegion(),
|
||||||
|
/*printEntryBlockArgs=*/false,
|
||||||
|
/*printBlockTerminators=*/yieldsResults);
|
||||||
|
p.printOptionalAttrDict(op.getAttrs());
|
||||||
|
}
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// BroadcastOp
|
// BroadcastOp
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
|
@ -74,9 +74,9 @@ func @test_constraints() {
|
||||||
%w0 = "shape.cstr_broadcastable"(%0, %1) : (!shape.shape, !shape.shape) -> !shape.witness
|
%w0 = "shape.cstr_broadcastable"(%0, %1) : (!shape.shape, !shape.shape) -> !shape.witness
|
||||||
%w1 = "shape.cstr_eq"(%0, %1) : (!shape.shape, !shape.shape) -> !shape.witness
|
%w1 = "shape.cstr_eq"(%0, %1) : (!shape.shape, !shape.shape) -> !shape.witness
|
||||||
%w3 = "shape.assuming_all"(%w0, %w1) : (!shape.witness, !shape.witness) -> !shape.witness
|
%w3 = "shape.assuming_all"(%w0, %w1) : (!shape.witness, !shape.witness) -> !shape.witness
|
||||||
"shape.assuming"(%w3) ( {
|
shape.assuming %w3 -> !shape.shape {
|
||||||
%2 = "shape.any"(%0, %1) : (!shape.shape, !shape.shape) -> !shape.shape
|
%2 = "shape.any"(%0, %1) : (!shape.shape, !shape.shape) -> !shape.shape
|
||||||
"shape.assuming_yield"(%2) : (!shape.shape) -> ()
|
"shape.assuming_yield"(%2) : (!shape.shape) -> ()
|
||||||
}) : (!shape.witness) -> !shape.shape
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue