[mlir][spirv] Use larger range for target environment lookup function

Previously we only look at the directly passed-in op for a potential
spv.target_env attribute. This commit switches to use a larger range
and recursively check enclosing symbol tables.

Differential Revision: https://reviews.llvm.org/D75869
This commit is contained in:
Lei Zhang 2020-03-11 16:02:56 -04:00
parent e115a40f50
commit 66c378d66e
3 changed files with 26 additions and 9 deletions

View File

@ -792,9 +792,11 @@ spv.target_env = #spv.target_env<
} { ... }
```
Dialect conversion framework will utilize the information in `spv.target_env`
to properly filter out patterns and ops not available in the target execution
environment.
Dialect conversion framework will utilize the information in `spv.target_env` to
properly filter out patterns and ops not available in the target execution
environment. When targeting SPIR-V, one needs to create a
[`SPIRVConversionTarget`](#spirvconversiontarget) by providing such an
attribute.
## Shader interface (ABI)
@ -931,6 +933,10 @@ target satisfying a given [`spv.target_env`](#target-environment). It registers
proper hooks to check the dynamic legality of SPIR-V ops. Users can further
register other legality constraints into the returned `SPIRVConversionTarget`.
`spirv::lookupTargetEnvOrDefault()` is a handy utility function to query an
`spv.target_env` attached in the input IR or use the feault to construct a
`SPIRVConversionTarget`.
### `SPIRVTypeConverter`
The `mlir::SPIRVTypeConverter` derives from `mlir::TypeConverter` and provides

View File

@ -174,9 +174,9 @@ StringRef getTargetEnvAttrName();
/// and no extra extensions.
TargetEnvAttr getDefaultTargetEnv(MLIRContext *context);
/// Queries the target environment from the given `op` or returns the default
/// target environment (SPIR-V 1.0 with Shader capability and no extra
/// extensions) if not provided.
/// Queries the target environment recursively from enclosing symbol table ops
/// containing the given `op` or returns the default target environment as
/// returned by getDefaultTargetEnv() if not provided.
TargetEnvAttr lookupTargetEnvOrDefault(Operation *op);
} // namespace spirv

View File

@ -11,6 +11,7 @@
#include "mlir/IR/Builders.h"
#include "mlir/IR/FunctionSupport.h"
#include "mlir/IR/Operation.h"
#include "mlir/IR/SymbolTable.h"
using namespace mlir;
@ -294,8 +295,18 @@ spirv::TargetEnvAttr spirv::getDefaultTargetEnv(MLIRContext *context) {
}
spirv::TargetEnvAttr spirv::lookupTargetEnvOrDefault(Operation *op) {
if (auto attr = op->getAttrOfType<spirv::TargetEnvAttr>(
Operation *symTable = op;
while (symTable) {
symTable = SymbolTable::getNearestSymbolTable(symTable);
if (!symTable)
break;
if (auto attr = symTable->getAttrOfType<spirv::TargetEnvAttr>(
spirv::getTargetEnvAttrName()))
return attr;
symTable = symTable->getParentOp();
}
return getDefaultTargetEnv(op->getContext());
}