mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-01 15:11:24 +00:00
R600/SI: Fix verifier errors from the SIAnnotateControlFlow pass
This pass was generating 'Instruction does not dominate all uses!' errors for programs which had loops with a condition variable that depended on the result of a phi instruction from outside of the loop. The pass was inserting new phi nodes outside of the loop which used values defined inside the loop. http://bugs.freedesktop.org/show_bug.cgi?id=90056 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@236306 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
d57216e763
commit
89d0e99f86
@ -209,7 +209,15 @@ void SIAnnotateControlFlow::insertElse(BranchInst *Term) {
|
||||
/// \brief Recursively handle the condition leading to a loop
|
||||
Value *SIAnnotateControlFlow::handleLoopCondition(Value *Cond, PHINode *Broken,
|
||||
llvm::Loop *L) {
|
||||
if (PHINode *Phi = dyn_cast<PHINode>(Cond)) {
|
||||
|
||||
// Only search through PHI nodes which are inside the loop. If we try this
|
||||
// with PHI nodes that are outside of the loop, we end up inserting new PHI
|
||||
// nodes outside of the loop which depend on values defined inside the loop.
|
||||
// This will break the module with
|
||||
// 'Instruction does not dominate all users!' errors.
|
||||
PHINode *Phi = nullptr;
|
||||
if ((Phi = dyn_cast<PHINode>(Cond)) && L->contains(Phi)) {
|
||||
|
||||
BasicBlock *Parent = Phi->getParent();
|
||||
PHINode *NewPhi = PHINode::Create(Int64, 0, "", &Parent->front());
|
||||
Value *Ret = NewPhi;
|
||||
|
@ -23,3 +23,41 @@ ENDLOOP:
|
||||
ENDIF:
|
||||
br i1 %1, label %ENDLOOP, label %ENDIF
|
||||
}
|
||||
|
||||
|
||||
; FUNC-LABEL: {{^}}phi_cond_outside_loop:
|
||||
; FIXME: This could be folded into the s_or_b64 instruction
|
||||
; SI: s_mov_b64 [[ZERO:s\[[0-9]+:[0-9]+\]]], 0
|
||||
; SI: [[LOOP_LABEL:[A-Z0-9]+]]
|
||||
; SI: v_cmp_ne_i32_e32 vcc, 0, v{{[0-9]+}}
|
||||
|
||||
; SI_IF_BREAK instruction:
|
||||
; SI: s_or_b64 [[BREAK:s\[[0-9]+:[0-9]+\]]], vcc, [[ZERO]]
|
||||
|
||||
; SI_LOOP instruction:
|
||||
; SI: s_andn2_b64 exec, exec, [[BREAK]]
|
||||
; SI: s_cbranch_execnz [[LOOP_LABEL]]
|
||||
; SI: s_endpgm
|
||||
|
||||
define void @phi_cond_outside_loop(i32 %a, i32 %b) {
|
||||
entry:
|
||||
%0 = icmp eq i32 %a , 0
|
||||
br i1 %0, label %if, label %else
|
||||
|
||||
if:
|
||||
br label %endif
|
||||
|
||||
else:
|
||||
%1 = icmp eq i32 %b, 0
|
||||
br label %endif
|
||||
|
||||
endif:
|
||||
%2 = phi i1 [0, %if], [%1, %else]
|
||||
br label %loop
|
||||
|
||||
loop:
|
||||
br i1 %2, label %exit, label %loop
|
||||
|
||||
exit:
|
||||
ret void
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user