3.16~~~4.1工作報告

3.16:將之前的總結的22個struct case全部測試完畢,部分細節問題已完善code,不支持情況是memcpy內存拼接、指針、external結構體變量的問題。code中function_map_邊界處理callinst存在漏洞,待以後討論。目前完善後的rm_struct pass可以加入ESL。

3.10-3.16:

1、測試工作,驗正pass正確性並進行debug。進行一些debug,但都在處理範圍之內,一些細節情況需要完善。結果將之前的總結的22個struct case全部測試完畢並跑通。
萬姐這邊的兩個例子:face_dection和3d_rendering,3d_rendering裏面有memcpy中內存拼接的,暫不支持。

2、刪除冗餘的global、alloca指令、函數的多餘參數刪除和dead instruction等大量的冗餘指令,生成的bc,再用clang opt進行優化。

(1)不支持情況:內存拼接(memcpy)、指針、external結構體變量、函數返回值爲struct。

(2)存在的問題:pass function情況處理下callinst存在問題,目前的做法是struct value-》callInst,處理該條callInst,處理其oldFunction,創建newFunction。加入map,下次再遇見oldFunction,直接替換爲newFunction。
方法二:就是struct value-》callInst-》Function-》callInsts全部改掉,那不可能。

當前的function_map_根據以下例子可見不支持,只支持函數中存在一個struct例子。
struct1->call1(struct1,struct2)->call2(m,n,struct2) 
struct2->call1(struct1,struct2)->call3(struct1,p,q)

3、目前情況就是自己根據struct種類情況寫例子,或者網上搜索小例子,缺少大例子驗證。先目前例子全跑完,再思考邊界問題,最後opencv找大例子。

3-17:1、處理分解函數參數爲struct的邊界情況:當struct爲oldFunction的argument時,將struct分解生成newFunction,此時oldFunction無指令調用,可刪除,但oldFunction中存在AllocaInst是DAG中待處理變量,需要先將AllocaInst從DAG刪除,再刪除oldFunction。當有指令調用,則不能刪除,則不處理AllocaInst。
2、做rm_struct report,總結目前可支持的情況種類,並對不支持做原因說明。

明天計劃:自上向下總結rm_struct,具體到每個feature,讓別人明白我解決流程。

3-18:1、對昨天的rm_struct report進行補充,(1)描述算法設計思路。(2)Structure Features 說明。羅列C使用場景及其所有指令出現情況(3)分五大塊進行structure區域劃分。
2、優化code。編寫處理函數splitConstantExpr:對bitcast、getelementptr、call、memcpy中的類型是bitcast、getelementptr的constantExpr分離作爲新指令,方便後續處理。

3-19:1、將instruction中的constantExpr提取出來作爲新的instruction,ConstantExpr依然存在,因爲它可能在其他有調用,所以只能把user爲零的constantExpr刪除。該預處理pass測試跑通。
2、根據預處理將constantExpr刪除,process struct中遍歷到的ConstantExpr便不作處理,將callinst、memcpy中存在ConstantExpr情況提前處理掉,刪除冗餘代碼。
3、當前對處理過的struct value刪除指令有問題,刪除函數需需再優化一下。

3-20:1、debug:在處理Function的函參爲多級arraystruct時,未分解正確。修改code。
2.下載opencv源碼,嘗試分離含struct獨立程序,結果沒法分離。直接搜索圖像處理獨立程序,進行rm_struct。

3-23:1、利用map和vivado對face-detection仿真,進行rm_struct生成bc與vivado的數據對比。2、找structure例子 獨立C程序例子,C代碼大全裏找到37個相關獨立C程序,這周進行debug測試。3、跑例子發現結構體變量初始化存在memset指令情況,暫不支持,分析memset功能,問題不大。

