<div dir="ltr">Hello Mandeep,<br><br>This commit broke few of our builders:<br><br>Failing Tests (2):<br>    LLVM :: Transforms/Util/PredicateInfo/condprop.ll<br>    LLVM :: Transforms/Util/PredicateInfo/testandor.ll<br><br><a href="http://lab.llvm.org:8011/builders/clang-with-lto-ubuntu/builds/3084">http://lab.llvm.org:8011/builders/clang-with-lto-ubuntu/builds/3084</a><br><a href="http://lab.llvm.org:8011/builders/clang-with-thin-lto-ubuntu">http://lab.llvm.org:8011/builders/clang-with-thin-lto-ubuntu</a><br><br>Please have a look?<br><br>Thanks<br><br>Galina<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jun 1, 2017 at 11:36 AM, Mandeep Singh Grang via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: mgrang<br>
Date: Thu Jun  1 13:36:24 2017<br>
New Revision: 304447<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=304447&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=304447&view=rev</a><br>
Log:<br>
[PredicateInfo] Fix non-determinism in codegen uncovered by reverse iterating SmallPtrSet<br>
<br>
Summary:<br>
Sort OpsToRename before iterating to make iteration order deterministic.<br>
<br>
Thanks to Daniel Berlin for the sorting logic.<br>
<br>
Reviewers: dberlin, RKSimon, efriedma, davide<br>
<br>
Reviewed By: dberlin, davide<br>
<br>
Subscribers: sanjoy, davide, llvm-commits<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D33265" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D33265</a><br>
<br>
Modified:<br>
    llvm/trunk/lib/Transforms/<wbr>Utils/PredicateInfo.cpp<br>
    llvm/trunk/test/Transforms/<wbr>Util/PredicateInfo/condprop.ll<br>
    llvm/trunk/test/Transforms/<wbr>Util/PredicateInfo/testandor.<wbr>ll<br>
