[llvm-branch-commits] [llvm-branch] r236451 - Merging r236306:

Tom Stellard thomas.stellard at amd.com
Mon May 4 12:50:16 PDT 2015


Author: tstellar
Date: Mon May  4 14:50:16 2015
New Revision: 236451

URL: http://llvm.org/viewvc/llvm-project?rev=236451&view=rev
Log:
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

------------------------------------------------------------------------

Modified:
    llvm/branches/release_36/lib/Target/R600/SIAnnotateControlFlow.cpp
    llvm/branches/release_36/test/CodeGen/R600/si-annotate-cf.ll

Modified: llvm/branches/release_36/lib/Target/R600/SIAnnotateControlFlow.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/release_36/lib/Target/R600/SIAnnotateControlFlow.cpp?rev=236451&r1=236450&r2=236451&view=diff
==============================================================================
--- llvm/branches/release_36/lib/Target/R600/SIAnnotateControlFlow.cpp (original)
+++ llvm/branches/release_36/lib/Target/R600/SIAnnotateControlFlow.cpp Mon May  4 14:50:16 2015
@@ -209,7 +209,15 @@ void SIAnnotateControlFlow::insertElse(B
 /// \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;

Modified: llvm/branches/release_36/test/CodeGen/R600/si-annotate-cf.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/release_36/test/CodeGen/R600/si-annotate-cf.ll?rev=236451&r1=236450&r2=236451&view=diff
==============================================================================
--- llvm/branches/release_36/test/CodeGen/R600/si-annotate-cf.ll (original)
+++ llvm/branches/release_36/test/CodeGen/R600/si-annotate-cf.ll Mon May  4 14:50:16 2015
@@ -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
+}





More information about the llvm-branch-commits mailing list