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