当前位置:网站首页>Llvm - generate for loop
Llvm - generate for loop
2022-04-23 15:04:00 【Mrpre】
1、 Generating function
2、 Use Phi Expression implementation for loop
3、 In this case ,KaleidoscopeJIT The source code is located in ./llvm-8.0.1.src/examples/Kaleidoscope/include/KaleidoscopeJIT.h
Phi The concept of can be referred to https://stackoverflow.com/questions/11485531/what-exactly-phi-instruction-does-and-how-to-use-it-in-llvm
In this case , Generated llvm ir as follows :
define double @myfor(double %a) {
myentry:
br label %loop
loop: ; preds = %loop, %myentry
%i = phi double [ 0.000000e+00, %myentry ], [ %nextvar, %loop ]
%a1 = fadd double %a, 2.000000e+00
%nextvar = fadd double 1.000000e+00, %i
%cmptmp = fcmp ult double %i, 1.000000e+01
br i1 %cmptmp, label %loop, label %afterloop
afterloop: ; preds = %loop
ret double %a1
}
phi The logic of , If from myentry Come on ( Like just coming in ), be %i Namely 0, otherwise %i The value is %nextvar( For example, after a cycle )
Code :
#include "./llvm-8.0.1.src/examples/Kaleidoscope/include/KaleidoscopeJIT.h"
#include "llvm/ADT/APFloat.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/LegacyPassManager.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/Verifier.h"
#include "llvm/Support/TargetSelect.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Transforms/InstCombine/InstCombine.h"
#include "llvm/Transforms/Scalar.h"
#include "llvm/Transforms/Scalar/GVN.h"
#include <string>
#include <vector>
#include <iostream>
using namespace std;
using namespace llvm;
using namespace llvm::orc;
//LLVM items
static LLVMContext TheContext;
static IRBuilder<> Builder(TheContext);
static std::unique_ptr<Module> TheModule;
//JIT
static std::unique_ptr<KaleidoscopeJIT> TheJIT;
/* *double myfor(double a) *{ * for(i = 0; i < a; i++) { * a = a + 1 * } * return a *} * */
int main()
{
InitializeNativeTarget();
InitializeNativeTargetAsmPrinter();
//init module
TheModule = llvm::make_unique<Module>("myjit", TheContext);
//used to be runned by jit later
TheJIT = llvm::make_unique<KaleidoscopeJIT>();
TheModule->setDataLayout(TheJIT->getTargetMachine().createDataLayout());
//define the args
vector<std::string> ArgNames;
//myfor has 1 args
ArgNames.push_back(string("a"));
//make the 1 args attach to LLVM Type::double
std::vector<Type *> Doubles(ArgNames.size(), Type::getDoubleTy(TheContext));
//generate llvm function type
FunctionType *FT = FunctionType::get(Type::getDoubleTy(TheContext), Doubles, false);
//Create function whose FunctionType is FT
Function *TheFunction = Function::Create(FT, Function::ExternalLinkage, "myfor", TheModule.get());
//give the name of Function args and save the args as innerargs
unsigned Idx = 0;
std::vector<Value *>innerargs;
for (auto &Arg : TheFunction->args()) {
Arg.setName(ArgNames[Idx++]);
innerargs.push_back(&Arg);
}
//this function's basic block
BasicBlock *BB = BasicBlock::Create(TheContext, "myentry", TheFunction);
//create the loop BasicBlock
BasicBlock *LoopBB = BasicBlock::Create(TheContext, "loop", TheFunction);
//exit the block
BasicBlock *AfterBB = BasicBlock::Create(TheContext, "afterloop", TheFunction);
Builder.SetInsertPoint(BB);
//add goto LoopBB in BB
Builder.CreateBr(LoopBB);
//start with LoopBB
Builder.SetInsertPoint(LoopBB);
//start with 0
Value *StartVal = ConstantFP::get(TheContext, APFloat(0.0));
//step is 1
Value *StepVal = ConstantFP::get(TheContext, APFloat(1.0));
//local Variable which name is a
PHINode *Variable = Builder.CreatePHI(Type::getDoubleTy(TheContext), 1, "i");
//if it's from start block, set Variable 0
Variable->addIncoming(StartVal, BB);
//do the body then do cond
//emit loop body in LoopBB
//body: arg_a += 1
Value *ret = Builder.CreateFAdd(innerargs[0], ConstantFP::get(TheContext, APFloat(2.0)), "a");
//do the cond,if Variable >= 2 then break(goto AfterBB)
Value *NextVar = Builder.CreateFAdd(StepVal, Variable, "nextvar");
//if Variable < 10 then goto LoopBB or gotot AfterBB
Value *cond = Builder.CreateFCmpULT(Variable, ConstantFP::get(TheContext, APFloat(10.0)), "cmptmp");
Builder.CreateCondBr(cond, LoopBB, AfterBB);
Builder.SetInsertPoint(AfterBB);
Variable->addIncoming(NextVar, LoopBB);
Builder.CreateRet(ret);
TheFunction->print(errs());
//using jit to run this code
auto H = TheJIT->addModule(std::move(TheModule));
auto ExprSymbol = TheJIT->findSymbol("myfor");
double (*myfor)(double) = (double (*)(double))(intptr_t)cantFail(ExprSymbol.getAddress());
cout <<myfor(40)<<endl;
}
版权声明
本文为[Mrpre]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/04/202204231409588105.html
边栏推荐
- 填充每个节点的下一个右侧节点指针 II [经典层次遍历 | 视为链表 ]
- Async keyword
- Basic operation of circular queue (Experiment)
- Svn detailed use tutorial
- One of the advanced applications of I / O reuse: non blocking connect -- implemented using select (or poll)
- UML learning_ Day2
- 分布式事务Seata介绍
- Model location setting in GIS data processing -cesium
- OPPO数据湖统一存储技术实践
- MySQL error packet out of order
猜你喜欢
LeetCode153-寻找旋转排序数组中的最小值-数组-二分查找
How to upload large files quickly?
Model location setting in GIS data processing -cesium
Introduction to distributed transaction Seata
Bingbing learning notes: take you step by step to realize the sequence table
Borui data and F5 jointly build the full data chain DNA of financial technology from code to user
Leetcode151 - invert words in string - String - simulation
Basic operation of circular queue (Experiment)
What is the main purpose of PCIe X1 slot?
Thinkphp5 + data large screen display effect
随机推荐
Interviewer: let's talk about the process of class loading and the mechanism of class loading (parental delegation mechanism)
Detailed explanation of C language knowledge points -- data types and variables [1] - carry counting system
win10 任务栏通知区图标不见了
Svn detailed use tutorial
Provided by Chengdu control panel design_ It's detailed_ Introduction to the definition, compilation and quotation of single chip microcomputer program header file
When splicing HQL, the new field does not appear in the construction method
8.4 realization of recurrent neural network from zero
分布式事务Seata介绍
1-初识Go语言
1 - first knowledge of go language
Model location setting in GIS data processing -cesium
22年了你还不知道文件包含漏洞?
你还不知道责任链模式的使用场景吗?
go基础 反射
I/O复用的高级应用:同时处理 TCP 和 UDP 服务
帧同步 实现
nuxt项目:全局获取process.env信息
冰冰学习笔记:一步一步带你实现顺序表
[detailed explanation of factory mode] factory method mode
Redis master-slave synchronization