3-17-3-23 工作總結:
1、整理structure report,說明支持結構體的type類型,根據其在C代碼使用場景,struct劃分四塊區域:對全局、局部、函參變量的分解,內部變量的提取,變量的賦值以及函數調用。
2、優化code,將struct有關的常量表達式全部轉爲instruction,減少處理分類情況。我的code完全按照劃分區域處理。使得邊界情況清晰,方便對structure賦值以及函數調用缺陷的彌補。
3、尋找測試例子:(1)opencv源碼中圖像處理函數無法分離爲單個C程序例子。(2)尋找圖像處理函數C程序,結構複雜較亂,需要花時間理解才能簡化爲所需獨立C程序。(3)直接找structure例子 獨立C程序例子,C代碼大全裏找到37個相關獨立C程序,待處理。發現變量初始化存在memset指令,不支持。
4、對face-detection例子的數據對比。
下一步打算:1、把找到的例子全測完,對不支持的作說明。2、如果吳老師想看數據,是想辦法搞一兩個大例子,添加與vivado數據對比。三是function調用處理。

(2)一個structure 變量val_1,調用了一個sum函數(s1,s2),sum函數有兩個類型爲結構體的變量s1和s2,val_1對應s1,分解後sum函參變爲(x,y,s2),map(old,new),下次再遇見oldFunction,直接替換爲newFunction。當處理另一個structure變量val_2,調用sum函數,分解後sum函參變爲(s1,x,y),

Function處理方法:一個結構體變量str_1,調用一個函數A,A函數對應結構體參數分解爲子變量。

實例:當函數A有N個structure函參(N1,N2……)

分解做法:遇到N1分解N1,遇到N2分解N2,爲了減少重複構建Function,map(old,new),下次再遇見oldFunction,替換爲newFunction。那麼map還需要分解的struct的函參位置。

str_1->A(N1,N2)->A_1(m,n,N2) ->A_3(m,n,p,q)
str_2->A(N1,N2)->A_2(N1,p,q)->A_4(m,n,p,q)

3-27:
1、編寫StructTypeDAG與FunctionCallDAG的數據結構框架;
2、明確BC中每個含有structure指令拆分方法及表達方式,以及如何記錄新老變量對應關係;
3、不創建Mid_function,確定僞代碼結構流程,細分每個函數功能;
4、明天寫例子測試不創建Mid_function是否可行;
5、明天整理StructType的內存排布表算法;

3-30:
1、完成ConvertConstantExprToInst函數,將BC中ConstantExpr轉變爲Instruction,方便後續處理。
2、完成StructTypeDAG數據結構的構建,vertex之間Hierarchy關係建立、StructType的內存排布表算法memorytable建立及TopLevelStructType的讀取。並通過實際測試,StructTypeDAG構建完畢。

3-31:
1、開會糾正StructTypeDAG數據結構中的vertex定義。
2、修改StructTypeDAG數據結構及相關code,並測試跑通get right result。
3、編寫函數遍歷IR,得到拓撲排序的function_list,作爲後續處理IR的數據結構。並測試跑通get right result。

4-1:
1、完成structure type分解;
2、完成DAG top leve’s variables的分解,並生成對應子變量。需要分解的value已準備好,下一步逐步處理GetElementPtrInst、LoadInst、MemCpyInst、StoreInst、BitCastInst、CallInst指令;

4-2:
1、處理含有struct的Function時,直接創建new_Function,將old Function中的指令copy過來,涉及ValueToValueMap的value之間的引用關係,而且,function copy 還需涉及BasicBlock,較爲繁瑣,目前還是需利用llvm的API建立Mid_function,再得到new_Function。
每一條instruction進行copy,也需指令指定BasicBlock、function及argument的reference。
1、思考function的處理方案,處理含有struct的Function,直接創建new_Function,將old Function中的指令逐步copy,需對new_function構建框架,ValueToValueMap建立引用關係,較爲繁瑣。暫用llvm的API生成Mid_func,下一步補全代碼。
2、思考如何對不同Instruction的operation分類處理,編寫僞代碼。

4-3:
1、完成GetElementPtrInst處理方案,並編寫處理函數,可分解所有GetElementPtrInst相關指令。待測試運行。
2、寫BitCastInst解決流程僞代碼,下一步完善處理BitCastInst的code。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章