diff options
author | Tom Stellard <thomas.stellard@amd.com> | 2015-05-04 19:50:16 +0000 |
---|---|---|
committer | Tom Stellard <thomas.stellard@amd.com> | 2015-05-04 19:50:16 +0000 |
commit | 8a771f0db1855eaf32e80fbc0ec0718f201efd66 (patch) | |
tree | 6ac4cb460e610a837c8ef4706910566cf62325de | |
parent | Merging r235662: (diff) | |
download | llvm-project-8a771f0db1855eaf32e80fbc0ec0718f201efd66.tar.gz llvm-project-8a771f0db1855eaf32e80fbc0ec0718f201efd66.tar.bz2 llvm-project-8a771f0db1855eaf32e80fbc0ec0718f201efd66.zip |
Merging r236306:
------------------------------------------------------------------------
r236306 | thomas.stellard | 2015-04-30 23:44:08 -0400 (Thu, 30 Apr 2015) | 11 lines
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
------------------------------------------------------------------------
llvm-svn: 236451
-rw-r--r-- | llvm/lib/Target/R600/SIAnnotateControlFlow.cpp | 10 | ||||
-rw-r--r-- | llvm/test/CodeGen/R600/si-annotate-cf.ll | 38 |
2 files changed, 47 insertions, 1 deletions
diff --git a/llvm/lib/Target/R600/SIAnnotateControlFlow.cpp b/llvm/lib/Target/R600/SIAnnotateControlFlow.cpp index f23cdb633b69..b8165fb4ab2c 100644 --- a/llvm/lib/Target/R600/SIAnnotateControlFlow.cpp +++ b/llvm/lib/Target/R600/SIAnnotateControlFlow.cpp @@ -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; diff --git a/llvm/test/CodeGen/R600/si-annotate-cf.ll b/llvm/test/CodeGen/R600/si-annotate-cf.ll index 3f3098862ef9..1b49a8272fa3 100644 --- a/llvm/test/CodeGen/R600/si-annotate-cf.ll +++ b/llvm/test/CodeGen/R600/si-annotate-cf.ll @@ -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_e64 [[COND:s\[[0-9]+:[0-9]+\]]], v{{[0-9]+}}, 0 + +; SI_IF_BREAK instruction: +; SI: s_or_b64 [[BREAK:s\[[0-9]+:[0-9]+\]]], [[COND]], [[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 +} |