MLIR入门系列系列学习笔记

2023-10-10 03:40

本文主要是介绍MLIR入门系列系列学习笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1 名字解释

这一定义包含3个关键元素:

2 代码演示

 2. 1 环境准备

2.2 编译llvm-project

2.3 测试解析

2.3.1 源程序

2.3.2 将源程序生成抽象语法树(AST)

 3 MLIR三要素

3.1 MLIRGen模块

3.2 Dialect模块

3.3 TableGen模块

3.3.1 定义一个和Toy Dialect的链接

3.3.2 创建一个Toy Dialect Operation的基类

3.3.3 创建Toy Dialect各种Operation的类

3.3.4 生成C++代码


学习链接:

[MLIR] 转换流程详解(以Toy接入为例) - 多一些不为什么的坚持 - 博客园 (cnblogs.com)

MLIR 文章视频汇总 - 知乎 (zhihu.com)

Getting Started - MLIR (llvm.org)

Getting Started with the LLVM System — LLVM 17.0.0git documentation

1 名字解释

项目名字概念解释
1MLIRMulit-Level Intermediate RepresentationMLIR希望为各种DSL提供一种中间表达形式,将他们集成为一套生态系统,使用一种一致性强的方式编译到特定硬件平台的汇编语言上。利用这样的形式,MLIR就可以利用它模块化、可扩展的特点来解决IR之间相互配合的问题。
2DSLDomain Specific Language

针对某一领域,具有受限表达性的一种计算机程序设计语言。 常用于聚焦指定的领域或问题,这就要求 DSL 具备强大的表现力,同时在使用起来要简单。

见:DSL 领域特定语言_Impl_Sunny的博客-CSDN博客

这一定义包含3个关键元素

1)语言性(language nature):DSL是一种程序设计语言,因此它必须具备连贯的表达能力——不管是一个表达式还是多个表达式组合在一起。

2)受限的表达性(limited expressiveness):通用程序设计语言提供广泛的能力:支持各种数据、控制,以及抽象结构。

这些能力很有用,但也会让语言难于学习和使用。DSL只支持特定领域所需要特性的最小集。使用DSL,无法构建一个完整的系统,相反,却可以解决系统某一方面的问题。

3)针对领域(domain focus):只有在一个明确的小领域下,这种能力有限的语言才会有用。这个领域才使得这种语言值得使用。

3

Dialects

Dialects是将所有的IR放在了同一个命名空间中,分别对每个IR定义对应的产生式以及绑定相应的操作,从而生成一个MLIR的模型。整个的编译过程,从源语言生成AST,借助Dialects遍历AST,产生MLIR的表达式,此处可为多层IR通过Lowering Pass依次进行分析,最后经过MLIR分析器,生成目标语言。

transpose(a)的MLIR表达式由操作结果名称、Dialect命名空间、操作名、参数列表、输入参数类型、输出类型和操作在源文件中的位置组成。

4ASTAbstract Syntax Tree抽象语法树,源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。
5ODSOperation Definition SpecificationOperation Definition Specification (ODS)框架是基于TableGen规范构造的。见:【从零开始学深度学习编译器】十六,MLIR ODS要点总结上篇 - 知乎
6MLIR三要素
  • MLIRGen模块 -- 生产线的履带:遍历抽象语法树(AST),据AST各节点的类型,递归调用子函数,子函数内部再根据不同情况,进行相应操作。

  • Dialect模块 -- 生产线的机械臂:负责定义各种操作和分析,同时还具备可扩展性。

  • TableGen模块 -- 生产线的零件:是一种声明性编程语言,用于描述MLIR中Operation的各种操作的类的定义,在源代码中它以.td文件的形式存在,在编译时会自动生成C++的相应文件,给Dialect模块文件提供支持。

2 代码演示

NVIDIA WSL环境搭建见:

NVIDIA GPU Accelerated Computing on WSL 2

CUDA Toolkit 12.1 Update 1 Downloads | NVIDIA Developer

在power shell中查看WSL2信息

PS C:\Users\Lenovo> wsl cat /proc/version
Linux version 5.15.90.1-microsoft-standard-WSL2 (oe-user@oe-host) (x86_64-msft-linux-gcc (GCC) 9.3.0, GNU ld (GNU Binutils) 2.34.0.20200220) #1 SMP Fri Jan 27 02:56:13 UTC 2023
PS C:\Users\Lenovo> wsl --list --verboseNAME      STATE           VERSION
* Ubuntu    Running         2

 2. 1 环境准备

$ uname -a
Linux LAPTOP-3SUHS40U 5.15.90.1-microsoft-standard-WSL2 #1 SMP Fri Jan 27 02:56:13 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux$ nvidia-smi.exe
Sun Apr 30 10:58:42 2023
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 457.49       Driver Version: 457.49       CUDA Version: 11.1     |
|-------------------------------+----------------------+----------------------+
| GPU  Name            TCC/WDDM | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  GeForce RTX 2060   WDDM  | 00000000:01:00.0  On |                  N/A |
| N/A   47C    P8     7W /  N/A |    912MiB /  6144MiB |      5%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------++-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A      1784    C+G   ...y\ShellExperienceHost.exe    N/A      |
|    0   N/A  N/A      1884    C+G   Insufficient Permissions        N/A      |
|    0   N/A  N/A      8344    C+G   ...wekyb3d8bbwe\Video.UI.exe    N/A      |
+-----------------------------------------------------------------------------+sudo apt-get install clang lld
sudo apt-get install cmake
sudo apt-get install re2c
git clone https://github.com/ninja-build/ninja.git
cd ninja/
git branch -r
git checkout release
cmake -Bbuild-cmake
cmake --build build-cmake
./build-cmake/ninja_test
cd build-cmake/
sudo make install
cd -

2.2 编译llvm-project

参见官方MLIR链接:Getting Started - MLIR (llvm.org)

参数介绍参见官方LLVM链接:Getting Started with the LLVM System — LLVM 17.0.0git documentation

git clone https://github.com/llvm/llvm-project.git
mkdir llvm-project/build
cd llvm-project/build
cmake -G Ninja ../llvm \-DLLVM_ENABLE_PROJECTS=mlir \-DLLVM_BUILD_EXAMPLES=ON \-DLLVM_TARGETS_TO_BUILD="Native;NVPTX;AMDGPU" \-DCMAKE_BUILD_TYPE=Release \-DLLVM_ENABLE_ASSERTIONS=ON
# Using clang and lld speeds up the build, we recommend adding:
#  -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DLLVM_ENABLE_LLD=ON
# CCache can drastically speed up further rebuilds, try adding:
#  -DLLVM_CCACHE_BUILD=ON
# Optionally, using ASAN/UBSAN can find bugs early in development, enable with:
# -DLLVM_USE_SANITIZER="Address;Undefined" 
# Optionally, enabling integration tests as well
# -DMLIR_INCLUDE_INTEGRATION_TESTS=ON
cmake --build . --target check-mlir

我使用的编译命令是:

cmake -G Ninja ../llvm \-DLLVM_ENABLE_PROJECTS=mlir \-DLLVM_BUILD_EXAMPLES=ON \-DLLVM_TARGETS_TO_BUILD="host" \-DCMAKE_BUILD_TYPE=Release \-DLLVM_ENABLE_ASSERTIONS=ON \-DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DLLVM_ENABLE_LLD=ON \-DLLVM_CCACHE_BUILD=OFF \-DLLVM_USE_SANITIZER="Address;Undefined" \-DMLIR_INCLUDE_INTEGRATION_TESTS=ONcmake --build . --target check-mlir

编译日志为:

