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
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言