2011年4月5日 星期二

LLVM Training && graph theories

最近在練習寫 LLVM 的 IR code gen 時,遇到了一些阻礙. trace lib code 後.發現如果要建立起一個新的 BasicBlock 不但要 update "Preprocessor", "Successor", 還要 check Dominator tree 這樣才能確保 PHI Nodes 是否正確.流程大概是如此. 1. get terminator inst BranchInst *BInst = dyn_cast<BranchInst>(BB->getTerminator()) 2. get BranchInst type check BInst->isConditional() 3. get successor target BasicBlock BasicBlock *SuccBB = BC->getTerminator()->getSuccessor(0); 4. Create NewBB // BasicBlock *NewBB_1 = BasicBlock::Create(SuccBB->getContext(),"_NewBB_",SuccBB->getParent()); 5. move all PHINodes to NewBB // for(BasicBlock::iterator IT = (*SuccBB).begin(); dyn_cast(IT); IT++){ ... 6.remove Preprocessor pointer SuccBB->removePredecessor(BC,false); 7. create new pointer Value *val = BInst->getCondition(); BranchInst *BInst_1 = BranchInst::Create(SuccBB,NewBB_1); BranchInst *BInst_2 = BranchInst::Create(NewBB_1,ElsBB,,BC); 最後結果 = fail. 因為要 check 的東西實在是太多了. 不如乾脆先把 PHINodes 獨立成一組 BasicBlock, 剩下的 Instructions 為另一組. 就可以免去 dominator tree check 時,每個 PHINode 的 Value 都要被 define 到. ex: error for.body: ; preds = %for.body.for.body_crit_edge, %entry, %_gg_ %tmp14 = phi i32 [ %tmp14.pre, %for.body.for.body_crit_edge ], [ %tmp1, %entry ] 要定義 %tmp14 的 input value 要有 _gg_ BasicBlock 的 value. 不過 LLVM 提供了一個快速的 API func, "splitBasicBlock".利用底下的指令, 就可以把上面的問題解決摟...XD... 害我整整花了一天的時間在 Debug. BasicBlock::iterator IT = (*SuccBB).getFirstNonPHI(); BasicBlock *NewBB_1 = SuccBB->splitBasicBlock(IT, "_gg_"); Graph theories http://www.cs.utah.edu/~mhall/cs6963s11/ http://courses.engr.illinois.edu/ece498/al/Syllabus.html

沒有留言:

張貼留言