摘要:
这一部分想给出一个完整的例子,来利用IRBuilder建立func_sum,并完成对齐的调用。(网上应该有完整的说明,忘记是哪里来的,留在这里方便记录,找到来源后附链接)来实现类似的功能: int sum(int n){ int i = 1; int sum = 0; while(i<=n){ su 阅读全文
摘要:
看了下最新的TVM,已经到了0.8版本,整个TVM软件stack也发生了比较大的变化,准备追一下进行介绍。整体节奏大概是先做一篇Introduction,之后会翻译一些tutorial,后边会结合一些真实的Op进行。 整个TVM的结构现在已经变成了 从前到后可以分为这么几个部分(参考了其他博客的一些 阅读全文
摘要:
本来想直接把这一部分内容放到那一部分的,但是感觉篇幅有点太长了,就拆出新的一部分来发了。 接着上边的内容来说,本文会从一个相对比较复杂的project出发,来介绍使用clang来切换gcc的过程。 因为之前说想找到一个合适的project和一个合适的过程来介绍,后边就想到或许可以尝试下OpenCV来 阅读全文
摘要:
Clang教程之实现源源变化(5) 其实我也没想到会有这一节。一直有人在说AST上只有抽象的语法结构,没有CFG信息,不能实现某某功能等等,但就实际来说,目前的clang上边,通过AST的Anslysis也能实现一些控制流相关的东西,确实没有IR上进行比较方便和功能丰富。 先介绍下这一节要用到的一个 阅读全文
摘要:
经过多年的发展,LLVM事实上已经对大部分语言进行了支持,其完备的功能和好的模块化和轻耦合的特性得到了很多人的认可,但是在很多传统领域,实际上的编译器还是gcc(基础设施),大部分人如果想使用LLVM对gcc进行替换时,会遇到一些麻烦。Clang的官网上对这个地方有个说明:The 'clang' d 阅读全文
摘要:
本节介绍一段对LLVM 的Function进行遍历的过程,遍历过程中统计每个Function内的BasicBlock数目和指令数目,同时统计所有的operand出现的次数。 因为涉及到IR的东西,UserManual手册为: https://llvm.org/docs/LangRef.html 。真 阅读全文
摘要:
这一节介绍一点getelementptr指令的处理。 https://llvm.org/docs/LangRef.html#getelementptr-instruction 这条指令一般用来获取指向结构体指针和指向数组元素的指针操作。语法如下: <result> = getelementptr < 阅读全文
摘要:
这里介绍LLVM或者所有编译器中非常重要的一种结构,def-use链,或者叫DU-chain。说是DU,实际上除了def-use,还有use-def的存在。 通常,我们可能有Value类的一个实例,并且我们想确定哪些使用者使用了该Value。我们将具有特定值的所有用户的列表称为def-use链。 另 阅读全文
摘要:
本节将介绍一种特殊的IR指令——PHINode。 关于PHI,首先需要介绍SSA静态单赋值https://en.wikipedia.org/wiki/Static_single_assignment_form 为了实现SSA,需要将类似的branch语句: int max(int a, int b) 阅读全文
摘要:
LLVM Pass框架是LLVM系统的重要组成部分,因为LLVM Pass负责LLVM编译器绝大部分的工作。 构成编译器的Pass执行各种转换和优化,在转换中使用的前边Pass的分析结果。所有的类实现都必须继承至Pass基类,一般来说可供使用的Pass类型一般包括 ModulePass , Call 阅读全文