本文主要是介绍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 名字解释
项目 | 名字 | 概念 | 解释 |
1 | MLIR | Mulit-Level Intermediate Representation | MLIR希望为各种DSL提供一种中间表达形式,将他们集成为一套生态系统,使用一种一致性强的方式编译到特定硬件平台的汇编语言上。利用这样的形式,MLIR就可以利用它模块化、可扩展的特点来解决IR之间相互配合的问题。 |
2 | DSL | Domain 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分析器,生成目标语言。
| |
4 | AST | Abstract Syntax Tree | 抽象语法树,源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。 |
5 | ODS | Operation Definition Specification | Operation Definition Specification (ODS)框架是基于TableGen规范构造的。见:【从零开始学深度学习编译器】十六,MLIR ODS要点总结上篇 - 知乎 |
6 | MLIR三要素 |
|
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 ®ion, ::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 ®ion : ::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入门系列系列学习笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!