diff options
author | Lei Zhang <antiagainst@google.com> | 2019-08-19 10:57:43 -0700 |
---|---|---|
committer | A. Unique TensorFlower <gardener@tensorflow.org> | 2019-08-19 10:58:10 -0700 |
commit | 64abcd983ddcde4b9f27377fd718d04e88e35ab9 (patch) | |
tree | da31ee4b67170fa8796abbaac034cc810afca677 /mlir/lib | |
parent | 9bf69e6a2e9d1ef60ac9e4efa8fda9b6c3560e63 (diff) | |
download | bcm5719-llvm-64abcd983ddcde4b9f27377fd718d04e88e35ab9.tar.gz bcm5719-llvm-64abcd983ddcde4b9f27377fd718d04e88e35ab9.zip |
[spirv] Add spv.ReturnValue
This CL adds the spv.ReturnValue op and its tests. Also adds a
InFunctionScope trait to make sure that the op stays inside
a function. To be consistent, ModuleOnly trait is changed to
InModuleScope.
PiperOrigin-RevId: 264193081
Diffstat (limited to 'mlir/lib')
-rw-r--r-- | mlir/lib/Dialect/SPIRV/SPIRVOps.cpp | 42 |
1 files changed, 38 insertions, 4 deletions
diff --git a/mlir/lib/Dialect/SPIRV/SPIRVOps.cpp b/mlir/lib/Dialect/SPIRV/SPIRVOps.cpp index 9947c0254a9..9a7f3594551 100644 --- a/mlir/lib/Dialect/SPIRV/SPIRVOps.cpp +++ b/mlir/lib/Dialect/SPIRV/SPIRVOps.cpp @@ -1042,10 +1042,7 @@ static LogicalResult verify(spirv::ModuleOp moduleOp) { //===----------------------------------------------------------------------===// static LogicalResult verifyReturn(spirv::ReturnOp returnOp) { - auto funcOp = llvm::dyn_cast<FuncOp>(returnOp.getOperation()->getParentOp()); - if (!funcOp) - return returnOp.emitOpError("must appear in a 'func' op"); - + auto funcOp = llvm::cast<FuncOp>(returnOp.getParentOp()); auto numOutputs = funcOp.getType().getNumResults(); if (numOutputs != 0) return returnOp.emitOpError("cannot be used in functions returning value") @@ -1055,6 +1052,43 @@ static LogicalResult verifyReturn(spirv::ReturnOp returnOp) { } //===----------------------------------------------------------------------===// +// spv.ReturnValue +//===----------------------------------------------------------------------===// + +static ParseResult parseReturnValueOp(OpAsmParser *parser, + OperationState *state) { + OpAsmParser::OperandType retValInfo; + Type retValType; + return failure( + parser->parseOperand(retValInfo) || parser->parseColonType(retValType) || + parser->resolveOperand(retValInfo, retValType, state->operands)); +} + +static void print(spirv::ReturnValueOp retValOp, OpAsmPrinter *printer) { + *printer << spirv::ReturnValueOp::getOperationName() << ' '; + printer->printOperand(retValOp.value()); + *printer << " : " << retValOp.value()->getType(); +} + +static LogicalResult verify(spirv::ReturnValueOp retValOp) { + auto funcOp = llvm::cast<FuncOp>(retValOp.getParentOp()); + auto numFnResults = funcOp.getType().getNumResults(); + if (numFnResults != 1) + return retValOp.emitOpError( + "returns 1 value but enclosing function requires ") + << numFnResults << " results"; + + auto operandType = retValOp.value()->getType(); + auto fnResultType = funcOp.getType().getResult(0); + if (operandType != fnResultType) + return retValOp.emitOpError(" return value's type (") + << operandType << ") mismatch with function's result type (" + << fnResultType << ")"; + + return success(); +} + +//===----------------------------------------------------------------------===// // spv.StoreOp //===----------------------------------------------------------------------===// |