2-16~3.13工作報告

2-17:梳理rm_struct流程框架理,將所有process函數仔細分析一遍,爲函數添加註釋,總結函數處理流程表。

2-18:當把一個struct變量store給另一個struct變量時,先將struct分解,對分解後的變量BitConcatenate處理。測試當函數參數分解爲子變量x,y時,函數內部用BitConcatenate合併x、y變量跑通。下一步測試多個變量多次BitConcatenate和struct傳值傳指針參數變化情況。

2-19:函數參數struct分解ok,但函數體內部存在局部struct變量,當函數體中存在局部變量struct,對函數體進行copy時,該函數體局部變量未存入DAG中,需要處理完一遍bc,再進行第二次處理bc。debug函數嵌套,bitConcatenate語句插入報錯。

2-20:1.debug函數嵌套,bitConcatenate語句插入報錯。如圖所示,插入位置錯誤:當%3放其第一個userInst之前,並不代表這個userInst是在IR第一個出現的,當前面還有使用%3時,bc輸出不正無法生成IR,改爲當插入指令放在函數的首個instruction位置,纔不會報錯。
2.FunctionProcess函數處理方式修改,將立即刪除oldFunction改爲與newFunction存放map中。
遇到一條callInst指令,查找其調用Function是否在map中,不在則New一個Function,在則直接new CallInst 與NewFunction建立連接關係,並replace old callInst。debuging仍需解決

2-21:1.週二處理函數嵌套中的未加入DAG的局部struct變量問題,通過二次調用rm_struct pass,優化將局部變量其加入DAG,不同二次調用pass處理,並將結果生成冗餘alloca指令需刪除。
2.face_detection這個例子rm_struct完畢,結果運行正確,但仍需對函數中struct處理過程是否有漏洞 做進一步確定,下週集中處理3d_rendering這個例子。

2-24:處理3d_rendering case,編寫and、or、xor bit處理函數並調試,測試提取有效位正確性。處理case崩掉,中間部分instruction報錯。debuging。
問題3d_rendering中getelementptr指令index不是constant integer,需添加該種處理情況code,待處理。

2-25:1、debug and、or、xor 等指令對應memory table,修改遇到邏輯運算立即打斷,並用struct子變量替換。
2、經過clang O1的3d_rendering case bc中初中出現將struct變量的二級指針傳遞的語句,通過mem2reg opt優化無二級指解決問題。
3、bc中存在無調用的function,需code處理

2-26:1、處理bc中沒有被調用的function,將其中的struct分解。
2、memcpy中出現內存拼接,如圖所示,與函數參數爲拼接的struct一樣,memcpy(A,B)A={i8,i8,i8,i8,i8,i8,i8,i8,i8},B={i64,i8},整理memcpy處理算法,編寫memcpy處理情況code,明天繼續處理。

2-27:memcpy(A,B)算法整理,與萬姐討論memcpy處理方法,因爲之前未考慮A或B爲struct變量拼接成iN情況,memcpyprocess需要修改框架並添加該種處理情況。並仔細研究了memcpy資料,確保修改後函數處理的通用性。今明兩天集中處理掉memcpy。

2-28:將memcpy(A,B)情況分類明確,補全內存拼接處理函數,週末測試保證memcp處理正確。

3-2:memcpy(dest,src)種類如圖所示,目前已支持情況1~2.4,並在3d_rendering運行正確,剩餘2.5和2.6還需半天處理,memcpy處理完繼續debug。

3-3:1、開會
2、整理memcpy(A,B)處理方案,暫時不處理內存拼接情況
3、測試struct例子,查看顧正華新的case是否支持。
4、對整體代碼不支持部分進行報錯說明

3-4:完善getelementptr的處理函數:GetElementPtrInstProcess(Instruction *inst)
(1)inst的src和dest的structType類型一致時,僅保留getelementptr的list,不處理
(1.1)當inst的user爲getelementptr inst2
(1.1.1)if(inst2的dest的structType != inst的srcstructType)加入(1)的list,分解inst的src的sub struct value,inst2的op_1assert爲constant 0捨棄
(1.1.2)else assert(0),list just have a vector pointer,
(1.2)當接下來是callInst時,需要將array的信息傳遞下去
(2)當兩者類型不一致時,則直接將其分解。

3-5:1、處理getelementptrInst爲callInst參數的情況
2、修改BitcastProcess函數,優化函數處理結構,bug處理:遇到callInst指令,直接將oldF和爲其創建的newF放入map中不對,需要比較此時的newF變化的struct與需要修改的位置對應,否則錯誤。
二是目前的創建的Function可能會有重複,需要後期刪除重複Function,因爲現在的處理方案是遇到一條callInst處理該條callInst,可能會最終造成重複創建Function,要想根本上解決Function重複問題,需要遇到一條callInst,修改其Function,在將Function對應的所有指令全部修改,但是放Function的參數爲iN(拼接的struct),無法將每條callInst都處理,所有暫用目前方法。
val_struct1->call1(x,y,struct1,struct2)->call2(x,y,m,n,struct2)
->call3(x,y,m,n,p,q)

val_struct2->call1(x,y,struct1,struct2)->call4(x,y,struct1,p,q)
->call5(x,y,m,n,p,q)

3-6:1、將callInst對應Function函數重新整理,將argument爲iN、struct、constantexpr共同函數進行合併
2、處理store A,*B指令,對A、B種類進行歸類處理,完善函數
3、冗餘函數結構進行優化替換

3.2—3.6:
1、主要對代碼做修改,一對不支持的情況做說明,二對代碼簡潔化,有些分支過多,找些規律把精簡code,getelementptr和bitcast提高可讀性和健壯性。store,memcpy指令,全部歸於同一個處理函數,將參數A、B邊界情況儘可能完善。本週就是在公司多跑寫例子debug,檢測能否滿足預期情況,最後對rm_struct做個文檔功能說明,確定這個pass。

3-9:store A, * B 處理算法,考慮A、B所有可能情況並處理。

3-10:1.查閱opencv老版本資料,瞭解含有struct的程序。
2.針對目前rm_struct,羅列目前不支持的情況。
3.繼續debug 3d_rendering,想盡量將它支持。

3-11:1、debug 3d_rendering完善memcpyprocess函數
2、將之前的所有的struct跑一遍,debug,完善callInst處理函數,對iN的argument先進行x、y處理,仍有拼接出現再生成concate語句,不是一開始直接生成concate語句。
3、對debug發現解決不了情況總結

3-12:1、3d_rendering無法支持,memcpy處理算法需仔細討論。
2、驗證15個struct例子,驗正pass正確性並進行debug。

3-13:1、clang有優化bc的pass可以優化rm_struct,將其中冗餘指令刪除。刪除冗餘的global、alloca、Function參數和dead instruction。
2、繼續跑struct case,並debug

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