llvm-project/build$ cmake -G Ninja ../llvm \-DLLVM_ENABLE_PROJECTS=mlir \-DLLVM_BUILD_EXAMPLES=ON \-DLLVM_TARGETS_TO_BUILD="host" \-DCMAKE_BUILD_TYPE=Release \-DLLVM_ENABLE_ASSERTIONS=ON \-DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DLLVM_ENABLE_LLD=ON \-DLLVM_CCACHE_BUILD=OFF \-DLLVM_USE_SANITIZER="Address;Undefined" \-DMLIR_INCLUDE_INTEGRATION_TESTS=ON
-- The C compiler identification is Clang 14.0.0
-- The CXX compiler identification is Clang 14.0.0
-- The ASM compiler identification is Clang with GNU-like command-line
-- Found assembler: /usr/bin/clang
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/clang - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/clang++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- bolt project is disabled
-- clang project is disabled
-- clang-tools-extra project is disabled
-- compiler-rt project is disabled
-- cross-project-tests project is disabled
-- libc project is disabled
-- libclc project is disabled
-- lld project is disabled
-- lldb project is disabled
-- mlir project is enabled
-- openmp project is disabled
-- polly project is disabled
-- pstl project is disabled
-- flang project is disabled
-- Found Python3: /usr/bin/python3.10 (found suitable version "3.10.6", minimum required is "3.6") found components: Interpreter
-- Performing Test LLVM_LIBSTDCXX_MIN
-- Performing Test LLVM_LIBSTDCXX_MIN - Success
-- Performing Test LLVM_LIBSTDCXX_SOFT_ERROR
-- Performing Test LLVM_LIBSTDCXX_SOFT_ERROR - Success
-- Looking for dlfcn.h
-- Looking for dlfcn.h - found
-- Looking for errno.h
-- Looking for errno.h - found
-- Looking for fcntl.h
-- Looking for fcntl.h - found
-- Looking for link.h
-- Looking for link.h - found
-- Looking for malloc/malloc.h
-- Looking for malloc/malloc.h - not found
-- Looking for pthread.h
-- Looking for pthread.h - found
-- Looking for signal.h
-- Looking for signal.h - found
-- Looking for sys/ioctl.h
-- Looking for sys/ioctl.h - found
-- Looking for sys/mman.h
-- Looking for sys/mman.h - found
-- Looking for sys/param.h
-- Looking for sys/param.h - found
-- Looking for sys/resource.h
-- Looking for sys/resource.h - found
-- Looking for sys/stat.h
-- Looking for sys/stat.h - found
-- Looking for sys/time.h
-- Looking for sys/time.h - found
-- Looking for sys/types.h
-- Looking for sys/types.h - found
-- Looking for sysexits.h
-- Looking for sysexits.h - found
-- Looking for termios.h
-- Looking for termios.h - found
-- Looking for unistd.h
-- Looking for unistd.h - found
-- Looking for valgrind/valgrind.h
-- Looking for valgrind/valgrind.h - not found
-- Looking for fenv.h
-- Looking for fenv.h - found
-- Looking for FE_ALL_EXCEPT
-- Looking for FE_ALL_EXCEPT - found
-- Looking for FE_INEXACT
-- Looking for FE_INEXACT - found
-- Looking for mach/mach.h
-- Looking for mach/mach.h - not found
-- Looking for CrashReporterClient.h
-- Looking for CrashReporterClient.h - not found
-- Looking for linux/magic.h
-- Looking for linux/magic.h - found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Looking for pthread_rwlock_init in pthread
-- Looking for pthread_rwlock_init in pthread - found
-- Looking for pthread_mutex_lock in pthread
-- Looking for pthread_mutex_lock in pthread - found
-- Looking for dlopen in dl
-- Looking for dlopen in dl - found
-- Looking for clock_gettime in rt
-- Looking for clock_gettime in rt - found
-- Looking for pfm_initialize in pfm
-- Looking for pfm_initialize in pfm - not found
-- Looking for pthread.h
-- Looking for pthread.h - found
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success
-- Found Threads: TRUE
-- Could NOT find ZLIB (missing: ZLIB_LIBRARY ZLIB_INCLUDE_DIR)
-- Found LibXml2: /usr/lib/x86_64-linux-gnu/libxml2.so (found version "2.9.13")
-- Looking for xmlReadMemory
-- Looking for xmlReadMemory - found
-- Performing Test Terminfo_LINKABLE
-- Performing Test Terminfo_LINKABLE - Success
-- Found Terminfo: /usr/lib/x86_64-linux-gnu/libtinfo.so
-- Looking for xar_open in xar
-- Looking for xar_open in xar - not found
-- Looking for arc4random
-- Looking for arc4random - not found
-- Looking for backtrace
-- Looking for backtrace - found
-- backtrace facility detected in default set of libraries
-- Found Backtrace: /usr/include
-- Performing Test C_SUPPORTS_WERROR_UNGUARDED_AVAILABILITY_NEW
-- Performing Test C_SUPPORTS_WERROR_UNGUARDED_AVAILABILITY_NEW - Success
-- Looking for __register_frame
-- Looking for __register_frame - found
-- Looking for __deregister_frame
-- Looking for __deregister_frame - found
-- Looking for __unw_add_dynamic_fde
-- Looking for __unw_add_dynamic_fde - not found
-- Looking for _Unwind_Backtrace
-- Looking for _Unwind_Backtrace - found
-- Looking for getpagesize
-- Looking for getpagesize - found
-- Looking for sysconf
-- Looking for sysconf - found
-- Looking for getrusage
-- Looking for getrusage - found
-- Looking for setrlimit
-- Looking for setrlimit - found
-- Looking for isatty
-- Looking for isatty - found
-- Looking for futimens
-- Looking for futimens - found
-- Looking for futimes
-- Looking for futimes - found
-- Looking for mallctl
-- Looking for mallctl - not found
-- Looking for mallinfo
-- Looking for mallinfo - found
-- Looking for mallinfo2
-- Looking for mallinfo2 - found
-- Looking for malloc_zone_statistics
-- Looking for malloc_zone_statistics - not found
-- Looking for getrlimit
-- Looking for getrlimit - found
-- Looking for posix_spawn
-- Looking for posix_spawn - found
-- Looking for pread
-- Looking for pread - found
-- Looking for sbrk
-- Looking for sbrk - found
-- Looking for strerror
-- Looking for strerror - found
-- Looking for strerror_r
-- Looking for strerror_r - found
-- Looking for strerror_s
-- Looking for strerror_s - not found
-- Looking for setenv
-- Looking for setenv - found
-- Performing Test HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC
-- Performing Test HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC - Failed
-- Performing Test HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC
-- Performing Test HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC - Success
-- Looking for __GLIBC__
-- Looking for __GLIBC__ - found
-- Looking for pthread_getname_np
-- Looking for pthread_getname_np - found
-- Looking for pthread_setname_np
-- Looking for pthread_setname_np - found
-- Looking for dlopen
-- Looking for dlopen - found
-- Looking for dladdr
-- Looking for dladdr - found
-- Looking for proc_pid_rusage
-- Looking for proc_pid_rusage - not found
-- Performing Test HAVE_CXX_ATOMICS_WITHOUT_LIB
-- Performing Test HAVE_CXX_ATOMICS_WITHOUT_LIB - Success
-- Performing Test HAVE_CXX_ATOMICS64_WITHOUT_LIB
-- Performing Test HAVE_CXX_ATOMICS64_WITHOUT_LIB - Success
-- Performing Test LLVM_HAS_ATOMICS
-- Performing Test LLVM_HAS_ATOMICS - Success
-- Performing Test SUPPORTS_VARIADIC_MACROS_FLAG
-- Performing Test SUPPORTS_VARIADIC_MACROS_FLAG - Success
-- Performing Test SUPPORTS_GNU_ZERO_VARIADIC_MACRO_ARGUMENTS_FLAG
-- Performing Test SUPPORTS_GNU_ZERO_VARIADIC_MACRO_ARGUMENTS_FLAG - Success
-- Native target architecture is X86
-- Threads enabled.
-- Doxygen disabled.
-- Ninja version: 1.11.1
-- Could NOT find OCaml (missing: OCAMLFIND OCAML_VERSION OCAML_STDLIB_PATH)
-- Could NOT find OCaml (missing: OCAMLFIND OCAML_VERSION OCAML_STDLIB_PATH)
-- OCaml bindings disabled.
-- Found Python module pygments
-- Found Python module pygments.lexers.c_cpp
-- Found Python module yaml
-- LLVM host triple: x86_64-unknown-linux-gnu
-- LLVM default target triple: x86_64-unknown-linux-gnu
-- Performing Test CXX_SUPPORTS_CUSTOM_LINKER
-- Performing Test CXX_SUPPORTS_CUSTOM_LINKER - Success
-- Performing Test C_SUPPORTS_FPIC
-- Performing Test C_SUPPORTS_FPIC - Success
-- Performing Test CXX_SUPPORTS_FPIC
-- Performing Test CXX_SUPPORTS_FPIC - Success
-- Building with -fPIC
-- Performing Test C_SUPPORTS_FNO_SEMANTIC_INTERPOSITION
-- Performing Test C_SUPPORTS_FNO_SEMANTIC_INTERPOSITION - Success
-- Performing Test CXX_SUPPORTS_FNO_SEMANTIC_INTERPOSITION
-- Performing Test CXX_SUPPORTS_FNO_SEMANTIC_INTERPOSITION - Success
-- Performing Test SUPPORTS_FVISIBILITY_INLINES_HIDDEN_FLAG
-- Performing Test SUPPORTS_FVISIBILITY_INLINES_HIDDEN_FLAG - Success
-- Performing Test C_SUPPORTS_WERROR_DATE_TIME
-- Performing Test C_SUPPORTS_WERROR_DATE_TIME - Success
-- Performing Test CXX_SUPPORTS_WERROR_DATE_TIME
-- Performing Test CXX_SUPPORTS_WERROR_DATE_TIME - Success
-- Performing Test CXX_SUPPORTS_WERROR_UNGUARDED_AVAILABILITY_NEW
-- Performing Test CXX_SUPPORTS_WERROR_UNGUARDED_AVAILABILITY_NEW - Success
-- Performing Test CXX_SUPPORTS_MISSING_FIELD_INITIALIZERS_FLAG
-- Performing Test CXX_SUPPORTS_MISSING_FIELD_INITIALIZERS_FLAG - Success
-- Performing Test C_SUPPORTS_CXX98_COMPAT_EXTRA_SEMI_FLAG
-- Performing Test C_SUPPORTS_CXX98_COMPAT_EXTRA_SEMI_FLAG - Success
-- Performing Test CXX_SUPPORTS_CXX98_COMPAT_EXTRA_SEMI_FLAG
-- Performing Test CXX_SUPPORTS_CXX98_COMPAT_EXTRA_SEMI_FLAG - Success
-- Performing Test C_SUPPORTS_IMPLICIT_FALLTHROUGH_FLAG
-- Performing Test C_SUPPORTS_IMPLICIT_FALLTHROUGH_FLAG - Success
-- Performing Test CXX_SUPPORTS_IMPLICIT_FALLTHROUGH_FLAG
-- Performing Test CXX_SUPPORTS_IMPLICIT_FALLTHROUGH_FLAG - Success
-- Performing Test C_SUPPORTS_COVERED_SWITCH_DEFAULT_FLAG
-- Performing Test C_SUPPORTS_COVERED_SWITCH_DEFAULT_FLAG - Success
-- Performing Test CXX_SUPPORTS_COVERED_SWITCH_DEFAULT_FLAG
-- Performing Test CXX_SUPPORTS_COVERED_SWITCH_DEFAULT_FLAG - Success
-- Performing Test CXX_SUPPORTS_CLASS_MEMACCESS_FLAG
-- Performing Test CXX_SUPPORTS_CLASS_MEMACCESS_FLAG - Failed
-- Performing Test CXX_SUPPORTS_NOEXCEPT_TYPE_FLAG
-- Performing Test CXX_SUPPORTS_NOEXCEPT_TYPE_FLAG - Success
-- Performing Test CXX_WONT_WARN_ON_FINAL_NONVIRTUALDTOR
-- Performing Test CXX_WONT_WARN_ON_FINAL_NONVIRTUALDTOR - Success
-- Performing Test CXX_SUPPORTS_SUGGEST_OVERRIDE_FLAG
-- Performing Test CXX_SUPPORTS_SUGGEST_OVERRIDE_FLAG - Success
-- Performing Test CXX_WSUGGEST_OVERRIDE_ALLOWS_ONLY_FINAL
-- Performing Test CXX_WSUGGEST_OVERRIDE_ALLOWS_ONLY_FINAL - Success
-- Performing Test C_WCOMMENT_ALLOWS_LINE_WRAP
-- Performing Test C_WCOMMENT_ALLOWS_LINE_WRAP - Success
-- Performing Test C_SUPPORTS_STRING_CONVERSION_FLAG
-- Performing Test C_SUPPORTS_STRING_CONVERSION_FLAG - Success
-- Performing Test CXX_SUPPORTS_STRING_CONVERSION_FLAG
-- Performing Test CXX_SUPPORTS_STRING_CONVERSION_FLAG - Success
-- Performing Test C_SUPPORTS_MISLEADING_INDENTATION_FLAG
-- Performing Test C_SUPPORTS_MISLEADING_INDENTATION_FLAG - Success
-- Performing Test CXX_SUPPORTS_MISLEADING_INDENTATION_FLAG
-- Performing Test CXX_SUPPORTS_MISLEADING_INDENTATION_FLAG - Success
-- Performing Test C_SUPPORTS_CTAD_MAYBE_UNSPPORTED_FLAG
-- Performing Test C_SUPPORTS_CTAD_MAYBE_UNSPPORTED_FLAG - Success
-- Performing Test CXX_SUPPORTS_CTAD_MAYBE_UNSPPORTED_FLAG
-- Performing Test CXX_SUPPORTS_CTAD_MAYBE_UNSPPORTED_FLAG - Success
-- Performing Test C_SUPPORTS_FNO_OMIT_FRAME_POINTER
-- Performing Test C_SUPPORTS_FNO_OMIT_FRAME_POINTER - Success
-- Performing Test CXX_SUPPORTS_FNO_OMIT_FRAME_POINTER
-- Performing Test CXX_SUPPORTS_FNO_OMIT_FRAME_POINTER - Success
-- Performing Test C_SUPPORTS_GLINE_TABLES_ONLY
-- Performing Test C_SUPPORTS_GLINE_TABLES_ONLY - Success
-- Performing Test CXX_SUPPORTS_GLINE_TABLES_ONLY
-- Performing Test CXX_SUPPORTS_GLINE_TABLES_ONLY - Success
-- Performing Test LINKER_SUPPORTS_COLOR_DIAGNOSTICS
-- Performing Test LINKER_SUPPORTS_COLOR_DIAGNOSTICS - Success
-- Performing Test C_SUPPORTS_FNO_FUNCTION_SECTIONS
-- Performing Test C_SUPPORTS_FNO_FUNCTION_SECTIONS - Success
-- Performing Test C_SUPPORTS_FFUNCTION_SECTIONS
-- Performing Test C_SUPPORTS_FFUNCTION_SECTIONS - Success
-- Performing Test CXX_SUPPORTS_FFUNCTION_SECTIONS
-- Performing Test CXX_SUPPORTS_FFUNCTION_SECTIONS - Success
-- Performing Test C_SUPPORTS_FDATA_SECTIONS
-- Performing Test C_SUPPORTS_FDATA_SECTIONS - Success
-- Performing Test CXX_SUPPORTS_FDATA_SECTIONS
-- Performing Test CXX_SUPPORTS_FDATA_SECTIONS - Success
-- Looking for os_signpost_interval_begin
-- Looking for os_signpost_interval_begin - not found
-- Linker detection: unknown
-- Performing Test HAS_WERROR_GLOBAL_CTORS
-- Performing Test HAS_WERROR_GLOBAL_CTORS - Success
-- Performing Test LLVM_HAS_NOGLOBAL_CTOR_MUTEX
-- Performing Test LLVM_HAS_NOGLOBAL_CTOR_MUTEX - Success
-- Looking for __x86_64__
-- Looking for __x86_64__ - found
-- Found Git: /usr/bin/git (found version "2.34.1")
-- Targeting X86
-- Performing Test C_SUPPORTS_WERROR_IMPLICIT_FUNCTION_DECLARATION
-- Performing Test C_SUPPORTS_WERROR_IMPLICIT_FUNCTION_DECLARATION - Success
-- Performing Test C_SUPPORTS_WERROR_MISMATCHED_TAGS
-- Performing Test C_SUPPORTS_WERROR_MISMATCHED_TAGS - Success
-- Performing Test C_SUPPORTS_WERROR_GLOBAL_CONSTRUCTOR
-- Performing Test C_SUPPORTS_WERROR_GLOBAL_CONSTRUCTOR - Success
-- Performing Test CXX_SUPPORTS_WERROR_GLOBAL_CONSTRUCTOR
-- Performing Test CXX_SUPPORTS_WERROR_GLOBAL_CONSTRUCTOR - Success
-- Performing Test COMPILER_SUPPORTS_WARNING_WEAK_VTABLES
-- Performing Test COMPILER_SUPPORTS_WARNING_WEAK_VTABLES - Success
-- Registering ExampleIRTransforms as a pass plugin (static build: OFF)
-- Registering Bye as a pass plugin (static build: OFF)
-- Failed to find LLVM FileCheck-- git version: v0.0.0 normalized to 0.0.0
-- Version: 1.6.0
-- Looking for shm_open in rt
-- Looking for shm_open in rt - found
-- Performing Test HAVE_CXX_FLAG_STD_CXX11
-- Performing Test HAVE_CXX_FLAG_STD_CXX11 - Success
-- Performing Test HAVE_CXX_FLAG_WALL
-- Performing Test HAVE_CXX_FLAG_WALL - Success
-- Performing Test HAVE_CXX_FLAG_WEXTRA
-- Performing Test HAVE_CXX_FLAG_WEXTRA - Success
-- Performing Test HAVE_CXX_FLAG_WSHADOW
-- Performing Test HAVE_CXX_FLAG_WSHADOW - Success
-- Performing Test HAVE_CXX_FLAG_WSUGGEST_OVERRIDE
-- Performing Test HAVE_CXX_FLAG_WSUGGEST_OVERRIDE - Success
-- Performing Test HAVE_CXX_FLAG_PEDANTIC
-- Performing Test HAVE_CXX_FLAG_PEDANTIC - Success
-- Performing Test HAVE_CXX_FLAG_PEDANTIC_ERRORS
-- Performing Test HAVE_CXX_FLAG_PEDANTIC_ERRORS - Success
-- Performing Test HAVE_CXX_FLAG_WSHORTEN_64_TO_32
-- Performing Test HAVE_CXX_FLAG_WSHORTEN_64_TO_32 - Success
-- Performing Test HAVE_CXX_FLAG_FSTRICT_ALIASING
-- Performing Test HAVE_CXX_FLAG_FSTRICT_ALIASING - Success
-- Performing Test HAVE_CXX_FLAG_WNO_DEPRECATED_DECLARATIONS
-- Performing Test HAVE_CXX_FLAG_WNO_DEPRECATED_DECLARATIONS - Success
-- Performing Test HAVE_CXX_FLAG_FNO_EXCEPTIONS
-- Performing Test HAVE_CXX_FLAG_FNO_EXCEPTIONS - Success
-- Performing Test HAVE_CXX_FLAG_WSTRICT_ALIASING
-- Performing Test HAVE_CXX_FLAG_WSTRICT_ALIASING - Success
-- Performing Test HAVE_CXX_FLAG_WD654
-- Performing Test HAVE_CXX_FLAG_WD654 - Failed
-- Performing Test HAVE_CXX_FLAG_WTHREAD_SAFETY
-- Performing Test HAVE_CXX_FLAG_WTHREAD_SAFETY - Success
-- Performing Test HAVE_THREAD_SAFETY_ATTRIBUTES
-- Performing Test HAVE_THREAD_SAFETY_ATTRIBUTES
-- Performing Test HAVE_THREAD_SAFETY_ATTRIBUTES -- failed to compile
-- Performing Test HAVE_CXX_FLAG_COVERAGE
-- Performing Test HAVE_CXX_FLAG_COVERAGE - Success
-- Performing Test HAVE_GNU_POSIX_REGEX
-- Performing Test HAVE_GNU_POSIX_REGEX
-- Performing Test HAVE_GNU_POSIX_REGEX -- failed to compile
-- Performing Test HAVE_POSIX_REGEX
-- Performing Test HAVE_POSIX_REGEX
-- Performing Test HAVE_POSIX_REGEX -- success
-- Performing Test HAVE_STEADY_CLOCK
-- Performing Test HAVE_STEADY_CLOCK
-- Performing Test HAVE_STEADY_CLOCK -- success
-- Configuring done-- Generating done
-- Build files have been written to: /mnt/e/opensource/llvm-project/build
$ cmake --build . --target check-mlir
[3488/3489] Running the MLIR regression testsTesting Time: 234.88sUnsupported:  143Passed     : 1911

