LLVM安装使用

LLVM

  • LLVM
  • MLIR
    • Tutorial
      • [T1 Toy语言和对应的AST](#T1 Toy语言和对应的AST)
      • [T2 产生基础的MLIR](#T2 产生基础的MLIR)
      • [T3 高级语言特定分析和变换](#T3 高级语言特定分析和变换)
      • [T4 用接口使用通用变换](#T4 用接口使用通用变换)
      • [T5 部分下降低级方言的优化](#T5 部分下降低级方言的优化)
      • [T6 下降到LLVM和CodeGeneration](#T6 下降到LLVM和CodeGeneration)
      • [T7 给Toy增加复合类型](#T7 给Toy增加复合类型)

LLVM

LLVM官方的下载在github上,下载速度很缓慢,可以用tuna提供的二进制下载位置 。其中包括很多工具,比如格式检查工具clang-format,可以配置到VsCode里的LSP工具llvm-lsp。

windows

  • 终端:可以选择git bash

    • 安装git bash,基于msys2的简化版,缺少了很多软件。
    • msys2是windows上一系列软件集合,提供了UCRT64 环境,基于mingw64
  • VSCode

Debug

MLIR

Tutorial

官方提供了Tutorial代码,位于mlir的文件夹中,因此第一步需要跟随Get Started编译llvm项目。

T1 Toy语言和对应的AST

教程提供了使用递归下降算法实现的编译器,产生对应的AST。

T2 产生基础的MLIR

  • 定义Toy Operation,使用 CRTP风格继承mlir::Op
  • Op和Operation均和操作相关
    • Operation是不透明的
    • op是Operation*的智能指针语法糖,可以通过LLVM的casting基础设施来得到llvm::dyn_cast<ConstantOp>(operation)
  • 操作定义规格(ODS)框架
    • Toy_Op基础类型,可以把CRTP风格放入Toy_Op的模板中,后续的Op直接继承Toy_Op

T3 高级语言特定分析和变换

  • 有两种方式可以实现 模式-对应的变换
    • 命令式:使用C++
    • 声明式:使用 声明重写规则(DRR),但是要和ODS搭配使用。
  • 当前clang无法优化临时数组,比如教程里举的两个transpose的叠加
  • 在Canonicalization pass 中可以按照贪心递归的方式应用变换
  • 命令式:使用transpose作为例子
    • 需要在include/toy/Ops.td文件中设置hasCanonicalizer=1,代表::getCanonicalizationPatterns()必须要被定义;[Pure]特性trait可以去除死代码;
    • ::getCanonicalizationPatterns()函数中注册新的patter到Canonicaliztion pass中
    • 在PassManager中的Func层级增加优化pipeline:pm.addNestedPass<mlir::toy::FuncOp>(mlir::createCanonicalizerPass())
  • 声明式:使用reshape
    • 在mlir/ToyCombine.td定义
    • 编译后产生ToyCombine.inc
    • 可以增加条件判断Constraint<>,调用c++函数NativeCodeCall

T4 用接口使用通用变换

上一节中使用的注册方式扩展性不好,接口可以提供更通用的方式。这一节介绍通过内联和形状传播进行形状推导。

  • 内联:把所有操作放在一个函数内,为下一步的过程内形状传播做准备
    • 用operation interface来标记操作call-like或者callable-like。toy.generic_call是调用toy.func是函数.
    • FuncOp的traits包含了FucntionOpInterface,继承自CallableOpInterface;GenericCallOp包含DeclareOpInterfaceMethods<CallOpInterface>
    • pm.addPass(mlir::creawteInlinePass())
  • 过程内(intraprocedural)形状传播
    • 使用ODS框架定义ShaperInferenceOpInterface
    • 继承了ShpaeInferenceOpInterface的Op均需要定义ShapeInferenceOpInterface里定义的函数inferShapes
    • 构造ShapeInferencePass并定义runOnOperation
    • 注册Passpm.addPass

T5 部分下降低级方言的优化

T6 下降到LLVM和CodeGeneration

T7 给Toy增加复合类型

相关推荐
悟乙己44 分钟前
AFAC2026 赛题四金融长文本 Agent竞赛学习笔记:关联技术(二)
笔记·学习·金融
yi0111 小时前
LeetCode 424. 替换后的最长重复字符|不定长滑动窗口:如何判断窗口是否合法?
笔记·python·算法·leetcode·双指针·滑动窗口
杨逢昌工厂6S管理2 小时前
116——杨逢昌:归位三定闭环法的旺季轻量化执行方案与工具清单
经验分享·笔记·职场和发展·学习方法
想喝奶茶啾啾2 小时前
AMBA CHI架构以及规范中使用的术语 翻译笔记(1)
笔记·arm·chi
yi0113 小时前
LeetCode 3. 无重复字符的最长子串|不定长滑动窗口:什么时候更新最大值?
笔记·python·算法·leetcode·双指针·滑动窗口
Water_based3 小时前
水性滚涂漆应用于滚喷机小五金件喷涂工艺详解
经验分享·笔记·产品经理
只愿云淡风清4 小时前
正则表达式学习笔记-01 正则表达式的来源
笔记·学习·正则表达式
ljt27249606615 小时前
Vue笔记(十三)--mixin
vue.js·笔记
启观川5 小时前
数据结构与算法 -第 3 章 常用算法-回溯算法
数据结构·笔记·python·算法
启观川13 小时前
数据结构与算法 -第 3 章 常用算法-动态规划
数据结构·笔记·python·算法