今天找了一天的在LLVM中如何进行代码优化的方法。

一开始在谷歌搜索LLVM JIT,看到了LLVM的官方教程:
1. Building a JIT: Starting out with KaleidoscopeJIT
1.构建JIT:从KaleidoscopeJIT开始
然后我看得头都要大了,而且仍然不知道改怎么进行中间代码优化。
我看到了另一篇博客:编译器架构的王者LLVM——(12)使用JIT引擎,写得不错,但帮助不大。


随后我看了stackoverflow上的 一个提问:Call LLVM Jit from c program
里面的问题是如何在LLVM中读取bc文件,也就是LLVM 中间代码(LLVM ir bitcode),然后进行运行。
示例代码如下:

#include <string>
#include <memory>
#include <iostream>#include <llvm/LLVMContext.h>
#include <llvm/Target/TargetSelect.h>
#include <llvm/Bitcode/ReaderWriter.h>
#include <llvm/ExecutionEngine/ExecutionEngine.h>
#include <llvm/ModuleProvider.h>
#include <llvm/Support/MemoryBuffer.h>
#include <llvm/ExecutionEngine/JIT.h>using namespace std;
using namespace llvm;int main()
{InitializeNativeTarget();llvm_start_multithreaded();LLVMContext context;string error;Module *m = ParseBitcodeFile(MemoryBuffer::getFile("tst.bc"), context, &error);ExecutionEngine *ee = ExecutionEngine::create(m);Function* func = ee->FindFunctionNamed("main");typedef void (*PFN)();PFN pfn = reinterpret_cast<PFN>(ee->getPointerToFunction(func));pfn();delete ee;
}

以及还有几个相关的提问:

  • c++ - Can I bind an existing method to a LLVM Function* and use it from JIT-compiled code? - Stack Overflow
  • c++ - How to generate machine code with llvm - Stack Overflow

然后我看到了另一个提问:c++ - LLVM: simple example of a just-in-time compilation - Stack Overflow。
有一个回答是推荐使用官方做的教程提供的KaleidoscopeJIT.h
代码如下:

// Your existing includes here.
#include "llvm/Support/TargetSelect.h" // For InitializeNativeTarget() etc.
#include "KaleidoscopeJIT.h" int main() {// Your existing main body here.InitializeNativeTarget();InitializeNativeTargetAsmPrinter();InitializeNativeTargetAsmParser();orc::KaleidoscopeJIT jit;MyModule->setDataLayout(jit.getTargetMachine().createDataLayout());auto moduleHandle = jit.addModule(std::move(MyModule)); // JIT-compile MyModule.auto symbol = jit.findSymbol("sum"); // Get the compiled sum function.auto sumFunc = (int(*)(int, int)) symbol.getAddress(); // Cast it.auto result = sumFunc(42, 42); // Call it.assert(result == 84); // Voilà.
}

这个解决方法不错,但我是在做自己的编译器,想要的是官方自带的优化。


然后我在写文章:在Python中使用LLVM接口:llvmpy和llvmlite
我看到了llvmlite官方文档中的Optimization passesLLVM gives you the opportunity to fine-tune optimization passes. Optimization passes are managed by a pass manager.
然后我找到了我需要的问题和回答:LLVM Optimization Using C++ API - Stack Overflow
使用方法如下:

头文件这么多的原因是我也不知道哪些头文件有用,于是全放上来了。
我使用的LLVM的版本是LLVM 3.9。

#include "llvm/Analysis/AssumptionCache.h"#include "llvm/Analysis/InlineCost.h"#include "llvm/Analysis/ProfileSummaryInfo.h"#include "llvm/Analysis/TargetLibraryInfo.h"#include "llvm/Analysis/TargetTransformInfo.h"#include "llvm/IR/CallSite.h"#include "llvm/IR/CallingConv.h"#include "llvm/IR/DataLayout.h"#include "llvm/IR/Instructions.h"#include "llvm/IR/Module.h"#include "llvm/IR/Type.h"#include "llvm/Transforms/IPO.h"
#include <llvm/IR/Value.h>
#include <llvm/IR/LLVMContext.h>
#include <llvm/IR/IRBuilder.h>
#include <llvm/IR/Module.h>
#include <llvm/IR/LegacyPassManager.h>
#include <llvm/IR/IRPrintingPasses.h>
#include "llvm/Pass.h"
#include "llvm/IR/Function.h"
#include "llvm/Support/raw_ostream.h"
#include <llvm/Support/raw_ostream.h>
#include "llvm/ADT/iterator_range.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ExecutionEngine/ExecutionEngine.h"
#include "llvm/ExecutionEngine/JITSymbolFlags.h"
#include "llvm/ExecutionEngine/RTDyldMemoryManager.h"
#include "llvm/ExecutionEngine/RuntimeDyld.h"
#include "llvm/ExecutionEngine/SectionMemoryManager.h"
#include "llvm/ExecutionEngine/Orc/CompileUtils.h"
#include "llvm/ExecutionEngine/Orc/JITSymbol.h"
#include "llvm/ExecutionEngine/Orc/IRCompileLayer.h"
#include "llvm/ExecutionEngine/Orc/LambdaResolver.h"
#include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/Mangler.h"
#include "llvm/Support/DynamicLibrary.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Transforms/IPO/PassManagerBuilder.h"static string optimize(string llvm) {using namespace llvm;llvm::legacy::PassManager *pm = new llvm::legacy::PassManager();int optLevel = 3;int sizeLevel = 0;PassManagerBuilder builder;builder.OptLevel = optLevel;builder.SizeLevel = sizeLevel;builder.Inliner = createFunctionInliningPass(optLevel, sizeLevel);builder.DisableUnitAtATime = false;builder.DisableUnrollLoops = false;builder.LoopVectorize = true;builder.SLPVectorize = true;builder.populateModulePassManager(*pm);}

