LLVM Cookbook

2023-10-28

链接

https://blog.csdn.net/qq_23599965/article/details/88344459

 

https://github.com/zy445566/llvm-guide-zh

万花筒:用LLVM实现语言(备注:万花筒(Kaleidoscope)是LLVM实现的语言名称)

在LLVM中构建JIT

LLVM’s Analysis and Transform Passes

 LLVM opt 选项 优化

其他的优化选项还有

  • adce: Aggressive Dead Code Elimination
  • bb-vectorize: Basic-Block Vectorization
  • constprop: Simple constant propagation
  • dce: Dead Code Elimination
  • deadargelim: Dead Argument Elimination
  • globaldce: Dead Global Elimination
  • globalopt: Global Variable Optimizer
  • gvn: Global Value Numbering
  • inline: Function Integration/Inlining
  • instcombine: Combine redundant instructions
  • licm: Loop Invariant Code Motion
  • loop: unswitch: Unswithch Loop
  • loweratomic: Lower atomic intrinsics to non-atomic form
  • lowerinvoke: Lower invokes to calls, for unwindless code generators
  • lowerswitch: Lower SwithcInsts to branches
  • mem2reg: Promote Memory to Registry
  • memcpyopt: MemCpy Optimization
  • simplifycfg: Simplify the CFG
  • sink: Code sinking
  • tailcallelim: Tail Call Elimination

可以在源码目录 test/Transforms/下找到测试代码。



作者:peteyuan
链接:https://www.jianshu.com/p/b0d8431cbab1
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

 

ADCE(Aggressive Dead Code Elimination).

https://dongaxis.github.io/2016/05/31/LLVM-optimization-ADCE/

迭代标记有哪些其他的指令使用了会被使用的指令

简单的描述一下算法:

  1. 假设存在这样一个集合worklist, 这个集合里面的所有的指令都是一定会被使用的;
  2. 那么我们遍历这个指令, 并将这个集合中的所有的指令标为有效。
  3. 假设当前遍历出来的指令为X, 那么检查当前有哪些其他的指令使用了这条指令, 并将使这些指令标记为有效, 最后吧这些指令加入worklist;
  4. 循环执行1, 如果worklist为空, 那么停止循环。
  5. 最后遍历所有的指令, 删除没有被标记为有效的指令。

 

3.4 -bb-vectorize:基本块向量化

此pass将基本块中的指令组合成向量指令。它遍历每个基本块,试图对兼容的指令进行配对,重复这个过程,直到没有为向量化选择额外的配对。当某对相容指令的输出被另一对相容指令用作输入时,这些对就是潜在向量化链的一部分。只有当指令对是长度超过某个阈值的链的一部分时,才会融合到向量指令中。此外,pass尝试为每对兼容指令找到可能的最佳链。这些启发式方法旨在防止向量化在不会提高结果代码性能的情况下发生。
--------------------- 

 

3.18 -gvn:全局值编号

此pass执行全局值编号,以消除全部和部分冗余指令。它还执行冗余负载消除。

 

3.28 -licm:循环不变的代码移动

此pass执行循环不变的代码移动,尝试从循环体中删除尽可能多的代码。它可以将代码提升到preheader块中,或者如果安全的话,将代码下沉到exit块中。此pass还促进循环中必须别名的内存位置驻留在寄存器中,从而提升和降低“不变”负载和存储。
此pass使用别名分析有两个目的:

  1. 将循环不变的加载和调用移出循环。如果我们能够确定循环内的加载或调用不会对存储的任何东西进行别名,我们就可以像其他指令一样提升或降低它。
  2. 内存的标量提升。如果在循环内部有一个存储指令,我们将尝试将存储移动到循环之后,而不是在循环内部。只有在以下几个条件为真时才会发生这种情况:
    1. 所存储的指针是循环不变的。
    2. 循环中没有可能别名指针的存储或加载。循环中没有对指针进行mod/ref的调用。

