나는 다음과 같은 시나리오가 : 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)의 각이 될 수 있어야 무엇을 말하고 있기 때문에
난 그냥 내 자신을 깨달았지만 대답을 게시하려고했지만 당신은 나를 이길, 감사합니다 Logged – baibo