llvm-IR-OPT
文章平均质量分 90
基于llvm 的 IR做优化
春江花月夜晨
这个作者很懒,什么都没留下…
展开
-
clang pass编写、调试、执行文档说明
主题:编写优化pass,用clang生成BC,对接ESL版本:0.1关键字:clang_run_tcl、优化pass、IR OPT创建时间:2013-3-18创建人:cpan一、问题背景(why)ESL_0.2目前对接vivado HLS生成的a.o.3.bc,为了完全自主可控,将用clang生成的BC作为ESL_0.2的输入文件,并最终生成Verilog。二、需要达到的目的(what)组建一套clang标准化流程,学习vivado HLS利用clang及其优化pass,经过一系列的优化流程原创 2021-03-18 16:59:00 · 730 阅读 · 0 评论 -
PointerArgProcess 函数指针参数处理算法
PointerArgProcess 函数指针参数处理算法2020-10-19New PointerAnalysis算法步骤详细说明(修改后的PointerArgProcess)1、每次以Function为处理单位,从Top Function(默认main)开始,依次处理IR中与Top Function相关所有Function。2、 OptGetElementPtrInst(func):对Function中两个连续getelementptr做合并操作。3、getTargetedCallInst原创 2020-10-19 10:48:08 · 219 阅读 · 0 评论 -
rm_struct & PointerArgProcess可能出现的问题:
1、PointerArgProcess中CallInst中参数的属性没有遗传给分解的参数,分解的参数无属性,可能造成错误。可以通过这种方式进行设置属性,但先需找到getArgNo对应关系。原创 2020-10-17 18:15:07 · 117 阅读 · 0 评论 -
memcpy问题描述
Projection 函数的C程序代码:原创 2020-03-11 21:12:51 · 198 阅读 · 0 评论 -
MemcpyInstrProcess()处理算法说明
memcpy定义说明吴老师解决方案:Memcpy(A,B)将A和B同时将其分解为子变量,将两者变为同类型的type,进行memcpy。1:{i8,i8,i8,i8} {i32} -> {i8,i8,i8,i8} {i8,i8,i8,i8}2:{i8,i16,i16} {i16,i8,i16} -> {i8,i8,i8,i16} {i8,i8...原创 2020-03-11 21:29:12 · 229 阅读 · 0 评论 -
GetElementPtrInstProcess()算法处理
GetElementPtrInst定义说明get一条GetElementPtrInst,将instr->getOperand(0)分struct和ArrayStruct处理。 Value *inst_op_0 = instr->getOperand(0); //resloved the structure value if (IsStructVal(inst_op_0-&...原创 2020-03-10 21:28:43 · 369 阅读 · 3 评论 -
CallInstProcess处理算法说明
ps.目前的return为struct的不支持对于返回值为struct时:struct A = B(…) ----->B(…,struct A)callInst指令处理CallInstProcess(CallInst *inst, int argNo, vector<Value*> sub_value)inst为需要处理的callInst,argNo是struct在c...原创 2020-03-08 15:05:24 · 192 阅读 · 0 评论 -
rm_struct pass question!
1、LoadiNAsFunctionArg()中,将函数参数改完的MidF,内部进行修改时,(1)先看看iN的user是不是为StoreInst指令,有的话,直接将x,y给它,不用拼接(2)再看看iN的user是不是CallInst的参数,是的话,调用callInst对应的process函数处理(3)看还有其他情况否?2、结论:C++ map中key不要使用指针,请直接使用对象。为什么我一...原创 2020-03-07 21:20:07 · 130 阅读 · 0 评论 -
store <ty> <value> A, <ty>* <pointer> B 处理算法
1、当A为structType,未见过,assert(0)2、当A不为structType,为iN时(2.1)ps.目前的return为struct的不支持callInst指令处理CallInstProcess(CallInst *inst, int argNo, vector<Value*> sub_value)inst为需要处理的callInst,argNo是stru...原创 2020-03-06 23:36:08 · 153 阅读 · 0 评论 -
bitcast 内存指令表算法
一:开会讨论,修正处理移位操作指令方案,先对所有指令建表,在对表中单个变量进行指令替换提取,保证表中信息完全体现CPU内存信息存储。吴老师讨论结果:(1)每个指令对应一张表,表内存在i64中存储信息,存str.x也存%1(2)先造表,把每个表对应的东西表示出来,第二遍再处理表,提取表中的单个变量(3)表就是将concat出的变量split开(4)先把trunc等指令全部处理完二:只...原创 2020-03-05 15:02:56 · 1030 阅读 · 0 评论 -
remove struct code illustration(3)--DAG Topological ordering 处理struct的主函数
DAG Topological ordering算法流程:(1)通过DAG vertex间父子关系,找到入度为零的StructType中的values,分解为subValues。(2)将分解出为subStructType的values,存入Type一致的vertex。待下次分解。(3)用分解出的subValues替换与values相关的instructions,此时第一级struct替换完毕...原创 2019-10-24 15:06:39 · 149 阅读 · 0 评论 -
remove struct code illustration(2)-- IR Struct Value 存入DAG vertex
遍历IR,将Struct Value存入与其Type一致的vertex。 SaveRootGlobalVar(); AllocaInstr();SaveRootGlobalVar()处理全局变量AllocaInstr();处理局部变量void RemoveStruct::SaveRootGlobalVar() { //Traverse the module_ global li...原创 2019-10-24 11:23:23 · 126 阅读 · 0 评论 -
remove struct code illustration(1)--构建vertex为StructType的DAG
构建StructDAG:getIRStructType();IR中,将StructType存为DAG的vertex, StructType分解的subStructType同样存入DAG的vertex,并建立父子关系,遍历 IR 所有的Struct Type 构建出DAG 。void RemoveStruct::getIRStructType() { //why is Identified ...原创 2019-10-24 11:07:08 · 127 阅读 · 0 评论 -
MemcpyInstCreate (弃用,可作为了解最基础处理思路)
code illustration MemcpyInstCreate(通过传递过来的src_value、dest_value和需替换的instr生成它的sub value的memcpyInst语句)void RemoveStruct::MemcpyInstCreate(Value *dest_val,Value *src_val, IntrinsicInst *instr) {//确定d...原创 2019-09-29 11:22:47 · 119 阅读 · 0 评论 -
2019-8-30 getelementptr、load、store
llvm没有取地址的操作getelementptr是在对一个地址进行加操作load与store是llvm中两个对地址与数据进行操作的指令load是对一个地址进行取数据,store是对一个地址进行存数据。...原创 2019-08-30 10:52:36 · 888 阅读 · 0 评论 -
2019-8-21 多维数组中包含struct拆解code
需要处理的目标: struct point { char x, y;};struct str { long h; struct point p[2]; int arr[3];};volatile struct str global[2][2];对应的IR:%struct.str = type { i64, [2 x %struct.point], [3 x ...原创 2019-08-21 14:16:48 · 233 阅读 · 0 评论 -
llvm问题积累----BitCastLoad
一:assert(use_width == bitcast_bitwidth);报错case:%struct.str = type { %struct.point, [4 x i32], %struct.cpan, i8 }%struct.point = type { i8, i8, i32 }%struct.cpan = type { %struct.point, i32, i8 }...原创 2019-08-08 10:25:26 · 341 阅读 · 0 评论 -
llvm 得到一个struct的value,通过type得出struct各个成员变量的内存排布(第三版优化)
写了一个map,key是val_offset_list,value是一个struct,包含了type和width Module* module_; typedef struct TypeWidth { Type* type; int width; TypeWidth(Type* T, int W) { type =...原创 2019-08-07 20:08:43 · 1025 阅读 · 6 评论 -
llvm 得到一个struct的value,通过type得出struct各个成员变量的内存排布(第二版弃用,第三版优化)
void RemoveStruct::structMemoryArrange(Type* val_ty, int actual_width, int &use_width, bool &flag) {// val_ty是struct type,actual_width是需要取地址的长度,use_width是该struct需要的内存排布总长度,flag是取地址的长度是否取到无意义...原创 2019-08-06 14:44:04 · 782 阅读 · 0 评论 -
llvm 处理struct中getelementptr指向无用内存空间的case
IR中的%.sroa.3.0.copyload = load volatile i16, i16* bitcast (i8* getelementptr inbounds (i8, i8* bitcast (%struct.str* @global to i8*), i64 14) to i16*), align 2store volatile i16 %.sroa.3.0.copyload,...原创 2019-08-01 19:28:30 · 731 阅读 · 0 评论 -
llvm 得到一个struct的value,通过type得出struct各个成员变量的内存排布(考虑不周全,看下一篇正确排布)
// **BitCastLoad函数是为了对bitcast + Load语句做等价替换**// %1 = bitcast (%struct.point* getelementptr inbounds (%struct.str, %struct.str* @global, i64 0, i32 3) to i32*)/ /**等价替换为**// %0 = getelementptr i...原创 2019-08-01 11:38:25 · 666 阅读 · 0 评论 -
llvm问题积累
1、load一个地址空间为空的memory %.sroa.3.0.copyload = load volatile i16, i16* bitcast (i8* getelementptr inbounds (i8, i8* bitcast (%struct.str* @global to i8*), i64 14) to i16*), align 2 store volatile i16 ...原创 2019-07-25 18:04:28 · 452 阅读 · 0 评论 -
llvm bitcast & getelementptr拆解
IR出现的待解决的复杂case: %.sroa.3.0.copyload = load volatile i16, i16* bitcast (i8* getelementptr inbounds (i8, i8* bitcast (%struct.str* @global to i8*), i64 14) to i16*), align 2Getelementptr Instruction...原创 2019-07-25 15:47:56 · 4502 阅读 · 0 评论 -
编译器架构的LLVM IR 5st Day(分解struct)
llvm instruction use 的用法 Instruction *instr = WorkListLoad->pop_back_val(); for (Value::user_iterator UI = instr->user_begin(), E = instr->user_end(); UI!= E; ++UI) { User *U = ...原创 2019-06-27 20:09:26 · 304 阅读 · 0 评论 -
编译器架构的LLVM IR 4st Day(分解struct)
创建一个GetElementPtrInstGetElementPtrInst:an instruction for type-safe pointer arithmetic to access elements of arrays and structs。目的从一个getElement Expr提取相应value再在其上插入一个instruction%global.sroa.4.0.copy...原创 2019-05-31 10:46:33 · 664 阅读 · 0 评论 -
编译器架构的LLVM IR 3st Day(分解struct)
从module中的globalvariable list中获取全局变量的信息void RemoveStruct::createGlobalVarible() { // This are the list of load to delete //SmallVector<Instruction*,128> *WorkListLoad=new SmallVector<Instr...原创 2019-05-29 16:59:03 · 309 阅读 · 0 评论 -
编译器架构的LLVM IR 2st Day(分解struct)
对遍历IR的instruction得出的globalvariable进行解析。在bc中我的globalvariable 是@global这个变量,首先提取它的地址,判断它是什么类型的指针,对指针类型进行判断,此时我需要判断其为constantstruct类型,是时,我通过getoperand()函数遍历得到每个value,然后应该在对每个value进行判断,此时我设定每个value为单个变量,取...原创 2019-05-29 16:55:56 · 601 阅读 · 0 评论 -
编译器架构的LLVM IR 1st Day(分解struct)
IR分层Module–》Function–》BasicBlock–》InstructionTips:1、所有的instruction都是在Function之内,以%开头。metadata不属于instruction,struct的variable name只存在于debug model下,需从metadata中提取。2、getelementptr是constantExpr的subclass...原创 2019-05-29 16:24:24 · 961 阅读 · 0 评论