<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>