2.3 测试解析

整个MLIR的编译路径:(引用自:MLIR的惊鸿一瞥 - 知乎 (zhihu.com))

2.3.1 源程序

位置:mlir\test\Examples\Toy\Ch2\codegen.toy

# RUN: toyc-ch2 %s -emit=mlir 2>&1 | FileCheck %s# User defined generic function that operates on unknown shaped arguments
def multiply_transpose(a, b) {return transpose(a) * transpose(b);
}def main() {var a<2, 3> = [[1, 2, 3], [4, 5, 6]];var b<2, 3> = [1, 2, 3, 4, 5, 6];var c = multiply_transpose(a, b);var d = multiply_transpose(b, a);print(d);
}# CHECK-LABEL: toy.func @multiply_transpose(
# CHECK-SAME:                               [[VAL_0:%.*]]: tensor<*xf64>, [[VAL_1:%.*]]: tensor<*xf64>) -> tensor<*xf64>
# CHECK:         [[VAL_2:%.*]] = toy.transpose([[VAL_0]] : tensor<*xf64>) to tensor<*xf64>
# CHECK-NEXT:    [[VAL_3:%.*]] = toy.transpose([[VAL_1]] : tensor<*xf64>) to tensor<*xf64>
# CHECK-NEXT:    [[VAL_4:%.*]] = toy.mul [[VAL_2]], [[VAL_3]] :  tensor<*xf64>
# CHECK-NEXT:    toy.return [[VAL_4]] : tensor<*xf64># CHECK-LABEL: toy.func @main()
# CHECK-NEXT:    [[VAL_5:%.*]] = toy.constant dense<{{\[\[}}1.000000e+00, 2.000000e+00, 3.000000e+00], [4.000000e+00, 5.000000e+00, 6.000000e+00]]> : tensor<2x3xf64>
# CHECK-NEXT:    [[VAL_6:%.*]] = toy.reshape([[VAL_5]] : tensor<2x3xf64>) to tensor<2x3xf64>
# CHECK-NEXT:    [[VAL_7:%.*]] = toy.constant dense<[1.000000e+00, 2.000000e+00, 3.000000e+00, 4.000000e+00, 5.000000e+00, 6.000000e+00]> : tensor<6xf64>
# CHECK-NEXT:    [[VAL_8:%.*]] = toy.reshape([[VAL_7]] : tensor<6xf64>) to tensor<2x3xf64>
# CHECK-NEXT:    [[VAL_9:%.*]] = toy.generic_call @multiply_transpose([[VAL_6]], [[VAL_8]]) : (tensor<2x3xf64>, tensor<2x3xf64>) -> tensor<*xf64>
# CHECK-NEXT:    [[VAL_10:%.*]] = toy.generic_call @multiply_transpose([[VAL_8]], [[VAL_6]]) : (tensor<2x3xf64>, tensor<2x3xf64>) -> tensor<*xf64>
# CHECK-NEXT:    toy.print [[VAL_10]] : tensor<*xf64>
# CHECK-NEXT:    toy.return

2.3.2 将源程序生成抽象语法树(AST)

llvm-project/build$ bin/toyc-ch2 ../mlir/test/Examples/Toy/Ch2/codegen.toy -emit=astModule:FunctionProto 'multiply_transpose' @../mlir/test/Examples/Toy/Ch2/codegen.toy:4:1Params: [a, b]Block {ReturnBinOp: * @../mlir/test/Examples/Toy/Ch2/codegen.toy:5:25Call 'transpose' [ @../mlir/test/Examples/Toy/Ch2/codegen.toy:5:10var: a @../mlir/test/Examples/Toy/Ch2/codegen.toy:5:20]Call 'transpose' [ @../mlir/test/Examples/Toy/Ch2/codegen.toy:5:25var: b @../mlir/test/Examples/Toy/Ch2/codegen.toy:5:35]} // BlockFunctionProto 'main' @../mlir/test/Examples/Toy/Ch2/codegen.toy:8:1Params: []Block {VarDecl a<2, 3> @../mlir/test/Examples/Toy/Ch2/codegen.toy:9:3Literal: <2, 3>[ <3>[ 1.000000e+00, 2.000000e+00, 3.000000e+00], <3>[ 4.000000e+00, 5.000000e+00, 6.000000e+00]] @../mlir/test/Examples/Toy/Ch2/codegen.toy:9:17VarDecl b<2, 3> @../mlir/test/Examples/Toy/Ch2/codegen.toy:10:3Literal: <6>[ 1.000000e+00, 2.000000e+00, 3.000000e+00, 4.000000e+00, 5.000000e+00, 6.000000e+00] @../mlir/test/Examples/Toy/Ch2/codegen.toy:10:17VarDecl c<> @../mlir/test/Examples/Toy/Ch2/codegen.toy:11:3Call 'multiply_transpose' [ @../mlir/test/Examples/Toy/Ch2/codegen.toy:11:11var: a @../mlir/test/Examples/Toy/Ch2/codegen.toy:11:30var: b @../mlir/test/Examples/Toy/Ch2/codegen.toy:11:33]VarDecl d<> @../mlir/test/Examples/Toy/Ch2/codegen.toy:12:3Call 'multiply_transpose' [ @../mlir/test/Examples/Toy/Ch2/codegen.toy:12:11var: b @../mlir/test/Examples/Toy/Ch2/codegen.toy:12:30var: a @../mlir/test/Examples/Toy/Ch2/codegen.toy:12:33]Print [ @../mlir/test/Examples/Toy/Ch2/codegen.toy:13:3var: d @../mlir/test/Examples/Toy/Ch2/codegen.toy:13:9]} // Block

2.3.3 将抽象语法树(AST)生成MLIR表达式

llvm-project/build$  bin/toyc-ch2 ../mlir/test/Examples/Toy/Ch2/codegen.toy -emit=mlir -mlir-print-debuginfo
module {toy.func @multiply_transpose(%arg0: tensor<*xf64> loc("../mlir/test/Examples/Toy/Ch2/codegen.toy":4:1), %arg1: tensor<*xf64> loc("../mlir/test/Examples/Toy/Ch2/codegen.toy":4:1)) -> tensor<*xf64> {%0 = toy.transpose(%arg0 : tensor<*xf64>) to tensor<*xf64> loc("../mlir/test/Examples/Toy/Ch2/codegen.toy":5:10)%1 = toy.transpose(%arg1 : tensor<*xf64>) to tensor<*xf64> loc("../mlir/test/Examples/Toy/Ch2/codegen.toy":5:25)%2 = toy.mul %0, %1 : tensor<*xf64> loc("../mlir/test/Examples/Toy/Ch2/codegen.toy":5:25)toy.return %2 : tensor<*xf64> loc("../mlir/test/Examples/Toy/Ch2/codegen.toy":5:3)} loc("../mlir/test/Examples/Toy/Ch2/codegen.toy":4:1)toy.func @main() {%0 = toy.constant dense<[[1.000000e+00, 2.000000e+00, 3.000000e+00], [4.000000e+00, 5.000000e+00, 6.000000e+00]]> : tensor<2x3xf64> loc("../mlir/test/Examples/Toy/Ch2/codegen.toy":9:17)%1 = toy.reshape(%0 : tensor<2x3xf64>) to tensor<2x3xf64> loc("../mlir/test/Examples/Toy/Ch2/codegen.toy":9:3)%2 = toy.constant dense<[1.000000e+00, 2.000000e+00, 3.000000e+00, 4.000000e+00, 5.000000e+00, 6.000000e+00]> : tensor<6xf64> loc("../mlir/test/Examples/Toy/Ch2/codegen.toy":10:17)%3 = toy.reshape(%2 : tensor<6xf64>) to tensor<2x3xf64> loc("../mlir/test/Examples/Toy/Ch2/codegen.toy":10:3)%4 = toy.generic_call @multiply_transpose(%1, %3) : (tensor<2x3xf64>, tensor<2x3xf64>) -> tensor<*xf64> loc("../mlir/test/Examples/Toy/Ch2/codegen.toy":11:11)%5 = toy.generic_call @multiply_transpose(%3, %1) : (tensor<2x3xf64>, tensor<2x3xf64>) -> tensor<*xf64> loc("../mlir/test/Examples/Toy/Ch2/codegen.toy":12:11)toy.print %5 : tensor<*xf64> loc("../mlir/test/Examples/Toy/Ch2/codegen.toy":13:3)toy.return loc("../mlir/test/Examples/Toy/Ch2/codegen.toy":8:1)} loc("../mlir/test/Examples/Toy/Ch2/codegen.toy":8:1)
} loc(unknown)

MLIR表达式由操作结果名称、Dialect命名空间、操作名、参数列表、输入参数类型、输出类型和操作在源文件中的位置组成。以transpose为例:

 3 MLIR三要素

3.1 MLIRGen模块

MLIRGen根据AST各节点的类型,递归调用子函数,子函数内部再根据不同情况,进行相应操作。

  /// Emit a call expression. It emits specific operations for the `transpose`/// builtin. Other identifiers are assumed to be user-defined functions.mlir::Value mlirGen(CallExprAST &call) {llvm::StringRef callee = call.getCallee();auto location = loc(call.loc());// Codegen the operands first.SmallVector<mlir::Value, 4> operands;for (auto &expr : call.getArgs()) {auto arg = mlirGen(*expr);if (!arg)return nullptr;operands.push_back(arg);}// Builtin calls have their custom operation, meaning this is a// straightforward emission.if (callee == "transpose") {if (call.getArgs().size() != 1) {emitError(location, "MLIR codegen encountered an error: toy.transpose ""does not accept multiple arguments");return nullptr;}return builder.create<TransposeOp>(location, operands[0]);}// Otherwise this is a call to a user-defined function. Calls to// user-defined functions are mapped to a custom call that takes the callee// name as an attribute.return builder.create<GenericCallOp>(location, callee, operands);}

3.2 Dialect模块

Dialect模块负责定义各种操作和分析,同时还具备可扩展性。对于transpose(a)来说,Dialect模块负责给这个转置操作添加相应的类型和操作数的值。

//===----------------------------------------------------------------------===//
// TransposeOp
//===----------------------------------------------------------------------===//void TransposeOp::build(mlir::OpBuilder &builder, mlir::OperationState &state,mlir::Value value) {state.addTypes(UnrankedTensorType::get(builder.getF64Type()));state.addOperands(value);
}

3.3 TableGen模块

Operation Definition Specification (ODS)框架是基于TableGen规范构造的。用于描述MLIR中Operation的类的定义,在源代码中它以.td文件的形式存在,在编译时会自动生成C++的相应文件,给Dialect模块文件提供支持。

如果我们使用手动编写的方式,在针对不同编译目标时,我们需要在一系列不同文件中编写一些相同的代码,这就造成了冗余的开发。而使用TableGen,我们只需要修改.td文件即可实现批量修改,也就解决了上述问题。

在Toy语言程序例子中,.td文件是由什么组成的,而TableGen又是怎么发挥的作用,按如下三步来解析。

3.3.1 定义一个和Toy Dialect的链接

.td文件中定义一个TableGen和Dialect的链接,它负责把在Dialect中定义的所有Operation整合起来,mlir\examples\toy\Ch2\include\toy\Ops.td代码如下:

// Provide a definition of the 'toy' dialect in the ODS framework so that we
// can define our operations.
def Toy_Dialect : Dialect {let name = "toy";let cppNamespace = "::mlir::toy";
}