<br>
Modified: llvm/trunk/lib/Transforms/<wbr>Utils/PredicateInfo.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/PredicateInfo.cpp?rev=304447&r1=304446&r2=304447&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/<wbr>Transforms/Utils/<wbr>PredicateInfo.cpp?rev=304447&<wbr>r1=304446&r2=304447&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/Transforms/<wbr>Utils/PredicateInfo.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/<wbr>Utils/PredicateInfo.cpp Thu Jun  1 13:36:24 2017<br>
@@ -541,7 +541,40 @@ Value *PredicateInfo::<wbr>materializeStack(u<br>
 //<br>
 // TODO: Use this algorithm to perform fast single-variable renaming in<br>
 // promotememtoreg and memoryssa.<br>
-void PredicateInfo::renameUses(<wbr>SmallPtrSetImpl<Value *> &OpsToRename) {<br>
+void PredicateInfo::renameUses(<wbr>SmallPtrSetImpl<Value *> &OpSet) {<br>
+  // Sort OpsToRename since we are going to iterate it.<br>
+  SmallVector<Value *, 8> OpsToRename(OpSet.begin(), OpSet.end());<br>
+  std::sort(OpsToRename.begin(), OpsToRename.end(), [&](const Value *A,<br>
+                                                        const Value *B) {<br>
+    auto *ArgA = dyn_cast_or_null<Argument>(A);<br>
+    auto *ArgB = dyn_cast_or_null<Argument>(B);<br>
+<br>
+    // If A and B are args, order them based on their arg no.<br>
+    if (ArgA && !ArgB)<br>
+      return true;<br>
+    if (ArgB && !ArgA)<br>
+      return false;<br>
+    if (ArgA && ArgB)<br>
+      return ArgA->getArgNo() < ArgB->getArgNo();<br>
+<br>
+    // Else, A are B are instructions.<br>
+    // If they belong to different BBs, order them by the dominance of BBs.<br>
+    auto *AInst = cast<Instruction>(A);<br>
+    auto *BInst = cast<Instruction>(B);<br>
+    if (AInst->getParent() != BInst->getParent())<br>
+      return DT.dominates(AInst->getParent(<wbr>), BInst->getParent());<br>
+<br>
+    // Else, A and B belong to the same BB.<br>
+    // Order A and B by their dominance.<br>
+    auto *BB = AInst->getParent();<br>
+    auto LookupResult = OBBMap.find(BB);<br>
+    if (LookupResult != OBBMap.end())<br>
+      return LookupResult->second-><wbr>dominates(AInst, BInst);<br>
+<br>
+    auto Result = OBBMap.insert({BB, make_unique<OrderedBasicBlock><wbr>(BB)});<br>
+    return Result.first->second-><wbr>dominates(AInst, BInst);<br>
+  });<br>
+<br>
   ValueDFS_Compare Compare(OBBMap);<br>
   // Compute liveness, and rename in O(uses) per Op.<br>
   for (auto *Op : OpsToRename) {<br>
<br>
Modified: llvm/trunk/test/Transforms/<wbr>Util/PredicateInfo/condprop.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/Util/PredicateInfo/condprop.ll?rev=304447&r1=304446&r2=304447&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>Transforms/Util/PredicateInfo/<wbr>condprop.ll?rev=304447&r1=<wbr>304446&r2=304447&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/Transforms/<wbr>Util/PredicateInfo/condprop.ll (original)<br>
+++ llvm/trunk/test/Transforms/<wbr>Util/PredicateInfo/condprop.ll Thu Jun  1 13:36:24 2017<br>
@@ -1,5 +1,6 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py<br>
 ; RUN: opt -print-predicateinfo -analyze  < %s 2>&1 | FileCheck %s<br>
+; RUN: opt -print-predicateinfo -analyze -reverse-iterate  < %s 2>&1 | FileCheck %s<br>
<br>
 @a = external global i32               ; <i32*> [#uses=7]<br>
<br>
@@ -98,10 +99,10 @@ define void @test3(i32 %x, i32 %y) {<br>
 ; CHECK-NEXT:    [[XZ:%.*]] = icmp eq i32 [[X:%.*]], 0<br>
 ; CHECK-NEXT:    [[YZ:%.*]] = icmp eq i32 [[Y:%.*]], 0<br>
 ; CHECK-NEXT:    [[Z:%.*]] = and i1 [[XZ]], [[YZ]]<br>
-; CHECK:         [[XZ_0:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[XZ]])<br>
 ; CHECK:         [[X_0:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[X]])<br>
-; CHECK:         [[YZ_0:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[YZ]])<br>
 ; CHECK:         [[Y_0:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[Y]])<br>
+; CHECK:         [[XZ_0:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[XZ]])<br>
+; CHECK:         [[YZ_0:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[YZ]])<br>
 ; CHECK:         [[Z_0:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[Z]])<br>
 ; CHECK-NEXT:    br i1 [[Z]], label [[BOTH_ZERO:%.*]], label [[NOPE:%.*]]<br>
 ; CHECK:       both_zero:<br>
@@ -382,8 +383,8 @@ ret:<br>
 define i32 @test10(i32 %j, i32 %i) {<br>
 ; CHECK-LABEL: @test10(<br>
 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[I:%.*]], [[J:%.*]]<br>
-; CHECK:         [[I_0:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[I]])<br>
 ; CHECK:         [[J_0:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[J]])<br>
+; CHECK:         [[I_0:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[I]])<br>
 ; CHECK-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[RET:%.*]]<br>
 ; CHECK:       cond_true:<br>
 ; CHECK-NEXT:    [[DIFF:%.*]] = sub i32 [[I_0]], [[J_0]]<br>
<br>
Modified: llvm/trunk/test/Transforms/<wbr>Util/PredicateInfo/testandor.<wbr>ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/Util/PredicateInfo/testandor.ll?rev=304447&r1=304446&r2=304447&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>Transforms/Util/PredicateInfo/<wbr>testandor.ll?rev=304447&r1=<wbr>304446&r2=304447&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/Transforms/<wbr>Util/PredicateInfo/testandor.<wbr>ll (original)<br>
+++ llvm/trunk/test/Transforms/<wbr>Util/PredicateInfo/testandor.<wbr>ll Thu Jun  1 13:36:24 2017<br>
@@ -1,5 +1,6 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py<br>
 ; RUN: opt -print-predicateinfo < %s 2>&1 | FileCheck %s<br>
+; RUN: opt -print-predicateinfo -reverse-iterate < %s 2>&1 | FileCheck %s<br>
<br>
 declare void @foo(i1)<br>
 declare void @bar(i32)<br>
@@ -10,10 +11,10 @@ define void @testor(i32 %x, i32 %y) {<br>
 ; CHECK-NEXT:    [[XZ:%.*]] = icmp eq i32 [[X:%.*]], 0<br>
 ; CHECK-NEXT:    [[YZ:%.*]] = icmp eq i32 [[Y:%.*]], 0<br>
 ; CHECK-NEXT:    [[Z:%.*]] = or i1 [[XZ]], [[YZ]]<br>
-; CHECK:         [[XZ_0:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[XZ]])<br>
 ; CHECK:         [[X_0:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[X]])<br>
-; CHECK:         [[YZ_0:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[YZ]])<br>
 ; CHECK:         [[Y_0:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[Y]])<br>
+; CHECK:         [[XZ_0:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[XZ]])<br>
+; CHECK:         [[YZ_0:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[YZ]])<br>
 ; CHECK:         [[Z_0:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[Z]])<br>
 ; CHECK-NEXT:    br i1 [[Z]], label [[ONEOF:%.*]], label [[NEITHER:%.*]]<br>
 ; CHECK:       oneof:<br>
@@ -54,10 +55,10 @@ define void @testand(i32 %x, i32 %y) {<br>
 ; CHECK-NEXT:    [[XZ:%.*]] = icmp eq i32 [[X:%.*]], 0<br>
 ; CHECK-NEXT:    [[YZ:%.*]] = icmp eq i32 [[Y:%.*]], 0<br>
 ; CHECK-NEXT:    [[Z:%.*]] = and i1 [[XZ]], [[YZ]]<br>
-; CHECK:         [[XZ_0:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[XZ]])<br>
 ; CHECK:         [[X_0:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[X]])<br>
-; CHECK:         [[YZ_0:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[YZ]])<br>
 ; CHECK:         [[Y_0:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[Y]])<br>
+; CHECK:         [[XZ_0:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[XZ]])<br>
+; CHECK:         [[YZ_0:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[YZ]])<br>
 ; CHECK:         [[Z_0:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[Z]])<br>
 ; CHECK-NEXT:    br i1 [[Z]], label [[BOTH:%.*]], label [[NOPE:%.*]]<br>
 ; CHECK:       both:<br>
@@ -98,9 +99,9 @@ define void @testandsame(i32 %x, i32 %y)<br>
 ; CHECK-NEXT:    [[XGT:%.*]] = icmp sgt i32 [[X:%.*]], 0<br>
 ; CHECK-NEXT:    [[XLT:%.*]] = icmp slt i32 [[X]], 100<br>
 ; CHECK-NEXT:    [[Z:%.*]] = and i1 [[XGT]], [[XLT]]<br>
-; CHECK:         [[XGT_0:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[XGT]])<br>
 ; CHECK:         [[X_0:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[X]])<br>
 ; CHECK:         [[X_0_1:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[X_0]])<br>
+; CHECK:         [[XGT_0:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[XGT]])<br>
 ; CHECK:         [[XLT_0:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[XLT]])<br>
 ; CHECK:         [[Z_0:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[Z]])<br>
 ; CHECK-NEXT:    br i1 [[Z]], label [[BOTH:%.*]], label [[NOPE:%.*]]<br>
@@ -136,23 +137,23 @@ define void @testandassume(i32 %x, i32 %<br>
 ; CHECK-NEXT:    [[XZ:%.*]] = icmp eq i32 [[X:%.*]], 0<br>
 ; CHECK-NEXT:    [[YZ:%.*]] = icmp eq i32 [[Y:%.*]], 0<br>
 ; CHECK-NEXT:    [[Z:%.*]] = and i1 [[XZ]], [[YZ]]<br>
-; CHECK:         [[TMP1:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[XZ]])<br>
-; CHECK:         [[TMP2:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[X]])<br>
-; CHECK:         [[TMP3:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[YZ]])<br>
-; CHECK:         [[TMP4:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[Y]])<br>
+; CHECK:         [[TMP1:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[X]])<br>
+; CHECK:         [[TMP2:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[Y]])<br>
+; CHECK:         [[TMP3:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[XZ]])<br>
+; CHECK:         [[TMP4:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[YZ]])<br>
 ; CHECK:         [[TMP5:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[Z]])<br>
 ; CHECK-NEXT:    call void @llvm.assume(i1 [[TMP5]])<br>
-; CHECK:         [[DOT0:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[TMP1]])<br>
+; CHECK:         [[DOT0:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[TMP1]])<br>
 ; CHECK:         [[DOT01:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[TMP2]])<br>
 ; CHECK:         [[DOT02:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[TMP3]])<br>
-; CHECK:         [[DOT03:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[TMP4]])<br>
+; CHECK:         [[DOT03:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[TMP4]])<br>
 ; CHECK:         [[DOT04:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[TMP5]])<br>
 ; CHECK-NEXT:    br i1 [[TMP5]], label [[BOTH:%.*]], label [[NOPE:%.*]]<br>
 ; CHECK:       both:<br>
-; CHECK-NEXT:    call void @foo(i1 [[DOT0]])<br>
 ; CHECK-NEXT:    call void @foo(i1 [[DOT02]])<br>
+; CHECK-NEXT:    call void @foo(i1 [[DOT03]])<br>
+; CHECK-NEXT:    call void @bar(i32 [[DOT0]])<br>
 ; CHECK-NEXT:    call void @bar(i32 [[DOT01]])<br>
-; CHECK-NEXT:    call void @bar(i32 [[DOT03]])<br>
 ; CHECK-NEXT:    ret void<br>
 ; CHECK:       nope:<br>
 ; CHECK-NEXT:    call void @foo(i1 [[DOT04]])<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>