<html><head><meta http-equiv="Content-Type" content="text/html charset=windows-1252"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">Hi Hal,<div><br></div><div>Your commit triggers a question regarding LLVM IR.</div><div><br></div><div>I may have misread the language reference manual but I did not see any mention of this limitation, i.e., that if a phi reference several time the same predecessor it must have the same value.</div><div>I said that it is a limitation because code like this:</div><div><font face="Menlo" style="font-size: 11px;">define i32 @test(i32 %arg) {</font></div><div><font face="Menlo" style="font-size: 11px;">entry:</font></div><div><font face="Menlo" style="font-size: 11px;">  %cond = icmp sle i32 %arg, 412 </font></div><div><font face="Menlo" style="font-size: 11px;">  br i1 %cond, label %end, label %end</font></div><div><font face="Menlo" style="font-size: 11px;">end:</font></div><div><font face="Menlo" style="font-size: 11px;">  %res = phi i32 [ 0, %entry ], [ 1, %entry ]</font></div><div><font face="Menlo" style="font-size: 11px;">  ret i32 %res</font></div><div><font face="Menlo" style="font-size: 11px;">}</font></div><div><br></div><div>Are perfectly legal from SSA stand-point.</div><div>Although it is a weird way of doing a select, you may end up with code like this when optimizations kick in (maybe not in llvm) :).</div><div><br></div><div>The verifier module aborts on this input code.</div><div>Therefore:</div><div>1. The verifier confirms your point (setting the same value on both paths works).</div><div>2. Is it something we want to fix in the compiler or should we “fix" the documentation?</div><div><br></div><div>Cheers,</div><div><div apple-content-edited="true">
<div style="color: rgb(0, 0, 0); font-family: Helvetica;  font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">-Quentin</div>

</div>
<br><div><div>On Oct 4, 2013, at 4:41 PM, Hal Finkel <<a href="mailto:hfinkel@anl.gov">hfinkel@anl.gov</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">Author: hfinkel<br>Date: Fri Oct  4 18:41:05 2013<br>New Revision: 192001<br><br>URL: <a href="http://llvm.org/viewvc/llvm-project?rev=192001&view=rev">http://llvm.org/viewvc/llvm-project?rev=192001&view=rev</a><br>Log:<br>UpdatePHINodes in BasicBlockUtils should not crash on duplicate predecessors<br><br>UpdatePHINodes has an optimization to reuse an existing PHI node, where it<br>first deletes all of its entries and then replaces them. Unfortunately, in the<br>case where we had duplicate predecessors (which are allowed so long as the<br>associated PHI entries have the same value), the loop removing the existing PHI<br>entries from the to-be-reused PHI would assert (if that PHI was not the one<br>which had the duplicates).<br><br>Added:<br>    llvm/trunk/test/Transforms/LoopSimplify/dup-preds.ll<br>Modified:<br>    llvm/trunk/lib/Transforms/Utils/BasicBlockUtils.cpp<br><br>Modified: llvm/trunk/lib/Transforms/Utils/BasicBlockUtils.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/BasicBlockUtils.cpp?rev=192001&r1=192000&r2=192001&view=diff">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/BasicBlockUtils.cpp?rev=192001&r1=192000&r2=192001&view=diff</a><br>==============================================================================<br>--- llvm/trunk/lib/Transforms/Utils/BasicBlockUtils.cpp (original)<br>+++ llvm/trunk/lib/Transforms/Utils/BasicBlockUtils.cpp Fri Oct  4 18:41:05 2013<br>@@ -400,8 +400,12 @@ static void UpdatePHINodes(BasicBlock *O<br>       // If all incoming values for the new PHI would be the same, just don't<br>       // make a new PHI.  Instead, just remove the incoming values from the old<br>       // PHI.<br>-      for (unsigned i = 0, e = Preds.size(); i != e; ++i)<br>-        PN->removeIncomingValue(Preds[i], false);<br>+      for (unsigned i = 0, e = Preds.size(); i != e; ++i) {<br>+        // Explicitly check the BB index here to handle duplicates in Preds.<br>+        int Idx = PN->getBasicBlockIndex(Preds[i]);<br>+        if (Idx >= 0)<br>+          PN->removeIncomingValue(Idx, false);<br>+      }<br>     } else {<br>       // If the values coming into the block are not the same, we need a PHI.<br>       // Create the new PHI node, insert it into NewBB at the end of the block<br><br>Added: llvm/trunk/test/Transforms/LoopSimplify/dup-preds.ll<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopSimplify/dup-preds.ll?rev=192001&view=auto">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopSimplify/dup-preds.ll?rev=192001&view=auto</a><br>==============================================================================<br>--- llvm/trunk/test/Transforms/LoopSimplify/dup-preds.ll (added)<br>+++ llvm/trunk/test/Transforms/LoopSimplify/dup-preds.ll Fri Oct  4 18:41:05 2013<br>@@ -0,0 +1,46 @@<br>+; RUN: opt -loop-simplify -S %s | FileCheck %s<br>+target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64"<br>+target triple = "powerpc64-bgq-linux"<br>+<br>+define fastcc void @do_update_md([3 x float]* nocapture readonly %x) #0 {<br>+entry:<br>+  br i1 undef, label %if.end365, label %lor.lhs.false134<br>+<br>+lor.lhs.false134:                                 ; preds = %entry<br>+  br i1 undef, label %lor.lhs.false138, label %if.end365<br>+<br>+lor.lhs.false138:                                 ; preds = %lor.lhs.false134<br>+  br i1 undef, label %lor.lhs.false142, label %if.end365<br>+<br>+lor.lhs.false142:                                 ; preds = %lor.lhs.false138<br>+  br i1 undef, label %for.body276.lr.ph, label %if.end365<br>+<br>+for.body276.lr.ph:                                ; preds = %lor.lhs.false142<br>+  switch i16 undef, label %if.then288 [<br>+    i16 4, label %for.body344<br>+    i16 2, label %for.body344<br>+  ]<br>+<br>+if.then288:                                       ; preds = %for.body276.lr.ph<br>+  br label %for.body305<br>+<br>+for.body305:                                      ; preds = %for.body305, %if.then288<br>+  br label %for.body305<br>+<br>+for.body344:                                      ; preds = %for.body344, %for.body276.lr.ph, %for.body276.lr.ph<br>+  %indvar = phi i64 [ %indvar.next, %for.body344 ], [ 0, %for.body276.lr.ph ]<br>+  %indvars.iv552 = phi i64 [ %indvars.iv.next553, %for.body344 ], [ 0, %for.body276.lr.ph ], [ 0, %for.body276.lr.ph ]<br>+  %indvars.iv.next553 = add nuw nsw i64 %indvars.iv552, 1<br>+  %indvar.next = add i64 %indvar, 1<br>+  br label %for.body344<br>+<br>+; CHECK-LABEL: @do_update_md<br>+; CHECK: %indvars.iv552 = phi i64 [ %indvars.iv.next553, %for.body344 ], [ 0, %for.body344.preheader ]<br>+; CHECK: ret<br>+<br>+if.end365:                                        ; preds = %lor.lhs.false142, %lor.lhs.false138, %lor.lhs.false134, %entry<br>+  ret void<br>+}<br>+<br>+attributes #0 = { nounwind }<br>+<br><br><br>_______________________________________________<br>llvm-commits mailing list<br><a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits<br></blockquote></div><br></div></body></html>