3.3.2 创建一个Toy Dialect Operation的基类

构造所有Dialect Operation的基类Toy_Op,所有的Operation类都将基于此类进行构造,mlir\examples\toy\Ch2\include\toy\Ops.td代码如下:

// Base class for toy dialect operations. This operation inherits from the base
// `Op` class in OpBase.td, and provides:
//   * The parent dialect of the operation.
//   * The mnemonic for the operation, or the name without the dialect prefix.
//   * A list of traits for the operation.
class Toy_Op<string mnemonic, list<Trait> traits = []> :Op<Toy_Dialect, mnemonic, traits>;

3.3.3 创建Toy Dialect各种Operation的类

所有定义的Operation的类都继承自上述基类,以mlir\examples\toy\Ch2\include\toy\Ops.td代码中TransposeOp为例,使用TableGen的规则 定义参数、值、builder、verifier等元素:

def TransposeOp : Toy_Op<"transpose"> {let summary = "transpose operation";let arguments = (ins F64Tensor:$input);let results = (outs F64Tensor);let assemblyFormat = [{`(` $input `:` type($input) `)` attr-dict `to` type(results)}];// Allow building a TransposeOp with from the input operand.let builders = [OpBuilder<(ins "Value":$input)>];// Invoke a static verify method to verify this transpose operation.let hasVerifier = 1;
}

3.3.4 生成C++代码

在编写完TableGen描述之后,我们可以使用mlir-tblgen工具来生成C++代码,在编译时,TableGen将会发挥作用,把.td文件生成为C++的文件,而上述生成的代码将给Dialect模块提供支持。操作步骤如下:

llvm-project/build$ bin/mlir-tblgen -gen-op-defs ../mlir/examples/toy/Ch2/include/toy/Ops.td -I ../mlir/include/ > toy_chn2.cpp

生成的代码如下