更多内容参考官方文档:Writing an LLVM Pass — LLVM 9 documentation

在C++中使用LLVM的JIT功能进行代码优化:Optimization passes--PassManagerBuilder相关推荐

  1. 计图(Jittor) 1.1版本:新增骨干网络、JIT功能升级、支持多卡训练

    计图(Jittor) 1.1版本:新增骨干网络.JIT功能升级.支持多卡训练 深度学习框架-计图(Jittor),Jittor的新版本V1.1上线了.主要变化包括: • 增加了大量骨干网络的支持,增强 ...

  2. jit即时编译_热点中的即时编译器(JIT)

    jit即时编译 即时编译器(JIT)的概念以及更广泛的自适应优化是除Java(.Net,Lua,JRuby)之外的许多语言中众所周知的概念. 为了解释什么是JIT编译器,我想先定义一个编译器概念. 根 ...

  3. rowbounds分页oracle,Oracle使用MyBatis中RowBounds实现分页查询功能

    Oracle中分页查询因为存在伪列rownum,sql语句写起来较为复杂,现在介绍一种通过使用MyBatis中的RowBounds进行分页查询,非常方便. 使用MyBatis中的RowBounds进行 ...

  4. SAP MM IV中的Duplicated Invoice Check功能的测试

    SAP MM IV中的Duplicated Invoice Check功能的测试 进入如下界面: 比如1000公司代码下我勾选了Check Company Code和Check Reference标记 ...

  5. android studio 前言中不允许有内容_Android Studio 中 System Trace 的新增功能

    在 Android Studio 4.0 中,我们已经对 CPU Profiler 的 UI 做了大量调整来提供更加直观的工作流记录,而在 Android Studio 4.1 中,我们基于开发者们的 ...

  6. oracle导入excel字段超过4000字符数据_产品思考:B端产品中,为什么批量导入功能很重要?...

    B端产品的重要价值是提高企业的办公效率,在企业的日常工作中批量录入数据的场景很多,所以批量导入是b端设计中很重要的一个功能.本文作者结合案例,分享了自己关于B端产品批量导入功能的思考. 在做b端产品的 ...

  7. wps中的相交_PPT中最好用的一个功能,非它莫属了~

    来自:利兄日志(ID:lixiongppt)作者:利兄 千呼万唤始出来~ 大家催了好久了,今天就详细和大家聊聊PPT中最好用的一个功能-布尔运算. 之前我在文章中反复提过这个词,但是很多人依然不会用, ...

  8. 文本编辑器中实现自定义编辑框中字体和大小的功能

    文章目录 1 文本编辑器中实现自定义编辑框中字体和大小的功能 1 文本编辑器中实现自定义编辑框中字体和大小的功能 实现思路: 通过QFontDialog选择字体及大小. 将QFont对象设置到文本编辑 ...

  9. Pandas中兼并数组和字典功能的Series 2013-03-24 11:24:00 分类: Python/Ruby In [2]: # 这段代码用于并排显示多个Series对象 from it

    Pandas中兼并数组和字典功能的Series 2013-03-24 11:24:00 分类: Python/Ruby In [2]: # 这段代码用于并排显示多个Series对象 from iter ...

最新文章

  1. PHP如何更好的利用PHPstorm的自动提示
  2. 1. vi 与 vim 有什么区别呢,它们之间有什么关系?
  3. F - Prime Path POJ - 3126
  4. 手机上 a 标签妙用
  5. eclipse中生成的html存在中文乱码问题的解决方法
  6. 将0~N打乱顺序,然后排序
  7. 数据结构:详解KMP算法,手工求解next、nextval数组,求模式串的比较次数例题
  8. 如何自动化识别异常数据?达到智能预警?
  9. Android应用程序消息处理机制(Looper、Handler)分析(5)
  10. Java Object类的各个方法
  11. 《用户故事与敏捷方法》阅读笔记三
  12. jvm 参数_一文带你深入了解JVM内存模型与JVM参数详细配置
  13. 中limit怎末用_Nginx配置——关于limit_conn_zone和limit_conn
  14. 超级LINUX VOD系统介绍
  15. 在Mac上安装ie10浏览器
  16. WPF入门教程系列(4)
  17. 解决编译glad卡在glad opening的问题
  18. 第一次亲密接触——二狗子初识 CDN
  19. 【透视课笔记】L2室内空间与人物
  20. keil 5 : Error: L6218E: Undefined symbol 问题解决方法小记

热门文章

  1. OpenCV | 分水岭算法进行图像分割
  2. Scanpy(四).细胞分化轨迹推断
  3. mysql表分区占用存储_MySQL 分区分表应用场景分析和分区中可能遇到的坑点
  4. html靶心制作,用PS单色填充制作一个靶心
  5. 基于USEARCH或QIIME绘制Alpha多样性稀释曲线(rarefraction curve)
  6. 基础004:R语言数据处理和变换——dplyr
  7. 微生物组入门必读+宏基因组实操课程=新老司机赶快上车
  8. python使用matplotlib可视化包含倒影的柱状图(bar plot with shadow)、配置rcParams坐标轴正确显示负号(-)
  9. pandas索引复合索引dataframe数据、索引其中多个水平(level)的多个数据行(index rows from different levels)、使用元组tuple表达复合索引的指定行
  10. R语言使用edit函数在Rsudio中生成数据编辑器(在windows中生成编辑器)、在编辑器中输出需要的数据生成最终的dataframe