如果这些条件为真,我们可以提升指针循环中的加载和存储,以使用临时alloca 'd变量。然后,我们使用mem2reg功能为变量构造适当的SSA表单。

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LLVM Cookbook 的相关文章

  • 如何打包jar

    http www 2cto com kf 201204 129495 html 方法一 通过jar命令 jar命令的用法 下面是jar命令的帮助说明 用法 jar ctxui vfm0Me jar file manifest file en
  • Redis Cluster常用命令

    创建一个Redis Cluster redis cli cluster create host1 port1 host2 port2 host3 port3 查看node信息 redis cli p 7000 cluster nodes R
  • Excel 冻结窗格 - 锁定表格行和列

    Excel 冻结窗格 锁定表格行和列 在 Excel 中 冻结窗格用于实现锁定表格行和列的功能 如果表格的行数 列数较多时 一旦滚动屏幕 则标题行 列跟着滚动 在处理数据时难以分清各行 列数据对应的标题 冻结的标题增强表格编辑的直观性 在
  • springboot读取yml配置文件的三种方式

    文章目录 1 yml示例 2 Value 3 Environment 4 ConfigurationProperties 1 yml示例 name 胡思源 对象 person name name age 1 数组 aoteman 迪迦 赛罗
  • AlphaZero 完爆前辈 AlphaGo,这个人工智能新突破价值有多大?(转)

    原文地址 http 36kr com p 5106157 html 谷歌旗下人工智能公司 DeepMind 发布了一篇新论文 它讲述了团队如何利用 AlphaGo 的机器学习系统 构建了新的项目 AlphaZero AlphaZero 使用
  • Ubuntu上使终端显示Git分支(oh-my-zsh)

    oh my zsh是基于Zsh Zsh是一个Linux用户很少使用的power shell 这是由于大多数Linux产品安装 以及默认使用bash shell 的功能作了一个扩展 方便插件管理 主体自定义等 oh my zsh源码在 htt
  • AVPlayer AVPlayerItem cannot service a seek request with a completion handler until its status is AV

    AVPlayer seek时闪退 1832 398446 Terminating app due to uncaught exception NSInvalidArgumentException reason AVPlayerItem ca
  • 竞赛:图解循环数组--借助循环数组进行队列的模拟实现以及循环数组的理解讲解

    文章目录 队列的模拟实现 队列是什么 实现过程 实现原理 具体代码实现 循环数组 循环数组是什么 循环数组如何实现队列 实现原理 总结 队列的模拟实现 队列是什么 队列是一种数据结构 遵循的是先进先出 后进后出的原则 基于这个原则我们可以借
  • 如何培养你的团队

    不少小伙伴都问过我这样的题 你如何培养你的团队 先弄清楚为什么要培养 才能知道如何去培养 为什么要培养 因为团队成员希望从团队中技能得到提升 薪资得到提高 职位空间成长更大 而自己也能走向更高的岗位 如何辅助团队成员达成这些目标 就变得尤为
  • freeRTOS中断优先级

    本来想将正点原子freeRTOS中断优先级测试的代码用cube配置后移植 但发现开了freeRTOS中断优先级数最小是5测试不了屏蔽中断优先级 深入了解发现cube里面已经屏蔽好了 首先 中断优先级数越小 优先级越高 1 正点原子教程中 c
  • ElasticSearch索引数据版本(_version)控制(5.4版本)

    1 用于处理冲突 通常 当数据库因为请求冲突发生幻读问题时 有两种解决策略 悲观并发控制如 行级锁 这种方法被关系型数据库广泛使用 它假定有变更冲突可能发生 因此阻塞访问资源以防止冲突 一个典型的例子是读取一行数据之前先将其锁住 确保只有放
  • 第一人称FPS视角跟随(Unity3D官方script)

    Unity官方版本都已经更新的2017 2的了 官方的案例和使用脚本还是挺给力的 而且还经常有更新优化脚本 今天把官方的一个FPS视角脚本贴出来 同时加上了自己的一些理解注释 想要获得完整的官方案例 Standard Assets Exam
  • react新手入门文档

    React React 是什么 React是一个简单的javascript UI库 用于构建高效 快速的用户界面 它是一个轻量级库 因此很受欢迎 它遵循组件设计模式 声明式 编程范式 和 函数式编程 概念 以使前端应用程序更高效 它使用虚拟
  • 【ES】MySQL语法版的ES来了,搜索引擎可以如此简单

    背景 曾几何时 我也在幻想 开发者能不能不要浪费太多时间精力去学习各种产品不同的语法 毕竟人的精力和记忆都是有限的 浪费时间在这些差异上面 机会成本太高了 好不容易学会了 使用频率又不高 最后又忘了 一来一回何必呢 有这时间多陪陪家人不香吗
  • 科技产业的时尚产品——苹果公司

    传奇小子 在硅谷可能再没有谁比乔布斯更有传奇色彩 他是惟一一个在大学还没读完一年的美国工程原院士 他虽然没有正儿八经的毕业 但是也是上了两年哈佛的人 他入选院士的原因是 开创和发展个人电脑工业 乔布斯的生母因为在读书 所有将他送给别人收养
  • 运放内部电路分析

    1 首先看一个一个运放的内部的简图 下图为741运放的简化图 分为输入级 达林顿放大级 输出级 输入级 重要的关系式 ic1 ic3 ic4 得出 io ic4 ic2 即 io ic1 ic2 又有ic1 ic2 IA 又根据三极管的饱和
  • 【PyTorch】PyTroch中.view()函数的详细使用方法

    文章目录 一 view 函数简介 二 view 函数的使用方法 一 view 函数简介 PyTorch中的 view 函数是一个用于改变张量形状的方法 它类似于NumPy中的 reshape 函数 可以通过重新排列张量的维度来改变其形状 而
  • 4.2.2-测试应用程序平台配置

    测试应用程序平台配置 ID WSTG CONF 02 总结 正确配置构成应用程序体系结构的单个元素非常重要 以防止可能危及整个体系结构安全性的错误 审查和测试配置是创建和维护体系结构的关键任务 这是因为各种系统通常带有通用配置 这些配置可能
  • zabbix 6.4.4 邮件媒介 设置

    配置后 启用 测试
  • 树莓派驱动交叉编译失败的可能原因总结

    1 首先检查交叉编译工具和源码版本是否一样 2 交叉编译工具环境变量是否正确配置 3 config 文件是否成功获取 4 make menuconfig 裁剪库是否配置正确 5 编译的命令是否正确 有些复制会乱码 6 驱动源码路径下的 Ma