/*===- TableGen'erated file -------------------------------------*- C++ -*-===*\
|*                                                                            *|
|* Op Definitions                                                             *|
|*                                                                            *|
|* Automatically generated file, do not edit!                                 *|
|*                                                                            *|
\*===----------------------------------------------------------------------===*/#ifdef GET_OP_LIST
#undef GET_OP_LIST::mlir::toy::AddOp,
::mlir::toy::ConstantOp,
::mlir::toy::FuncOp,
::mlir::toy::GenericCallOp,
::mlir::toy::MulOp,
::mlir::toy::PrintOp,
::mlir::toy::ReshapeOp,
::mlir::toy::ReturnOp,
::mlir::toy::TransposeOp
#endif  // GET_OP_LIST#ifdef GET_OP_CLASSES
#undef GET_OP_CLASSES//===----------------------------------------------------------------------===//
// Local Utility Method Definitions
//===----------------------------------------------------------------------===//namespace mlir {
namespace toy {static ::mlir::LogicalResult __mlir_ods_local_type_constraint_Ops0(::mlir::Operation *op, ::mlir::Type type, ::llvm::StringRef valueKind,unsigned valueIndex) {if (!(((type.isa<::mlir::TensorType>())) && ([](::mlir::Type elementType) { return (elementType.isF64()); }(type.cast<::mlir::ShapedType>().getElementType())))) {return op->emitOpError(valueKind) << " #" << valueIndex<< " must be tensor of 64-bit float values, but got " << type;}return ::mlir::success();
}static ::mlir::LogicalResult __mlir_ods_local_type_constraint_Ops1(::mlir::Operation *op, ::mlir::Type type, ::llvm::StringRef valueKind,unsigned valueIndex) {if (!((((type.isa<::mlir::RankedTensorType>())) && ((type.cast<::mlir::ShapedType>().hasStaticShape()))) && ([](::mlir::Type elementType) { return (elementType.isF64()); }(type.cast<::mlir::ShapedType>().getElementType())))) {return op->emitOpError(valueKind) << " #" << valueIndex<< " must be statically shaped tensor of 64-bit float values, but got " << type;}return ::mlir::success();
}static ::mlir::LogicalResult __mlir_ods_local_attr_constraint_Ops0(::mlir::Operation *op, ::mlir::Attribute attr, ::llvm::StringRef attrName) {if (attr && !((attr.isa<::mlir::DenseFPElementsAttr>() &&attr.cast<::mlir::DenseElementsAttr>().getType().getElementType().isF64()))) {return op->emitOpError("attribute '") << attrName<< "' failed to satisfy constraint: 64-bit float elements attribute";}return ::mlir::success();
}static ::mlir::LogicalResult __mlir_ods_local_attr_constraint_Ops1(::mlir::Operation *op, ::mlir::Attribute attr, ::llvm::StringRef attrName) {if (attr && !((attr.isa<::mlir::StringAttr>()))) {return op->emitOpError("attribute '") << attrName<< "' failed to satisfy constraint: string attribute";}return ::mlir::success();
}static ::mlir::LogicalResult __mlir_ods_local_attr_constraint_Ops2(::mlir::Operation *op, ::mlir::Attribute attr, ::llvm::StringRef attrName) {if (attr && !(((attr.isa<::mlir::TypeAttr>())) && ((attr.cast<::mlir::TypeAttr>().getValue().isa<::mlir::FunctionType>())) && ((attr.cast<::mlir::TypeAttr>().getValue().isa<::mlir::FunctionType>())))) {return op->emitOpError("attribute '") << attrName<< "' failed to satisfy constraint: type attribute of function type";}return ::mlir::success();
}static ::mlir::LogicalResult __mlir_ods_local_attr_constraint_Ops3(::mlir::Operation *op, ::mlir::Attribute attr, ::llvm::StringRef attrName) {if (attr && !(((attr.isa<::mlir::ArrayAttr>())) && (::llvm::all_of(attr.cast<::mlir::ArrayAttr>(), [&](::mlir::Attribute attr) { return attr && ((attr.isa<::mlir::DictionaryAttr>())); })))) {return op->emitOpError("attribute '") << attrName<< "' failed to satisfy constraint: Array of dictionary attributes";}return ::mlir::success();
}static ::mlir::LogicalResult __mlir_ods_local_attr_constraint_Ops4(::mlir::Operation *op, ::mlir::Attribute attr, ::llvm::StringRef attrName) {if (attr && !((attr.isa<::mlir::FlatSymbolRefAttr>()))) {return op->emitOpError("attribute '") << attrName<< "' failed to satisfy constraint: flat symbol reference attribute";}return ::mlir::success();
}static ::mlir::LogicalResult __mlir_ods_local_region_constraint_Ops0(::mlir::Operation *op, ::mlir::Region &region, ::llvm::StringRef regionName,unsigned regionIndex) {if (!((true))) {return op->emitOpError("region #") << regionIndex<< (regionName.empty() ? " " : " ('" + regionName + "') ")<< "failed to verify constraint: any region";}return ::mlir::success();
}
} // namespace toy
} // namespace mlir
namespace mlir {
namespace toy {//===----------------------------------------------------------------------===//
// ::mlir::toy::AddOp definitions
//===----------------------------------------------------------------------===//namespace detail {
AddOpGenericAdaptorBase::AddOpGenericAdaptorBase(::mlir::DictionaryAttr attrs, ::mlir::RegionRange regions) : odsAttrs(attrs), odsRegions(regions) {  if (odsAttrs)odsOpName.emplace("toy.add", odsAttrs.getContext());
}std::pair<unsigned, unsigned> AddOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {return {index, 1};
}::mlir::DictionaryAttr AddOpGenericAdaptorBase::getAttributes() {return odsAttrs;
}} // namespace detail
AddOpAdaptor::AddOpAdaptor(AddOp op) : AddOpAdaptor(op->getOperands(), op->getAttrDictionary(), op->getRegions()) {}::mlir::LogicalResult AddOpAdaptor::verify(::mlir::Location loc) {return ::mlir::success();
}std::pair<unsigned, unsigned> AddOp::getODSOperandIndexAndLength(unsigned index) {return {index, 1};
}::mlir::Operation::operand_range AddOp::getODSOperands(unsigned index) {auto valueRange = getODSOperandIndexAndLength(index);return {std::next(getOperation()->operand_begin(), valueRange.first),std::next(getOperation()->operand_begin(), valueRange.first + valueRange.second)};
}::mlir::TypedValue<::mlir::TensorType> AddOp::getLhs() {return ::llvm::cast<::mlir::TypedValue<::mlir::TensorType>>(*getODSOperands(0).begin());
}::mlir::TypedValue<::mlir::TensorType> AddOp::getRhs() {return ::llvm::cast<::mlir::TypedValue<::mlir::TensorType>>(*getODSOperands(1).begin());
}::mlir::MutableOperandRange AddOp::getLhsMutable() {auto range = getODSOperandIndexAndLength(0);auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second);return mutableRange;
}::mlir::MutableOperandRange AddOp::getRhsMutable() {auto range = getODSOperandIndexAndLength(1);auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second);return mutableRange;
}std::pair<unsigned, unsigned> AddOp::getODSResultIndexAndLength(unsigned index) {return {index, 1};
}::mlir::Operation::result_range AddOp::getODSResults(unsigned index) {auto valueRange = getODSResultIndexAndLength(index);return {std::next(getOperation()->result_begin(), valueRange.first),std::next(getOperation()->result_begin(), valueRange.first + valueRange.second)};
}void AddOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type resultType0, ::mlir::Value lhs, ::mlir::Value rhs) {odsState.addOperands(lhs);odsState.addOperands(rhs);odsState.addTypes(resultType0);
}void AddOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::Value lhs, ::mlir::Value rhs) {odsState.addOperands(lhs);odsState.addOperands(rhs);assert(resultTypes.size() == 1u && "mismatched number of results");odsState.addTypes(resultTypes);
}void AddOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) {assert(operands.size() == 2u && "mismatched number of parameters");odsState.addOperands(operands);odsState.addAttributes(attributes);assert(resultTypes.size() == 1u && "mismatched number of return types");odsState.addTypes(resultTypes);
}::mlir::LogicalResult AddOp::verifyInvariantsImpl() {{unsigned index = 0; (void)index;auto valueGroup0 = getODSOperands(0);for (auto v : valueGroup0) {if (::mlir::failed(__mlir_ods_local_type_constraint_Ops0(*this, v.getType(), "operand", index++)))return ::mlir::failure();}auto valueGroup1 = getODSOperands(1);for (auto v : valueGroup1) {if (::mlir::failed(__mlir_ods_local_type_constraint_Ops0(*this, v.getType(), "operand", index++)))return ::mlir::failure();}}{unsigned index = 0; (void)index;auto valueGroup0 = getODSResults(0);for (auto v : valueGroup0) {if (::mlir::failed(__mlir_ods_local_type_constraint_Ops0(*this, v.getType(), "result", index++)))return ::mlir::failure();}}return ::mlir::success();
}::mlir::LogicalResult AddOp::verifyInvariants() {return verifyInvariantsImpl();
}} // namespace toy
} // namespace mlir
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::toy::AddOp)namespace mlir {
namespace toy {//===----------------------------------------------------------------------===//
// ::mlir::toy::ConstantOp definitions
//===----------------------------------------------------------------------===//namespace detail {
ConstantOpGenericAdaptorBase::ConstantOpGenericAdaptorBase(::mlir::DictionaryAttr attrs, ::mlir::RegionRange regions) : odsAttrs(attrs), odsRegions(regions) {  if (odsAttrs)odsOpName.emplace("toy.constant", odsAttrs.getContext());
}std::pair<unsigned, unsigned> ConstantOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {return {index, 1};
}::mlir::DictionaryAttr ConstantOpGenericAdaptorBase::getAttributes() {return odsAttrs;
}::mlir::DenseElementsAttr ConstantOpGenericAdaptorBase::getValueAttr() {assert(odsAttrs && "no attributes when constructing adapter");auto attr = ::mlir::impl::getAttrFromSortedRange(odsAttrs.begin() + 0, odsAttrs.end() - 0, ConstantOp::getValueAttrName(*odsOpName)).cast<::mlir::DenseElementsAttr>();return attr;
}::mlir::DenseElementsAttr ConstantOpGenericAdaptorBase::getValue() {auto attr = getValueAttr();return attr;
}} // namespace detail
ConstantOpAdaptor::ConstantOpAdaptor(ConstantOp op) : ConstantOpAdaptor(op->getOperands(), op->getAttrDictionary(), op->getRegions()) {}::mlir::LogicalResult ConstantOpAdaptor::verify(::mlir::Location loc) {auto namedAttrRange = odsAttrs;auto namedAttrIt = namedAttrRange.begin();::mlir::Attribute tblgen_value;while (true) {if (namedAttrIt == namedAttrRange.end())return emitError(loc, "'toy.constant' op ""requires attribute 'value'");if (namedAttrIt->getName() == ConstantOp::getValueAttrName(*odsOpName)) {tblgen_value = namedAttrIt->getValue();break;}++namedAttrIt;}if (tblgen_value && !((tblgen_value.isa<::mlir::DenseFPElementsAttr>() &&tblgen_value.cast<::mlir::DenseElementsAttr>().getType().getElementType().isF64())))return emitError(loc, "'toy.constant' op ""attribute 'value' failed to satisfy constraint: 64-bit float elements attribute");return ::mlir::success();
}std::pair<unsigned, unsigned> ConstantOp::getODSOperandIndexAndLength(unsigned index) {return {index, 1};
}::mlir::Operation::operand_range ConstantOp::getODSOperands(unsigned index) {auto valueRange = getODSOperandIndexAndLength(index);return {std::next(getOperation()->operand_begin(), valueRange.first),std::next(getOperation()->operand_begin(), valueRange.first + valueRange.second)};
}std::pair<unsigned, unsigned> ConstantOp::getODSResultIndexAndLength(unsigned index) {return {index, 1};
}::mlir::Operation::result_range ConstantOp::getODSResults(unsigned index) {auto valueRange = getODSResultIndexAndLength(index);return {std::next(getOperation()->result_begin(), valueRange.first),std::next(getOperation()->result_begin(), valueRange.first + valueRange.second)};
}::mlir::DenseElementsAttr ConstantOp::getValueAttr() {return ::mlir::impl::getAttrFromSortedRange((*this)->getAttrs().begin() + 0, (*this)->getAttrs().end() - 0, getValueAttrName()).cast<::mlir::DenseElementsAttr>();
}::mlir::DenseElementsAttr ConstantOp::getValue() {auto attr = getValueAttr();return attr;
}void ConstantOp::setValueAttr(::mlir::DenseElementsAttr attr) {(*this)->setAttr(getValueAttrName(), attr);
}void ConstantOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, DenseElementsAttr value) {build(odsBuilder, odsState, value.getType(), value);}void ConstantOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type resultType0, ::mlir::DenseElementsAttr value) {odsState.addAttribute(getValueAttrName(odsState.name), value);odsState.addTypes(resultType0);
}void ConstantOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::DenseElementsAttr value) {odsState.addAttribute(getValueAttrName(odsState.name), value);assert(resultTypes.size() == 1u && "mismatched number of results");odsState.addTypes(resultTypes);
}void ConstantOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) {assert(operands.size() == 0u && "mismatched number of parameters");odsState.addOperands(operands);odsState.addAttributes(attributes);assert(resultTypes.size() == 1u && "mismatched number of return types");odsState.addTypes(resultTypes);
}::mlir::LogicalResult ConstantOp::verifyInvariantsImpl() {auto namedAttrRange = (*this)->getAttrs();auto namedAttrIt = namedAttrRange.begin();::mlir::Attribute tblgen_value;while (true) {if (namedAttrIt == namedAttrRange.end())return emitOpError("requires attribute 'value'");if (namedAttrIt->getName() == getValueAttrName()) {tblgen_value = namedAttrIt->getValue();break;}++namedAttrIt;}if (::mlir::failed(__mlir_ods_local_attr_constraint_Ops0(*this, tblgen_value, "value")))return ::mlir::failure();{unsigned index = 0; (void)index;auto valueGroup0 = getODSResults(0);for (auto v : valueGroup0) {if (::mlir::failed(__mlir_ods_local_type_constraint_Ops0(*this, v.getType(), "result", index++)))return ::mlir::failure();}}return ::mlir::success();
}::mlir::LogicalResult ConstantOp::verifyInvariants() {if(::mlir::succeeded(verifyInvariantsImpl()) && ::mlir::succeeded(verify()))return ::mlir::success();return ::mlir::failure();
}void ConstantOp::getEffects(::llvm::SmallVectorImpl<::mlir::SideEffects::EffectInstance<::mlir::MemoryEffects::Effect>> &effects) {
}} // namespace toy
} // namespace mlir
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::toy::ConstantOp)namespace mlir {
namespace toy {//===----------------------------------------------------------------------===//
// ::mlir::toy::FuncOp definitions
//===----------------------------------------------------------------------===//namespace detail {
FuncOpGenericAdaptorBase::FuncOpGenericAdaptorBase(::mlir::DictionaryAttr attrs, ::mlir::RegionRange regions) : odsAttrs(attrs), odsRegions(regions) {  if (odsAttrs)odsOpName.emplace("toy.func", odsAttrs.getContext());
}std::pair<unsigned, unsigned> FuncOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {return {index, 1};
}::mlir::DictionaryAttr FuncOpGenericAdaptorBase::getAttributes() {return odsAttrs;
}::mlir::StringAttr FuncOpGenericAdaptorBase::getSymNameAttr() {assert(odsAttrs && "no attributes when constructing adapter");auto attr = ::mlir::impl::getAttrFromSortedRange(odsAttrs.begin() + 1, odsAttrs.end() - 0, FuncOp::getSymNameAttrName(*odsOpName)).cast<::mlir::StringAttr>();return attr;
}::llvm::StringRef FuncOpGenericAdaptorBase::getSymName() {auto attr = getSymNameAttr();return attr.getValue();
}::mlir::TypeAttr FuncOpGenericAdaptorBase::getFunctionTypeAttr() {assert(odsAttrs && "no attributes when constructing adapter");auto attr = ::mlir::impl::getAttrFromSortedRange(odsAttrs.begin() + 0, odsAttrs.end() - 1, FuncOp::getFunctionTypeAttrName(*odsOpName)).cast<::mlir::TypeAttr>();return attr;
}::mlir::FunctionType FuncOpGenericAdaptorBase::getFunctionType() {auto attr = getFunctionTypeAttr();return attr.getValue().cast<::mlir::FunctionType>();
}::mlir::ArrayAttr FuncOpGenericAdaptorBase::getArgAttrsAttr() {assert(odsAttrs && "no attributes when constructing adapter");auto attr = ::mlir::impl::getAttrFromSortedRange(odsAttrs.begin() + 0, odsAttrs.end() - 2, FuncOp::getArgAttrsAttrName(*odsOpName)).dyn_cast_or_null<::mlir::ArrayAttr>();return attr;
}::std::optional< ::mlir::ArrayAttr > FuncOpGenericAdaptorBase::getArgAttrs() {auto attr = getArgAttrsAttr();return attr ? ::std::optional< ::mlir::ArrayAttr >(attr) : (::std::nullopt);
}::mlir::ArrayAttr FuncOpGenericAdaptorBase::getResAttrsAttr() {assert(odsAttrs && "no attributes when constructing adapter");auto attr = ::mlir::impl::getAttrFromSortedRange(odsAttrs.begin() + 1, odsAttrs.end() - 1, FuncOp::getResAttrsAttrName(*odsOpName)).dyn_cast_or_null<::mlir::ArrayAttr>();return attr;
}::std::optional< ::mlir::ArrayAttr > FuncOpGenericAdaptorBase::getResAttrs() {auto attr = getResAttrsAttr();return attr ? ::std::optional< ::mlir::ArrayAttr >(attr) : (::std::nullopt);
}::mlir::Region &FuncOpGenericAdaptorBase::getBody() {return *odsRegions[0];
}::mlir::RegionRange FuncOpGenericAdaptorBase::getRegions() {return odsRegions;
}} // namespace detail
FuncOpAdaptor::FuncOpAdaptor(FuncOp op) : FuncOpAdaptor(op->getOperands(), op->getAttrDictionary(), op->getRegions()) {}::mlir::LogicalResult FuncOpAdaptor::verify(::mlir::Location loc) {auto namedAttrRange = odsAttrs;auto namedAttrIt = namedAttrRange.begin();::mlir::Attribute tblgen_function_type;::mlir::Attribute tblgen_arg_attrs;while (true) {if (namedAttrIt == namedAttrRange.end())return emitError(loc, "'toy.func' op ""requires attribute 'function_type'");if (namedAttrIt->getName() == FuncOp::getFunctionTypeAttrName(*odsOpName)) {tblgen_function_type = namedAttrIt->getValue();break;}else if (namedAttrIt->getName() == FuncOp::getArgAttrsAttrName(*odsOpName)) {tblgen_arg_attrs = namedAttrIt->getValue();}++namedAttrIt;}::mlir::Attribute tblgen_sym_name;::mlir::Attribute tblgen_res_attrs;while (true) {if (namedAttrIt == namedAttrRange.end())return emitError(loc, "'toy.func' op ""requires attribute 'sym_name'");if (namedAttrIt->getName() == FuncOp::getSymNameAttrName(*odsOpName)) {tblgen_sym_name = namedAttrIt->getValue();break;}else if (namedAttrIt->getName() == FuncOp::getResAttrsAttrName(*odsOpName)) {tblgen_res_attrs = namedAttrIt->getValue();}++namedAttrIt;}if (tblgen_sym_name && !((tblgen_sym_name.isa<::mlir::StringAttr>())))return emitError(loc, "'toy.func' op ""attribute 'sym_name' failed to satisfy constraint: string attribute");if (tblgen_function_type && !(((tblgen_function_type.isa<::mlir::TypeAttr>())) && ((tblgen_function_type.cast<::mlir::TypeAttr>().getValue().isa<::mlir::FunctionType>())) && ((tblgen_function_type.cast<::mlir::TypeAttr>().getValue().isa<::mlir::FunctionType>()))))return emitError(loc, "'toy.func' op ""attribute 'function_type' failed to satisfy constraint: type attribute of function type");if (tblgen_arg_attrs && !(((tblgen_arg_attrs.isa<::mlir::ArrayAttr>())) && (::llvm::all_of(tblgen_arg_attrs.cast<::mlir::ArrayAttr>(), [&](::mlir::Attribute attr) { return attr && ((attr.isa<::mlir::DictionaryAttr>())); }))))return emitError(loc, "'toy.func' op ""attribute 'arg_attrs' failed to satisfy constraint: Array of dictionary attributes");if (tblgen_res_attrs && !(((tblgen_res_attrs.isa<::mlir::ArrayAttr>())) && (::llvm::all_of(tblgen_res_attrs.cast<::mlir::ArrayAttr>(), [&](::mlir::Attribute attr) { return attr && ((attr.isa<::mlir::DictionaryAttr>())); }))))return emitError(loc, "'toy.func' op ""attribute 'res_attrs' failed to satisfy constraint: Array of dictionary attributes");return ::mlir::success();
}std::pair<unsigned, unsigned> FuncOp::getODSOperandIndexAndLength(unsigned index) {return {index, 1};
}::mlir::Operation::operand_range FuncOp::getODSOperands(unsigned index) {auto valueRange = getODSOperandIndexAndLength(index);return {std::next(getOperation()->operand_begin(), valueRange.first),std::next(getOperation()->operand_begin(), valueRange.first + valueRange.second)};
}std::pair<unsigned, unsigned> FuncOp::getODSResultIndexAndLength(unsigned index) {return {index, 1};
}::mlir::Operation::result_range FuncOp::getODSResults(unsigned index) {auto valueRange = getODSResultIndexAndLength(index);return {std::next(getOperation()->result_begin(), valueRange.first),std::next(getOperation()->result_begin(), valueRange.first + valueRange.second)};
}::mlir::Region &FuncOp::getBody() {return (*this)->getRegion(0);
}::mlir::StringAttr FuncOp::getSymNameAttr() {return ::mlir::impl::getAttrFromSortedRange((*this)->getAttrs().begin() + 1, (*this)->getAttrs().end() - 0, getSymNameAttrName()).cast<::mlir::StringAttr>();
}::llvm::StringRef FuncOp::getSymName() {auto attr = getSymNameAttr();return attr.getValue();
}::mlir::TypeAttr FuncOp::getFunctionTypeAttr() {return ::mlir::impl::getAttrFromSortedRange((*this)->getAttrs().begin() + 0, (*this)->getAttrs().end() - 1, getFunctionTypeAttrName()).cast<::mlir::TypeAttr>();
}::mlir::FunctionType FuncOp::getFunctionType() {auto attr = getFunctionTypeAttr();return attr.getValue().cast<::mlir::FunctionType>();
}::mlir::ArrayAttr FuncOp::getArgAttrsAttr() {return ::mlir::impl::getAttrFromSortedRange((*this)->getAttrs().begin() + 0, (*this)->getAttrs().end() - 2, getArgAttrsAttrName()).dyn_cast_or_null<::mlir::ArrayAttr>();
}::std::optional< ::mlir::ArrayAttr > FuncOp::getArgAttrs() {auto attr = getArgAttrsAttr();return attr ? ::std::optional< ::mlir::ArrayAttr >(attr) : (::std::nullopt);
}::mlir::ArrayAttr FuncOp::getResAttrsAttr() {return ::mlir::impl::getAttrFromSortedRange((*this)->getAttrs().begin() + 1, (*this)->getAttrs().end() - 1, getResAttrsAttrName()).dyn_cast_or_null<::mlir::ArrayAttr>();
}::std::optional< ::mlir::ArrayAttr > FuncOp::getResAttrs() {auto attr = getResAttrsAttr();return attr ? ::std::optional< ::mlir::ArrayAttr >(attr) : (::std::nullopt);
}void FuncOp::setSymNameAttr(::mlir::StringAttr attr) {(*this)->setAttr(getSymNameAttrName(), attr);
}void FuncOp::setSymName(::llvm::StringRef attrValue) {(*this)->setAttr(getSymNameAttrName(), ::mlir::Builder((*this)->getContext()).getStringAttr(attrValue));
}void FuncOp::setFunctionTypeAttr(::mlir::TypeAttr attr) {(*this)->setAttr(getFunctionTypeAttrName(), attr);
}void FuncOp::setFunctionType(::mlir::FunctionType attrValue) {(*this)->setAttr(getFunctionTypeAttrName(), ::mlir::TypeAttr::get(attrValue));
}void FuncOp::setArgAttrsAttr(::mlir::ArrayAttr attr) {(*this)->setAttr(getArgAttrsAttrName(), attr);
}void FuncOp::setResAttrsAttr(::mlir::ArrayAttr attr) {(*this)->setAttr(getResAttrsAttrName(), attr);
}::mlir::Attribute FuncOp::removeArgAttrsAttr() {return (*this)->removeAttr(getArgAttrsAttrName());
}::mlir::Attribute FuncOp::removeResAttrsAttr() {return (*this)->removeAttr(getResAttrsAttrName());
}::mlir::LogicalResult FuncOp::verifyInvariantsImpl() {auto namedAttrRange = (*this)->getAttrs();auto namedAttrIt = namedAttrRange.begin();::mlir::Attribute tblgen_function_type;::mlir::Attribute tblgen_arg_attrs;while (true) {if (namedAttrIt == namedAttrRange.end())return emitOpError("requires attribute 'function_type'");if (namedAttrIt->getName() == getFunctionTypeAttrName()) {tblgen_function_type = namedAttrIt->getValue();break;}else if (namedAttrIt->getName() == getArgAttrsAttrName()) {tblgen_arg_attrs = namedAttrIt->getValue();}++namedAttrIt;}::mlir::Attribute tblgen_sym_name;::mlir::Attribute tblgen_res_attrs;while (true) {if (namedAttrIt == namedAttrRange.end())return emitOpError("requires attribute 'sym_name'");if (namedAttrIt->getName() == getSymNameAttrName()) {tblgen_sym_name = namedAttrIt->getValue();break;}else if (namedAttrIt->getName() == getResAttrsAttrName()) {tblgen_res_attrs = namedAttrIt->getValue();}++namedAttrIt;}if (::mlir::failed(__mlir_ods_local_attr_constraint_Ops1(*this, tblgen_sym_name, "sym_name")))return ::mlir::failure();if (::mlir::failed(__mlir_ods_local_attr_constraint_Ops2(*this, tblgen_function_type, "function_type")))return ::mlir::failure();if (::mlir::failed(__mlir_ods_local_attr_constraint_Ops3(*this, tblgen_arg_attrs, "arg_attrs")))return ::mlir::failure();if (::mlir::failed(__mlir_ods_local_attr_constraint_Ops3(*this, tblgen_res_attrs, "res_attrs")))return ::mlir::failure();{unsigned index = 0; (void)index;for (auto &region : ::llvm::MutableArrayRef((*this)->getRegion(0)))if (::mlir::failed(__mlir_ods_local_region_constraint_Ops0(*this, region, "body", index++)))return ::mlir::failure();}return ::mlir::success();
}::mlir::LogicalResult FuncOp::verifyInvariants() {return verifyInvariantsImpl();
}} // namespace toy
} // namespace mlir
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::toy::FuncOp)namespace mlir {
namespace toy {//===----------------------------------------------------------------------===//
// ::mlir::toy::GenericCallOp definitions
//===----------------------------------------------------------------------===//namespace detail {
GenericCallOpGenericAdaptorBase::GenericCallOpGenericAdaptorBase(::mlir::DictionaryAttr attrs, ::mlir::RegionRange regions) : odsAttrs(attrs), odsRegions(regions) {  if (odsAttrs)odsOpName.emplace("toy.generic_call", odsAttrs.getContext());
}std::pair<unsigned, unsigned> GenericCallOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {bool isVariadic[] = {true};int prevVariadicCount = 0;for (unsigned i = 0; i < index; ++i)if (isVariadic[i]) ++prevVariadicCount;// Calculate how many dynamic values a static variadic operand corresponds to.// This assumes all static variadic operands have the same dynamic value count.int variadicSize = (odsOperandsSize - 0) / 1;// `index` passed in as the parameter is the static index which counts each// operand (variadic or not) as size 1. So here for each previous static variadic// operand, we need to offset by (variadicSize - 1) to get where the dynamic// value pack for this static operand starts.int start = index + (variadicSize - 1) * prevVariadicCount;int size = isVariadic[index] ? variadicSize : 1;return {start, size};
}::mlir::DictionaryAttr GenericCallOpGenericAdaptorBase::getAttributes() {return odsAttrs;
}::mlir::FlatSymbolRefAttr GenericCallOpGenericAdaptorBase::getCalleeAttr() {assert(odsAttrs && "no attributes when constructing adapter");auto attr = ::mlir::impl::getAttrFromSortedRange(odsAttrs.begin() + 0, odsAttrs.end() - 0, GenericCallOp::getCalleeAttrName(*odsOpName)).cast<::mlir::FlatSymbolRefAttr>();return attr;
}::llvm::StringRef GenericCallOpGenericAdaptorBase::getCallee() {auto attr = getCalleeAttr();return attr.getValue();
}} // namespace detail
GenericCallOpAdaptor::GenericCallOpAdaptor(GenericCallOp op) : GenericCallOpAdaptor(op->getOperands(), op->getAttrDictionary(), op->getRegions()) {}::mlir::LogicalResult GenericCallOpAdaptor::verify(::mlir::Location loc) {auto namedAttrRange = odsAttrs;auto namedAttrIt = namedAttrRange.begin();::mlir::Attribute tblgen_callee;while (true) {if (namedAttrIt == namedAttrRange.end())return emitError(loc, "'toy.generic_call' op ""requires attribute 'callee'");if (namedAttrIt->getName() == GenericCallOp::getCalleeAttrName(*odsOpName)) {tblgen_callee = namedAttrIt->getValue();break;}++namedAttrIt;}if (tblgen_callee && !((tblgen_callee.isa<::mlir::FlatSymbolRefAttr>())))return emitError(loc, "'toy.generic_call' op ""attribute 'callee' failed to satisfy constraint: flat symbol reference attribute");return ::mlir::success();
}std::pair<unsigned, unsigned> GenericCallOp::getODSOperandIndexAndLength(unsigned index) {bool isVariadic[] = {true};int prevVariadicCount = 0;for (unsigned i = 0; i < index; ++i)if (isVariadic[i]) ++prevVariadicCount;// Calculate how many dynamic values a static variadic operand corresponds to.// This assumes all static variadic operands have the same dynamic value count.int variadicSize = (getOperation()->getNumOperands() - 0) / 1;// `index` passed in as the parameter is the static index which counts each// operand (variadic or not) as size 1. So here for each previous static variadic// operand, we need to offset by (variadicSize - 1) to get where the dynamic// value pack for this static operand starts.int start = index + (variadicSize - 1) * prevVariadicCount;int size = isVariadic[index] ? variadicSize : 1;return {start, size};
}::mlir::Operation::operand_range GenericCallOp::getODSOperands(unsigned index) {auto valueRange = getODSOperandIndexAndLength(index);return {std::next(getOperation()->operand_begin(), valueRange.first),std::next(getOperation()->operand_begin(), valueRange.first + valueRange.second)};
}::mlir::Operation::operand_range GenericCallOp::getInputs() {return getODSOperands(0);
}::mlir::MutableOperandRange GenericCallOp::getInputsMutable() {auto range = getODSOperandIndexAndLength(0);auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second);return mutableRange;
}std::pair<unsigned, unsigned> GenericCallOp::getODSResultIndexAndLength(unsigned index) {return {index, 1};
}::mlir::Operation::result_range GenericCallOp::getODSResults(unsigned index) {auto valueRange = getODSResultIndexAndLength(index);return {std::next(getOperation()->result_begin(), valueRange.first),std::next(getOperation()->result_begin(), valueRange.first + valueRange.second)};
}::mlir::FlatSymbolRefAttr GenericCallOp::getCalleeAttr() {return ::mlir::impl::getAttrFromSortedRange((*this)->getAttrs().begin() + 0, (*this)->getAttrs().end() - 0, getCalleeAttrName()).cast<::mlir::FlatSymbolRefAttr>();
}::llvm::StringRef GenericCallOp::getCallee() {auto attr = getCalleeAttr();return attr.getValue();
}void GenericCallOp::setCalleeAttr(::mlir::FlatSymbolRefAttr attr) {(*this)->setAttr(getCalleeAttrName(), attr);
}void GenericCallOp::setCallee(::llvm::StringRef attrValue) {(*this)->setAttr(getCalleeAttrName(), ::mlir::SymbolRefAttr::get(::mlir::Builder((*this)->getContext()).getContext(), attrValue));
}void GenericCallOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type resultType0, ::mlir::FlatSymbolRefAttr callee, ::mlir::ValueRange inputs) {odsState.addOperands(inputs);odsState.addAttribute(getCalleeAttrName(odsState.name), callee);odsState.addTypes(resultType0);
}void GenericCallOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::FlatSymbolRefAttr callee, ::mlir::ValueRange inputs) {odsState.addOperands(inputs);odsState.addAttribute(getCalleeAttrName(odsState.name), callee);assert(resultTypes.size() == 1u && "mismatched number of results");odsState.addTypes(resultTypes);
}void GenericCallOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type resultType0, ::llvm::StringRef callee, ::mlir::ValueRange inputs) {odsState.addOperands(inputs);odsState.addAttribute(getCalleeAttrName(odsState.name), ::mlir::SymbolRefAttr::get(odsBuilder.getContext(), callee));odsState.addTypes(resultType0);
}void GenericCallOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::llvm::StringRef callee, ::mlir::ValueRange inputs) {odsState.addOperands(inputs);odsState.addAttribute(getCalleeAttrName(odsState.name), ::mlir::SymbolRefAttr::get(odsBuilder.getContext(), callee));assert(resultTypes.size() == 1u && "mismatched number of results");odsState.addTypes(resultTypes);
}void GenericCallOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) {odsState.addOperands(operands);odsState.addAttributes(attributes);assert(resultTypes.size() == 1u && "mismatched number of return types");odsState.addTypes(resultTypes);
}::mlir::LogicalResult GenericCallOp::verifyInvariantsImpl() {auto namedAttrRange = (*this)->getAttrs();auto namedAttrIt = namedAttrRange.begin();::mlir::Attribute tblgen_callee;while (true) {if (namedAttrIt == namedAttrRange.end())return emitOpError("requires attribute 'callee'");if (namedAttrIt->getName() == getCalleeAttrName()) {tblgen_callee = namedAttrIt->getValue();break;}++namedAttrIt;}if (::mlir::failed(__mlir_ods_local_attr_constraint_Ops4(*this, tblgen_callee, "callee")))return ::mlir::failure();{unsigned index = 0; (void)index;auto valueGroup0 = getODSOperands(0);for (auto v : valueGroup0) {if (::mlir::failed(__mlir_ods_local_type_constraint_Ops0(*this, v.getType(), "operand", index++)))return ::mlir::failure();}}{unsigned index = 0; (void)index;auto valueGroup0 = getODSResults(0);for (auto v : valueGroup0) {if (::mlir::failed(__mlir_ods_local_type_constraint_Ops0(*this, v.getType(), "result", index++)))return ::mlir::failure();}}return ::mlir::success();
}::mlir::LogicalResult GenericCallOp::verifyInvariants() {return verifyInvariantsImpl();
}::mlir::ParseResult GenericCallOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) {::mlir::FlatSymbolRefAttr calleeAttr;::llvm::SmallVector<::mlir::OpAsmParser::UnresolvedOperand, 4> inputsOperands;::llvm::SMLoc inputsOperandsLoc;(void)inputsOperandsLoc;::llvm::ArrayRef<::mlir::Type> inputsTypes;::llvm::ArrayRef<::mlir::Type> allResultTypes;if (parser.parseCustomAttributeWithFallback(calleeAttr, parser.getBuilder().getType<::mlir::NoneType>(), "callee",result.attributes)) {return ::mlir::failure();}if (parser.parseLParen())return ::mlir::failure();inputsOperandsLoc = parser.getCurrentLocation();if (parser.parseOperandList(inputsOperands))return ::mlir::failure();if (parser.parseRParen())return ::mlir::failure();if (parser.parseOptionalAttrDict(result.attributes))return ::mlir::failure();if (parser.parseColon())return ::mlir::failure();::mlir::FunctionType inputs__allResult_functionType;if (parser.parseType(inputs__allResult_functionType))return ::mlir::failure();inputsTypes = inputs__allResult_functionType.getInputs();allResultTypes = inputs__allResult_functionType.getResults();result.addTypes(allResultTypes);if (parser.resolveOperands(inputsOperands, inputsTypes, inputsOperandsLoc, result.operands))return ::mlir::failure();return ::mlir::success();
}void GenericCallOp::print(::mlir::OpAsmPrinter &_odsPrinter) {_odsPrinter << ' ';_odsPrinter.printAttributeWithoutType(getCalleeAttr());_odsPrinter << "(";_odsPrinter << getInputs();_odsPrinter << ")";::llvm::SmallVector<::llvm::StringRef, 2> elidedAttrs;elidedAttrs.push_back("callee");_odsPrinter.printOptionalAttrDict((*this)->getAttrs(), elidedAttrs);_odsPrinter << ' ' << ":";_odsPrinter << ' ';_odsPrinter.printFunctionalType(getInputs().getTypes(), getOperation()->getResultTypes());
}} // namespace toy
} // namespace mlir
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::toy::GenericCallOp)namespace mlir {
namespace toy {//===----------------------------------------------------------------------===//
// ::mlir::toy::MulOp definitions
//===----------------------------------------------------------------------===//namespace detail {
MulOpGenericAdaptorBase::MulOpGenericAdaptorBase(::mlir::DictionaryAttr attrs, ::mlir::RegionRange regions) : odsAttrs(attrs), odsRegions(regions) {  if (odsAttrs)odsOpName.emplace("toy.mul", odsAttrs.getContext());
}std::pair<unsigned, unsigned> MulOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {return {index, 1};
}::mlir::DictionaryAttr MulOpGenericAdaptorBase::getAttributes() {return odsAttrs;
}} // namespace detail
MulOpAdaptor::MulOpAdaptor(MulOp op) : MulOpAdaptor(op->getOperands(), op->getAttrDictionary(), op->getRegions()) {}::mlir::LogicalResult MulOpAdaptor::verify(::mlir::Location loc) {return ::mlir::success();
}std::pair<unsigned, unsigned> MulOp::getODSOperandIndexAndLength(unsigned index) {return {index, 1};
}::mlir::Operation::operand_range MulOp::getODSOperands(unsigned index) {auto valueRange = getODSOperandIndexAndLength(index);return {std::next(getOperation()->operand_begin(), valueRange.first),std::next(getOperation()->operand_begin(), valueRange.first + valueRange.second)};
}::mlir::TypedValue<::mlir::TensorType> MulOp::getLhs() {return ::llvm::cast<::mlir::TypedValue<::mlir::TensorType>>(*getODSOperands(0).begin());
}::mlir::TypedValue<::mlir::TensorType> MulOp::getRhs() {return ::llvm::cast<::mlir::TypedValue<::mlir::TensorType>>(*getODSOperands(1).begin());
}::mlir::MutableOperandRange MulOp::getLhsMutable() {auto range = getODSOperandIndexAndLength(0);auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second);return mutableRange;
}::mlir::MutableOperandRange MulOp::getRhsMutable() {auto range = getODSOperandIndexAndLength(1);auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second);return mutableRange;
}std::pair<unsigned, unsigned> MulOp::getODSResultIndexAndLength(unsigned index) {return {index, 1};
}::mlir::Operation::result_range MulOp::getODSResults(unsigned index) {auto valueRange = getODSResultIndexAndLength(index);return {std::next(getOperation()->result_begin(), valueRange.first),std::next(getOperation()->result_begin(), valueRange.first + valueRange.second)};
}void MulOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type resultType0, ::mlir::Value lhs, ::mlir::Value rhs) {odsState.addOperands(lhs);odsState.addOperands(rhs);odsState.addTypes(resultType0);
}void MulOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::Value lhs, ::mlir::Value rhs) {odsState.addOperands(lhs);odsState.addOperands(rhs);assert(resultTypes.size() == 1u && "mismatched number of results");odsState.addTypes(resultTypes);
}void MulOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) {assert(operands.size() == 2u && "mismatched number of parameters");odsState.addOperands(operands);odsState.addAttributes(attributes);assert(resultTypes.size() == 1u && "mismatched number of return types");odsState.addTypes(resultTypes);
}::mlir::LogicalResult MulOp::verifyInvariantsImpl() {{unsigned index = 0; (void)index;auto valueGroup0 = getODSOperands(0);for (auto v : valueGroup0) {if (::mlir::failed(__mlir_ods_local_type_constraint_Ops0(*this, v.getType(), "operand", index++)))return ::mlir::failure();}auto valueGroup1 = getODSOperands(1);for (auto v : valueGroup1) {if (::mlir::failed(__mlir_ods_local_type_constraint_Ops0(*this, v.getType(), "operand", index++)))return ::mlir::failure();}}{unsigned index = 0; (void)index;auto valueGroup0 = getODSResults(0);for (auto v : valueGroup0) {if (::mlir::failed(__mlir_ods_local_type_constraint_Ops0(*this, v.getType(), "result", index++)))return ::mlir::failure();}}return ::mlir::success();
}::mlir::LogicalResult MulOp::verifyInvariants() {return verifyInvariantsImpl();
}} // namespace toy
} // namespace mlir
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::toy::MulOp)namespace mlir {
namespace toy {//===----------------------------------------------------------------------===//
// ::mlir::toy::PrintOp definitions
//===----------------------------------------------------------------------===//namespace detail {
PrintOpGenericAdaptorBase::PrintOpGenericAdaptorBase(::mlir::DictionaryAttr attrs, ::mlir::RegionRange regions) : odsAttrs(attrs), odsRegions(regions) {  if (odsAttrs)odsOpName.emplace("toy.print", odsAttrs.getContext());
}std::pair<unsigned, unsigned> PrintOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {return {index, 1};
}::mlir::DictionaryAttr PrintOpGenericAdaptorBase::getAttributes() {return odsAttrs;
}} // namespace detail
PrintOpAdaptor::PrintOpAdaptor(PrintOp op) : PrintOpAdaptor(op->getOperands(), op->getAttrDictionary(), op->getRegions()) {}::mlir::LogicalResult PrintOpAdaptor::verify(::mlir::Location loc) {return ::mlir::success();
}std::pair<unsigned, unsigned> PrintOp::getODSOperandIndexAndLength(unsigned index) {return {index, 1};
}::mlir::Operation::operand_range PrintOp::getODSOperands(unsigned index) {auto valueRange = getODSOperandIndexAndLength(index);return {std::next(getOperation()->operand_begin(), valueRange.first),std::next(getOperation()->operand_begin(), valueRange.first + valueRange.second)};
}::mlir::TypedValue<::mlir::TensorType> PrintOp::getInput() {return ::llvm::cast<::mlir::TypedValue<::mlir::TensorType>>(*getODSOperands(0).begin());
}::mlir::MutableOperandRange PrintOp::getInputMutable() {auto range = getODSOperandIndexAndLength(0);auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second);return mutableRange;
}std::pair<unsigned, unsigned> PrintOp::getODSResultIndexAndLength(unsigned index) {return {index, 1};
}::mlir::Operation::result_range PrintOp::getODSResults(unsigned index) {auto valueRange = getODSResultIndexAndLength(index);return {std::next(getOperation()->result_begin(), valueRange.first),std::next(getOperation()->result_begin(), valueRange.first + valueRange.second)};
}void PrintOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Value input) {odsState.addOperands(input);
}void PrintOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::Value input) {odsState.addOperands(input);assert(resultTypes.size() == 0u && "mismatched number of results");odsState.addTypes(resultTypes);
}void PrintOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) {assert(operands.size() == 1u && "mismatched number of parameters");odsState.addOperands(operands);odsState.addAttributes(attributes);assert(resultTypes.size() == 0u && "mismatched number of return types");odsState.addTypes(resultTypes);
}::mlir::LogicalResult PrintOp::verifyInvariantsImpl() {{unsigned index = 0; (void)index;auto valueGroup0 = getODSOperands(0);for (auto v : valueGroup0) {if (::mlir::failed(__mlir_ods_local_type_constraint_Ops0(*this, v.getType(), "operand", index++)))return ::mlir::failure();}}return ::mlir::success();
}::mlir::LogicalResult PrintOp::verifyInvariants() {return verifyInvariantsImpl();
}::mlir::ParseResult PrintOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) {::mlir::OpAsmParser::UnresolvedOperand inputRawOperands[1];::llvm::ArrayRef<::mlir::OpAsmParser::UnresolvedOperand> inputOperands(inputRawOperands);  ::llvm::SMLoc inputOperandsLoc;(void)inputOperandsLoc;::mlir::Type inputRawTypes[1];::llvm::ArrayRef<::mlir::Type> inputTypes(inputRawTypes);inputOperandsLoc = parser.getCurrentLocation();if (parser.parseOperand(inputRawOperands[0]))return ::mlir::failure();if (parser.parseOptionalAttrDict(result.attributes))return ::mlir::failure();if (parser.parseColon())return ::mlir::failure();{::mlir::TensorType type;if (parser.parseCustomTypeWithFallback(type))return ::mlir::failure();inputRawTypes[0] = type;}if (parser.resolveOperands(inputOperands, inputTypes, inputOperandsLoc, result.operands))return ::mlir::failure();return ::mlir::success();
}void PrintOp::print(::mlir::OpAsmPrinter &_odsPrinter) {_odsPrinter << ' ';_odsPrinter << getInput();::llvm::SmallVector<::llvm::StringRef, 2> elidedAttrs;_odsPrinter.printOptionalAttrDict((*this)->getAttrs(), elidedAttrs);_odsPrinter << ' ' << ":";_odsPrinter << ' ';{auto type = getInput().getType();if (auto validType = type.dyn_cast<::mlir::TensorType>())_odsPrinter.printStrippedAttrOrType(validType);else_odsPrinter << type;}
}} // namespace toy
} // namespace mlir
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::toy::PrintOp)namespace mlir {
namespace toy {//===----------------------------------------------------------------------===//
// ::mlir::toy::ReshapeOp definitions
//===----------------------------------------------------------------------===//namespace detail {
ReshapeOpGenericAdaptorBase::ReshapeOpGenericAdaptorBase(::mlir::DictionaryAttr attrs, ::mlir::RegionRange regions) : odsAttrs(attrs), odsRegions(regions) {  if (odsAttrs)odsOpName.emplace("toy.reshape", odsAttrs.getContext());
}std::pair<unsigned, unsigned> ReshapeOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {return {index, 1};
}::mlir::DictionaryAttr ReshapeOpGenericAdaptorBase::getAttributes() {return odsAttrs;
}} // namespace detail
ReshapeOpAdaptor::ReshapeOpAdaptor(ReshapeOp op) : ReshapeOpAdaptor(op->getOperands(), op->getAttrDictionary(), op->getRegions()) {}::mlir::LogicalResult ReshapeOpAdaptor::verify(::mlir::Location loc) {return ::mlir::success();
}std::pair<unsigned, unsigned> ReshapeOp::getODSOperandIndexAndLength(unsigned index) {return {index, 1};
}::mlir::Operation::operand_range ReshapeOp::getODSOperands(unsigned index) {auto valueRange = getODSOperandIndexAndLength(index);return {std::next(getOperation()->operand_begin(), valueRange.first),std::next(getOperation()->operand_begin(), valueRange.first + valueRange.second)};
}::mlir::TypedValue<::mlir::TensorType> ReshapeOp::getInput() {return ::llvm::cast<::mlir::TypedValue<::mlir::TensorType>>(*getODSOperands(0).begin());
}::mlir::MutableOperandRange ReshapeOp::getInputMutable() {auto range = getODSOperandIndexAndLength(0);auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second);return mutableRange;
}std::pair<unsigned, unsigned> ReshapeOp::getODSResultIndexAndLength(unsigned index) {return {index, 1};
}::mlir::Operation::result_range ReshapeOp::getODSResults(unsigned index) {auto valueRange = getODSResultIndexAndLength(index);return {std::next(getOperation()->result_begin(), valueRange.first),std::next(getOperation()->result_begin(), valueRange.first + valueRange.second)};
}void ReshapeOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type resultType0, ::mlir::Value input) {odsState.addOperands(input);odsState.addTypes(resultType0);
}void ReshapeOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::Value input) {odsState.addOperands(input);assert(resultTypes.size() == 1u && "mismatched number of results");odsState.addTypes(resultTypes);
}void ReshapeOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) {assert(operands.size() == 1u && "mismatched number of parameters");odsState.addOperands(operands);odsState.addAttributes(attributes);assert(resultTypes.size() == 1u && "mismatched number of return types");odsState.addTypes(resultTypes);
}::mlir::LogicalResult ReshapeOp::verifyInvariantsImpl() {{unsigned index = 0; (void)index;auto valueGroup0 = getODSOperands(0);for (auto v : valueGroup0) {if (::mlir::failed(__mlir_ods_local_type_constraint_Ops0(*this, v.getType(), "operand", index++)))return ::mlir::failure();}}{unsigned index = 0; (void)index;auto valueGroup0 = getODSResults(0);for (auto v : valueGroup0) {if (::mlir::failed(__mlir_ods_local_type_constraint_Ops1(*this, v.getType(), "result", index++)))return ::mlir::failure();}}return ::mlir::success();
}::mlir::LogicalResult ReshapeOp::verifyInvariants() {return verifyInvariantsImpl();
}::mlir::ParseResult ReshapeOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) {::mlir::OpAsmParser::UnresolvedOperand inputRawOperands[1];::llvm::ArrayRef<::mlir::OpAsmParser::UnresolvedOperand> inputOperands(inputRawOperands);  ::llvm::SMLoc inputOperandsLoc;(void)inputOperandsLoc;::mlir::Type inputRawTypes[1];::llvm::ArrayRef<::mlir::Type> inputTypes(inputRawTypes);::llvm::SmallVector<::mlir::Type, 1> allResultTypes;if (parser.parseLParen())return ::mlir::failure();inputOperandsLoc = parser.getCurrentLocation();if (parser.parseOperand(inputRawOperands[0]))return ::mlir::failure();if (parser.parseColon())return ::mlir::failure();{::mlir::TensorType type;if (parser.parseCustomTypeWithFallback(type))return ::mlir::failure();inputRawTypes[0] = type;}if (parser.parseRParen())return ::mlir::failure();if (parser.parseOptionalAttrDict(result.attributes))return ::mlir::failure();if (parser.parseKeyword("to"))return ::mlir::failure();if (parser.parseTypeList(allResultTypes))return ::mlir::failure();result.addTypes(allResultTypes);if (parser.resolveOperands(inputOperands, inputTypes, inputOperandsLoc, result.operands))return ::mlir::failure();return ::mlir::success();
}void ReshapeOp::print(::mlir::OpAsmPrinter &_odsPrinter) {_odsPrinter << "(";_odsPrinter << getInput();_odsPrinter << ' ' << ":";_odsPrinter << ' ';{auto type = getInput().getType();if (auto validType = type.dyn_cast<::mlir::TensorType>())_odsPrinter.printStrippedAttrOrType(validType);else_odsPrinter << type;}_odsPrinter << ")";::llvm::SmallVector<::llvm::StringRef, 2> elidedAttrs;_odsPrinter.printOptionalAttrDict((*this)->getAttrs(), elidedAttrs);_odsPrinter << ' ' << "to";_odsPrinter << ' ';_odsPrinter << getOperation()->getResultTypes();
}} // namespace toy
} // namespace mlir
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::toy::ReshapeOp)namespace mlir {
namespace toy {//===----------------------------------------------------------------------===//
// ::mlir::toy::ReturnOp definitions
//===----------------------------------------------------------------------===//namespace detail {
ReturnOpGenericAdaptorBase::ReturnOpGenericAdaptorBase(::mlir::DictionaryAttr attrs, ::mlir::RegionRange regions) : odsAttrs(attrs), odsRegions(regions) {  if (odsAttrs)odsOpName.emplace("toy.return", odsAttrs.getContext());
}std::pair<unsigned, unsigned> ReturnOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {bool isVariadic[] = {true};int prevVariadicCount = 0;for (unsigned i = 0; i < index; ++i)if (isVariadic[i]) ++prevVariadicCount;// Calculate how many dynamic values a static variadic operand corresponds to.// This assumes all static variadic operands have the same dynamic value count.int variadicSize = (odsOperandsSize - 0) / 1;// `index` passed in as the parameter is the static index which counts each// operand (variadic or not) as size 1. So here for each previous static variadic// operand, we need to offset by (variadicSize - 1) to get where the dynamic// value pack for this static operand starts.int start = index + (variadicSize - 1) * prevVariadicCount;int size = isVariadic[index] ? variadicSize : 1;return {start, size};
}::mlir::DictionaryAttr ReturnOpGenericAdaptorBase::getAttributes() {return odsAttrs;
}} // namespace detail
ReturnOpAdaptor::ReturnOpAdaptor(ReturnOp op) : ReturnOpAdaptor(op->getOperands(), op->getAttrDictionary(), op->getRegions()) {}::mlir::LogicalResult ReturnOpAdaptor::verify(::mlir::Location loc) {return ::mlir::success();
}std::pair<unsigned, unsigned> ReturnOp::getODSOperandIndexAndLength(unsigned index) {bool isVariadic[] = {true};int prevVariadicCount = 0;for (unsigned i = 0; i < index; ++i)if (isVariadic[i]) ++prevVariadicCount;// Calculate how many dynamic values a static variadic operand corresponds to.// This assumes all static variadic operands have the same dynamic value count.int variadicSize = (getOperation()->getNumOperands() - 0) / 1;// `index` passed in as the parameter is the static index which counts each// operand (variadic or not) as size 1. So here for each previous static variadic// operand, we need to offset by (variadicSize - 1) to get where the dynamic// value pack for this static operand starts.int start = index + (variadicSize - 1) * prevVariadicCount;int size = isVariadic[index] ? variadicSize : 1;return {start, size};
}::mlir::Operation::operand_range ReturnOp::getODSOperands(unsigned index) {auto valueRange = getODSOperandIndexAndLength(index);return {std::next(getOperation()->operand_begin(), valueRange.first),std::next(getOperation()->operand_begin(), valueRange.first + valueRange.second)};
}::mlir::Operation::operand_range ReturnOp::getInput() {return getODSOperands(0);
}::mlir::MutableOperandRange ReturnOp::getInputMutable() {auto range = getODSOperandIndexAndLength(0);auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second);return mutableRange;
}std::pair<unsigned, unsigned> ReturnOp::getODSResultIndexAndLength(unsigned index) {return {index, 1};
}::mlir::Operation::result_range ReturnOp::getODSResults(unsigned index) {auto valueRange = getODSResultIndexAndLength(index);return {std::next(getOperation()->result_begin(), valueRange.first),std::next(getOperation()->result_begin(), valueRange.first + valueRange.second)};
}void ReturnOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState) {build(odsBuilder, odsState, std::nullopt); 
}void ReturnOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::ValueRange input) {odsState.addOperands(input);
}void ReturnOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) {odsState.addOperands(operands);odsState.addAttributes(attributes);assert(resultTypes.size() == 0u && "mismatched number of return types");odsState.addTypes(resultTypes);
}::mlir::LogicalResult ReturnOp::verifyInvariantsImpl() {{unsigned index = 0; (void)index;auto valueGroup0 = getODSOperands(0);for (auto v : valueGroup0) {if (::mlir::failed(__mlir_ods_local_type_constraint_Ops0(*this, v.getType(), "operand", index++)))return ::mlir::failure();}}return ::mlir::success();
}::mlir::LogicalResult ReturnOp::verifyInvariants() {if(::mlir::succeeded(verifyInvariantsImpl()) && ::mlir::succeeded(verify()))return ::mlir::success();return ::mlir::failure();
}::mlir::ParseResult ReturnOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) {::llvm::SmallVector<::mlir::OpAsmParser::UnresolvedOperand, 4> inputOperands;::llvm::SMLoc inputOperandsLoc;(void)inputOperandsLoc;::llvm::SmallVector<::mlir::Type, 1> inputTypes;inputOperandsLoc = parser.getCurrentLocation();if (parser.parseOperandList(inputOperands))return ::mlir::failure();if (!inputOperands.empty()) {if (parser.parseColon())return ::mlir::failure();if (parser.parseTypeList(inputTypes))return ::mlir::failure();}if (parser.parseOptionalAttrDict(result.attributes))return ::mlir::failure();if (parser.resolveOperands(inputOperands, inputTypes, inputOperandsLoc, result.operands))return ::mlir::failure();return ::mlir::success();
}void ReturnOp::print(::mlir::OpAsmPrinter &_odsPrinter) {if (!getInput().empty()) {_odsPrinter << ' ';_odsPrinter << getInput();_odsPrinter << ' ' << ":";_odsPrinter << ' ';_odsPrinter << getInput().getTypes();}::llvm::SmallVector<::llvm::StringRef, 2> elidedAttrs;_odsPrinter.printOptionalAttrDict((*this)->getAttrs(), elidedAttrs);
}void ReturnOp::getEffects(::llvm::SmallVectorImpl<::mlir::SideEffects::EffectInstance<::mlir::MemoryEffects::Effect>> &effects) {
}} // namespace toy
} // namespace mlir
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::toy::ReturnOp)namespace mlir {
namespace toy {//===----------------------------------------------------------------------===//
// ::mlir::toy::TransposeOp definitions
//===----------------------------------------------------------------------===//namespace detail {
TransposeOpGenericAdaptorBase::TransposeOpGenericAdaptorBase(::mlir::DictionaryAttr attrs, ::mlir::RegionRange regions) : odsAttrs(attrs), odsRegions(regions) {  if (odsAttrs)odsOpName.emplace("toy.transpose", odsAttrs.getContext());
}std::pair<unsigned, unsigned> TransposeOpGenericAdaptorBase::getODSOperandIndexAndLength(unsigned index, unsigned odsOperandsSize) {return {index, 1};
}::mlir::DictionaryAttr TransposeOpGenericAdaptorBase::getAttributes() {return odsAttrs;
}} // namespace detail
TransposeOpAdaptor::TransposeOpAdaptor(TransposeOp op) : TransposeOpAdaptor(op->getOperands(), op->getAttrDictionary(), op->getRegions()) {}::mlir::LogicalResult TransposeOpAdaptor::verify(::mlir::Location loc) {return ::mlir::success();
}std::pair<unsigned, unsigned> TransposeOp::getODSOperandIndexAndLength(unsigned index) {return {index, 1};
}::mlir::Operation::operand_range TransposeOp::getODSOperands(unsigned index) {auto valueRange = getODSOperandIndexAndLength(index);return {std::next(getOperation()->operand_begin(), valueRange.first),std::next(getOperation()->operand_begin(), valueRange.first + valueRange.second)};
}::mlir::TypedValue<::mlir::TensorType> TransposeOp::getInput() {return ::llvm::cast<::mlir::TypedValue<::mlir::TensorType>>(*getODSOperands(0).begin());
}::mlir::MutableOperandRange TransposeOp::getInputMutable() {auto range = getODSOperandIndexAndLength(0);auto mutableRange = ::mlir::MutableOperandRange(getOperation(), range.first, range.second);return mutableRange;
}std::pair<unsigned, unsigned> TransposeOp::getODSResultIndexAndLength(unsigned index) {return {index, 1};
}::mlir::Operation::result_range TransposeOp::getODSResults(unsigned index) {auto valueRange = getODSResultIndexAndLength(index);return {std::next(getOperation()->result_begin(), valueRange.first),std::next(getOperation()->result_begin(), valueRange.first + valueRange.second)};
}void TransposeOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::Type resultType0, ::mlir::Value input) {odsState.addOperands(input);odsState.addTypes(resultType0);
}void TransposeOp::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::Value input) {odsState.addOperands(input);assert(resultTypes.size() == 1u && "mismatched number of results");odsState.addTypes(resultTypes);
}void TransposeOp::build(::mlir::OpBuilder &, ::mlir::OperationState &odsState, ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) {assert(operands.size() == 1u && "mismatched number of parameters");odsState.addOperands(operands);odsState.addAttributes(attributes);assert(resultTypes.size() == 1u && "mismatched number of return types");odsState.addTypes(resultTypes);
}::mlir::LogicalResult TransposeOp::verifyInvariantsImpl() {{unsigned index = 0; (void)index;auto valueGroup0 = getODSOperands(0);for (auto v : valueGroup0) {if (::mlir::failed(__mlir_ods_local_type_constraint_Ops0(*this, v.getType(), "operand", index++)))return ::mlir::failure();}}{unsigned index = 0; (void)index;auto valueGroup0 = getODSResults(0);for (auto v : valueGroup0) {if (::mlir::failed(__mlir_ods_local_type_constraint_Ops0(*this, v.getType(), "result", index++)))return ::mlir::failure();}}return ::mlir::success();
}::mlir::LogicalResult TransposeOp::verifyInvariants() {if(::mlir::succeeded(verifyInvariantsImpl()) && ::mlir::succeeded(verify()))return ::mlir::success();return ::mlir::failure();
}::mlir::ParseResult TransposeOp::parse(::mlir::OpAsmParser &parser, ::mlir::OperationState &result) {::mlir::OpAsmParser::UnresolvedOperand inputRawOperands[1];::llvm::ArrayRef<::mlir::OpAsmParser::UnresolvedOperand> inputOperands(inputRawOperands);  ::llvm::SMLoc inputOperandsLoc;(void)inputOperandsLoc;::mlir::Type inputRawTypes[1];::llvm::ArrayRef<::mlir::Type> inputTypes(inputRawTypes);::llvm::SmallVector<::mlir::Type, 1> allResultTypes;if (parser.parseLParen())return ::mlir::failure();inputOperandsLoc = parser.getCurrentLocation();if (parser.parseOperand(inputRawOperands[0]))return ::mlir::failure();if (parser.parseColon())return ::mlir::failure();{::mlir::TensorType type;if (parser.parseCustomTypeWithFallback(type))return ::mlir::failure();inputRawTypes[0] = type;}if (parser.parseRParen())return ::mlir::failure();if (parser.parseOptionalAttrDict(result.attributes))return ::mlir::failure();if (parser.parseKeyword("to"))return ::mlir::failure();if (parser.parseTypeList(allResultTypes))return ::mlir::failure();result.addTypes(allResultTypes);if (parser.resolveOperands(inputOperands, inputTypes, inputOperandsLoc, result.operands))return ::mlir::failure();return ::mlir::success();
}void TransposeOp::print(::mlir::OpAsmPrinter &_odsPrinter) {_odsPrinter << "(";_odsPrinter << getInput();_odsPrinter << ' ' << ":";_odsPrinter << ' ';{auto type = getInput().getType();if (auto validType = type.dyn_cast<::mlir::TensorType>())_odsPrinter.printStrippedAttrOrType(validType);else_odsPrinter << type;}_odsPrinter << ")";::llvm::SmallVector<::llvm::StringRef, 2> elidedAttrs;_odsPrinter.printOptionalAttrDict((*this)->getAttrs(), elidedAttrs);_odsPrinter << ' ' << "to";_odsPrinter << ' ';_odsPrinter << getOperation()->getResultTypes();
}} // namespace toy
} // namespace mlir
MLIR_DEFINE_EXPLICIT_TYPE_ID(::mlir::toy::TransposeOp)#endif  // GET_OP_CLASSES

这篇关于MLIR入门系列系列学习笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/177674

相关文章

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python FastAPI入门安装使用

《PythonFastAPI入门安装使用》FastAPI是一个现代、快速的PythonWeb框架,用于构建API,它基于Python3.6+的类型提示特性,使得代码更加简洁且易于绶护,这篇文章主要介... 目录第一节:FastAPI入门一、FastAPI框架介绍什么是ASGI服务(WSGI)二、FastAP

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识