2015-01-19 7 views
3

나는 다음과 같은 시나리오가 : A,B,C,D,E,F이 모든 기본 요소입니다추가 적절한 PHI 노드는 LLVM-IR하기

 A 
    / \ 
    B C 
     \/
     D 
    /\ 
    E F 
     \/
     ... 

|은 아래를 가리키는 화살표입니다.

이제 좀 데프있을 것 B에, 그 후에 ... = %mul ...처럼, 해당 좌측 블록 E에 사용되는, %mul = ... 말한다. 적절한 제어 흐름을 삽입했습니다. 왼쪽 분기 만 가져 오거나 올바른 분기 만 받아 들일 수 있습니다. 문제는 확인 패스에서 Instruction does not dominate all uses 오류가 발생한다는 것입니다.

나는 다음과 같은 PHINode 지침을 추가하여이 문제를 해결하려고 :

B:          ; preds = %A 
    %shl = shl ... 
    br label %D 

C:          ; preds = %A 
... 
br label %D 

D:          ; preds = %B , %C 
... 
br i1 %ctrl, label %E, label %F 

E:         ; preds = %D 
    %phi_nlcs = phi i32 [ %shl, %extra_l_diff ], [ 0, %for.cond ] 
    %cmp = icmp slt i32 %phi_nlcs, %1 
    br label ... 

타원는 무관 한 사항이 숨길 수 있으며, 또한 나는 블록을 이름을 변경했지만 코어 로직이 있어야한다. 보시다시피, 저는 의 사용을 PHINode으로 바꾸고 적절한 replaceAllUsesWith() 호출을 사용합니다.

그러나, 지금은 다음과 같은 새로운 오류가 발생합니다 :

PHINode should have one entry for each predecessor of its parent basic block! 
%phi_nlcs = phi i32 [ %shl, %extra_l_diff ], [ 0, %for.cond ] 

나는이 문제를 어떻게 해결할 수

? 파이 노드 값이 지배 기본 블록 (B 및 C)의 각이 될 수 있어야 무엇을 말하고 있기 때문에

답변

3

피 노드는 D.

D: 
    %phi_nlcs = phi [%shl, B] [undef, C] ; if we've come from B use %shl, if from C an undef value. 
    ... 

이것은의 시작 부분에 있어야합니다 따라서 기본 블록이 결합되는 모서리에 배치해야합니다.

+0

난 그냥 내 자신을 깨달았지만 대답을 게시하려고했지만 당신은 나를 이길, 감사합니다 Logged – baibo