<p dir="ltr">We do have a SetVector for when you want both, in case that's useful to you</p>
<div class="gmail_quote">On Aug 21, 2014 6:33 PM, "Peter Collingbourne" <<a href="mailto:peter@pcc.me.uk">peter@pcc.me.uk</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Author: pcc<br>
Date: Thu Aug 21 20:18:18 2014<br>
New Revision: 216255<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=216255&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=216255&view=rev</a><br>
Log:<br>
[dfsan] Fix non-determinism bug in non-zero label check annotator.<br>
<br>
We now use a std::vector instead of a DenseSet to store the list of<br>
label checks so that we can iterate over it deterministically.<br>
<br>
Modified:<br>
    llvm/trunk/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp<br>
    llvm/trunk/test/Instrumentation/DataFlowSanitizer/debug-nonzero-labels.ll<br>
<br>
Modified: llvm/trunk/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp?rev=216255&r1=216254&r2=216255&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp?rev=216255&r1=216254&r2=216255&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp Thu Aug 21 20:18:18 2014<br>
@@ -280,7 +280,7 @@ struct DFSanFunction {<br>
   DenseMap<AllocaInst *, AllocaInst *> AllocaShadowMap;<br>
   std::vector<std::pair<PHINode *, PHINode *> > PHIFixups;<br>
   DenseSet<Instruction *> SkipInsts;<br>
-  DenseSet<Value *> NonZeroChecks;<br>
+  std::vector<Value *> NonZeroChecks;<br>
   bool AvoidNewBlocks;<br>
<br>
   struct CachedCombinedShadow {<br>
@@ -802,18 +802,16 @@ bool DataFlowSanitizer::runOnModule(Modu<br>
     // yet).  To make our life easier, do this work in a pass after the main<br>
     // instrumentation.<br>
     if (ClDebugNonzeroLabels) {<br>
-      for (DenseSet<Value *>::iterator i = DFSF.NonZeroChecks.begin(),<br>
-                                       e = DFSF.NonZeroChecks.end();<br>
-           i != e; ++i) {<br>
+      for (Value *V : DFSF.NonZeroChecks) {<br>
         Instruction *Pos;<br>
-        if (Instruction *I = dyn_cast<Instruction>(*i))<br>
+        if (Instruction *I = dyn_cast<Instruction>(V))<br>
           Pos = I->getNextNode();<br>
         else<br>
           Pos = DFSF.F->getEntryBlock().begin();<br>
         while (isa<PHINode>(Pos) || isa<AllocaInst>(Pos))<br>
           Pos = Pos->getNextNode();<br>
         IRBuilder<> IRB(Pos);<br>
-        Value *Ne = IRB.CreateICmpNE(*i, DFSF.DFS.ZeroShadow);<br>
+        Value *Ne = IRB.CreateICmpNE(V, DFSF.DFS.ZeroShadow);<br>
         BranchInst *BI = cast<BranchInst>(SplitBlockAndInsertIfThen(<br>
             Ne, Pos, /*Unreachable=*/false, ColdCallWeights));<br>
         IRBuilder<> ThenIRB(BI);<br>
@@ -878,7 +876,7 @@ Value *DFSanFunction::getShadow(Value *V<br>
         break;<br>
       }<br>
       }<br>
-      NonZeroChecks.insert(Shadow);<br>
+      NonZeroChecks.push_back(Shadow);<br>
     } else {<br>
       Shadow = DFS.ZeroShadow;<br>
     }<br>
@@ -1138,7 +1136,7 @@ void DFSanVisitor::visitLoadInst(LoadIns<br>
     Shadow = DFSF.combineShadows(Shadow, PtrShadow, &LI);<br>
   }<br>
   if (Shadow != DFSF.DFS.ZeroShadow)<br>
-    DFSF.NonZeroChecks.insert(Shadow);<br>
+    DFSF.NonZeroChecks.push_back(Shadow);<br>
<br>
   DFSF.setShadow(&LI, Shadow);<br>
 }<br>
@@ -1480,7 +1478,7 @@ void DFSanVisitor::visitCallSite(CallSit<br>
       LoadInst *LI = NextIRB.CreateLoad(DFSF.getRetvalTLS());<br>
       DFSF.SkipInsts.insert(LI);<br>
       DFSF.setShadow(CS.getInstruction(), LI);<br>
-      DFSF.NonZeroChecks.insert(LI);<br>
+      DFSF.NonZeroChecks.push_back(LI);<br>
     }<br>
   }<br>
<br>
@@ -1534,7 +1532,7 @@ void DFSanVisitor::visitCallSite(CallSit<br>
           ExtractValueInst::Create(NewCS.getInstruction(), 1, "", Next);<br>
       DFSF.SkipInsts.insert(ExShadow);<br>
       DFSF.setShadow(ExVal, ExShadow);<br>
-      DFSF.NonZeroChecks.insert(ExShadow);<br>
+      DFSF.NonZeroChecks.push_back(ExShadow);<br>
<br>
       CS.getInstruction()->replaceAllUsesWith(ExVal);<br>
     }<br>
<br>
Modified: llvm/trunk/test/Instrumentation/DataFlowSanitizer/debug-nonzero-labels.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/DataFlowSanitizer/debug-nonzero-labels.ll?rev=216255&r1=216254&r2=216255&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/DataFlowSanitizer/debug-nonzero-labels.ll?rev=216255&r1=216254&r2=216255&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/test/Instrumentation/DataFlowSanitizer/debug-nonzero-labels.ll (original)<br>
+++ llvm/trunk/test/Instrumentation/DataFlowSanitizer/debug-nonzero-labels.ll Thu Aug 21 20:18:18 2014<br>
@@ -3,13 +3,16 @@ target datalayout = "e-p:64:64:64-i1:8:8<br>
<br>
 declare i32 @g()<br>
<br>
-; CHECK: define { i32, i16 } @"dfs$f"(i32, i16)<br>
-define i32 @f(i32) {<br>
+; CHECK: define { i32, i16 } @"dfs$f"(i32, i32, i16, i16)<br>
+define i32 @f(i32, i32) {<br>
   ; CHECK: [[LOCALLABELALLOCA:%.*]] = alloca i16<br>
-  ; CHECK: [[ARGCMP:%.*]] = icmp ne i16 %1, 0<br>
-  ; CHECK: br i1 [[ARGCMP]]<br>
   %i = alloca i32<br>
-  store i32 %0, i32* %i<br>
+  ; CHECK: [[ARGCMP1:%.*]] = icmp ne i16 %3, 0<br>
+  ; CHECK: br i1 [[ARGCMP1]]<br>
+  ; CHECK: [[ARGCMP2:%.*]] = icmp ne i16 %2, 0<br>
+  ; CHECK: br i1 [[ARGCMP2]]<br>
+  %x = add i32 %0, %1<br>
+  store i32 %x, i32* %i<br>
   ; CHECK: [[CALL:%.*]] = call { i32, i16 } @"dfs$g"()<br>
   ; CHECK: [[CALLLABEL:%.*]] = extractvalue { i32, i16 } [[CALL]], 1<br>
   ; CHECK: [[CALLCMP:%.*]] = icmp ne i16 [[CALLLABEL]], 0<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>