MLIR  16.0.0git
Namespaces | Macros | Functions
SerializeOps.cpp File Reference
#include "Serializer.h"
#include "mlir/Dialect/SPIRV/IR/SPIRVAttributes.h"
#include "mlir/Dialect/SPIRV/IR/SPIRVEnums.h"
#include "mlir/IR/RegionGraphTraits.h"
#include "mlir/Support/LogicalResult.h"
#include "mlir/Target/SPIRV/SPIRVBinaryUtils.h"
#include "llvm/ADT/DepthFirstIterator.h"
#include "llvm/Support/Debug.h"
#include "mlir/Dialect/SPIRV/IR/SPIRVSerialization.inc"
+ Include dependency graph for SerializeOps.cpp:

Go to the source code of this file.

Namespaces

 mlir
 Include the generated interface declarations.
 
 mlir::spirv
 

Macros

#define DEBUG_TYPE   "spirv-serialization"
 
#define GET_SERIALIZATION_FNS
 

Functions

static LogicalResult visitInPrettyBlockOrder (Block *headerBlock, function_ref< LogicalResult(Block *)> blockHandler, bool skipHeader=false, BlockRange skipBlocks={})
 A pre-order depth-first visitor function for processing basic blocks. More...
 
template<>
LogicalResult mlir::spirv::Serializer::processOp< spirv::EntryPointOp > (spirv::EntryPointOp op)
 
template<>
LogicalResult mlir::spirv::Serializer::processOp< spirv::ExecutionModeOp > (spirv::ExecutionModeOp op)
 
template<>
LogicalResult mlir::spirv::Serializer::processOp< spirv::FunctionCallOp > (spirv::FunctionCallOp op)
 
template<>
LogicalResult mlir::spirv::Serializer::processOp< spirv::CopyMemoryOp > (spirv::CopyMemoryOp op)
 

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "spirv-serialization"

Definition at line 23 of file SerializeOps.cpp.

◆ GET_SERIALIZATION_FNS

#define GET_SERIALIZATION_FNS

Definition at line 673 of file SerializeOps.cpp.

Function Documentation

◆ visitInPrettyBlockOrder()

static LogicalResult visitInPrettyBlockOrder ( Block headerBlock,
function_ref< LogicalResult(Block *)>  blockHandler,
bool  skipHeader = false,
BlockRange  skipBlocks = {} 
)
static

A pre-order depth-first visitor function for processing basic blocks.

Visits the basic blocks starting from the given headerBlock in pre-order depth-first manner and calls blockHandler on each block. Skips handling blocks in the skipBlocks list. If skipHeader is true, blockHandler will not be invoked in headerBlock but still handles all headerBlock's successors.

SPIR-V spec "2.16.1. Universal Validation Rules" requires that "the order of blocks in a function must satisfy the rule that blocks appear before all blocks they dominate." This can be achieved by a pre-order CFG traversal algorithm. To make the serialization output more logical and readable to human, we perform depth-first CFG traversal and delay the serialization of the merge block and the continue block, if exists, until after all other blocks have been processed.

Definition at line 43 of file SerializeOps.cpp.

References mlir::emitError(), mlir::spirv::encodeInstructionInto(), mlir::failed(), mlir::failure(), mlir::Block::front(), mlir::Operation::getName(), mlir::Operation::getOperands(), mlir::Block::getOperations(), mlir::OperationName::getStringRef(), mlir::SymbolTable::getSymbolAttrName(), mlir::FlatSymbolRefAttr::getValue(), mlir::OperationName::stripDialect(), mlir::success(), and value.