随机推荐

  • 剑指offer 学习笔记 二叉搜索树的第K大节点

    面试题54 二叉搜索树的第K大节点 给定一棵二叉搜索树 找出其中第K大的节点 该题问法有问题 应该问从小到大第K个节点值为多少 这样才是书上代码的含义 即中序遍历到第K个元素 以下代码以下图二叉搜索树为例 include
  • android 开发之Activity切换

    img http dl iteye com upload attachment 434571 821c3369 a3bd 357a a260 e5ebe255fa6c jpg img img http dl iteye com upload
  • std::string、QString和const char*的互相转换

    std string QString和const char 常常需要互相转换 可以比作刚需哈哈哈哈 这里就做一个互相转换的记录 方便自己也方便大家 1 std string转QString QString有一个静态函数QString fro
  • 深度学习系列之ANN

    到此 ANN网络从最基础的单层感知器 到为深度网络作模板延伸的BP网络 将模型结构 参数训练 算法都举例讲解的很透彻 为下面的CNN网络的学习打下坚实的基础 这个在线编辑器 体验太差了 好好写一篇长文章 想知道博客上与大家交流 转换过程太麻
  • 大数据的认知

    对大数据的简单认识 大家好我是皈心 是个刚刚走上大数据这个领域的标题萌新 希望各位大佬多多指教 这是我的第一个博客来说说自己对大数据的认识 对大数据创意环境的构想以及自己在第一次实训中的感受有些不对的地方还请见谅 一 对大数据的认识 大数据
  • Mac电脑-mysql密码忘了怎么处理

    1 关闭mysql服务 老版本 sudo usr local mysql support files mysql server stop mac新版本 sudo usr local bin mysql server stop 或者 系统偏好
  • CSS盒子模型-01-优先级-基本测试

    3 1优先级的介绍 特性 不同选择器具有不同的优先级 优先级高的选择器样式会覆盖优先级低选择器样式 优先级公式 继承 lt 通配符选择器 lt 标签选择器 lt 类选择器 lt id选择器 lt 行内样式 lt important 注意点
  • C#基础知识

    快捷键 占位符 Console WriteLine 第一个数字是 0 第二个数字是 1 第三个数字是 3 n1 n2 n3 能取消斜线的转义作用 将字符串按照编辑的原格式输出 string str 11 n11 System IO File
  • Spring事务详解与使用

    Spring事务核心对象 J2EE开发使用分层设计的思想进行 对于简单的业务层转调数据层的单一操作 事务开启在业务层或者数据层并无太大差别 当业务中包含多个数据层的调用时 需要在业务层开启事务 对数据层中多个操作进行组合并归属于同一个事务进
  • Unity接入IAP、服务器验单(Google Play)

    Unity接入IAP 服务器验单 Google Play 最近因为项目需要 被分配来做项目SDK接入以及上架相关事宜 搞了好几天关于Unity接入支付的SDK 接入很简单 卡的最久的就是服务器验单 google相关文档也不是很全 走通之后觉
  • eclipse的Toggle Block Selection Mode功能---列模式

    快捷键 Alf Shift A Toggle Block Selection Mode 块选择模式开关 用法 首先用快捷键或者toolbar打开选择模式 会出现一个十字 表明块选择模式已开启 选中要统一修改的块 可以从 剪贴板ctrl v替
  • 2020大数据技术体系结构图,你值得拥有

    大数据技术体系结构图 JAVA JAVAEE核心 hadoop生态体系及各种框架 spark生态体系 Flink生态体系 JAVA JAVAEE核心 hadoop生态体系及各种框架 spark生态体系 Flink生态体系 希望对大家有所帮助
  • [设计模式] GoF 23种经典设计模式

    原文链接 https www yuque com cppdev patterns zainii GOF设计模式 Gang of Four 四人帮 设计模式的经典书籍 设计模式 可复用面向对象软件的基础 是由四个人共同完成 故GOF设计模式特
  • Spring Boot学习笔记

    文章目录 Spring Boot Spring Boot 整合 JSP Spring Boot HTML Thymeleaf 常用语法 Spring Boot 数据校验 Spring Boot 整合 JDBC Spring Boot 整合
  • Python中创建Dataframe的方法

    介绍4种在Python中创建Dataframe的方法 1 由数组 list组成的字典创建DataFrame import pandas as pd import numpy as np In 1 data pd DataFrame name
  • 【图卷积神经网络】1-入门篇:为什么使用图神经网络(上)

    在本节中 将涵盖以下主要内容 为什么使用图 为什么学习图 为什么使用图神经网络 为什么使用图 首先需要回答的问题是 为什么对图感兴趣 图论是对图进行数学研究的学科 它已经成为理解复杂系统和关系的基本工具 图是一种将节点 也称为顶点 和连接这
  • 03.1-常见端口及攻击汇总

    常用端口号及攻击方向汇总 文件共享服务端口 端口号 端口说明 攻击方向 21 22 69 Ftp Tftp 文件传输协议 允许匿名的上传 下载 爆破和嗅探操作 2049 Nfs 服务 配置不当 139 Samba 爆破 未授权访问 远程代码
  • 利用Qt的pro文件中DEFINES实现条件宏

    想利用宏定义实现不同的代码功能 但不想每次都去代码里注释或者不注释相关的宏定义变量 在这种情况下 就可以在pro里面利用DEFINES字段实现相关宏的定义 例如pro里面加上 DEFINES MYTEST 在代码里就可以使用 ifdef M
  • 服务发现框架选型,Consul还是Zookeeper还是etcd

    背景 本文并不介绍服务发现的基本原理 除了一致性算法之外 其他并没有太多高深的算法 网上的资料很容易让大家明白上面是服务发现 想直接查看结论的同学 请直接跳到文末 目前 市面上有非常多的服务发现工具 Open Source Service
  • LLVM Cookbook

    链接 https blog csdn net qq 23599965 article details 88344459 https github com zy445566 llvm guide zh 万花筒 用LLVM实现语言 备注 万花筒