[llvm] r216255 - [dfsan] Fix non-determinism bug in non-zero label check annotator.

David Blaikie dblaikie at gmail.com
Thu Aug 21 20:10:19 PDT 2014


We do have a SetVector for when you want both, in case that's useful to you
On Aug 21, 2014 6:33 PM, "Peter Collingbourne" <peter at pcc.me.uk> wrote:

> Author: pcc
> Date: Thu Aug 21 20:18:18 2014
> New Revision: 216255
>
> URL: http://llvm.org/viewvc/llvm-project?rev=216255&view=rev
> Log:
> [dfsan] Fix non-determinism bug in non-zero label check annotator.
>
> We now use a std::vector instead of a DenseSet to store the list of
> label checks so that we can iterate over it deterministically.
>
> Modified:
>     llvm/trunk/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp
>
> llvm/trunk/test/Instrumentation/DataFlowSanitizer/debug-nonzero-labels.ll
>
> Modified: llvm/trunk/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp?rev=216255&r1=216254&r2=216255&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp
> (original)
> +++ llvm/trunk/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp Thu
> Aug 21 20:18:18 2014
> @@ -280,7 +280,7 @@ struct DFSanFunction {
>    DenseMap<AllocaInst *, AllocaInst *> AllocaShadowMap;
>    std::vector<std::pair<PHINode *, PHINode *> > PHIFixups;
>    DenseSet<Instruction *> SkipInsts;
> -  DenseSet<Value *> NonZeroChecks;
> +  std::vector<Value *> NonZeroChecks;
>    bool AvoidNewBlocks;
>
>    struct CachedCombinedShadow {
> @@ -802,18 +802,16 @@ bool DataFlowSanitizer::runOnModule(Modu
>      // yet).  To make our life easier, do this work in a pass after the
> main
>      // instrumentation.
>      if (ClDebugNonzeroLabels) {
> -      for (DenseSet<Value *>::iterator i = DFSF.NonZeroChecks.begin(),
> -                                       e = DFSF.NonZeroChecks.end();
> -           i != e; ++i) {
> +      for (Value *V : DFSF.NonZeroChecks) {
>          Instruction *Pos;
> -        if (Instruction *I = dyn_cast<Instruction>(*i))
> +        if (Instruction *I = dyn_cast<Instruction>(V))
>            Pos = I->getNextNode();
>          else
>            Pos = DFSF.F->getEntryBlock().begin();
>          while (isa<PHINode>(Pos) || isa<AllocaInst>(Pos))
>            Pos = Pos->getNextNode();
>          IRBuilder<> IRB(Pos);
> -        Value *Ne = IRB.CreateICmpNE(*i, DFSF.DFS.ZeroShadow);
> +        Value *Ne = IRB.CreateICmpNE(V, DFSF.DFS.ZeroShadow);
>          BranchInst *BI = cast<BranchInst>(SplitBlockAndInsertIfThen(
>              Ne, Pos, /*Unreachable=*/false, ColdCallWeights));
>          IRBuilder<> ThenIRB(BI);
> @@ -878,7 +876,7 @@ Value *DFSanFunction::getShadow(Value *V
>          break;
>        }
>        }
> -      NonZeroChecks.insert(Shadow);
> +      NonZeroChecks.push_back(Shadow);
>      } else {
>        Shadow = DFS.ZeroShadow;
>      }
> @@ -1138,7 +1136,7 @@ void DFSanVisitor::visitLoadInst(LoadIns
>      Shadow = DFSF.combineShadows(Shadow, PtrShadow, &LI);
>    }
>    if (Shadow != DFSF.DFS.ZeroShadow)
> -    DFSF.NonZeroChecks.insert(Shadow);
> +    DFSF.NonZeroChecks.push_back(Shadow);
>
>    DFSF.setShadow(&LI, Shadow);
>  }
> @@ -1480,7 +1478,7 @@ void DFSanVisitor::visitCallSite(CallSit
>        LoadInst *LI = NextIRB.CreateLoad(DFSF.getRetvalTLS());
>        DFSF.SkipInsts.insert(LI);
>        DFSF.setShadow(CS.getInstruction(), LI);
> -      DFSF.NonZeroChecks.insert(LI);
> +      DFSF.NonZeroChecks.push_back(LI);
>      }
>    }
>
> @@ -1534,7 +1532,7 @@ void DFSanVisitor::visitCallSite(CallSit
>            ExtractValueInst::Create(NewCS.getInstruction(), 1, "", Next);
>        DFSF.SkipInsts.insert(ExShadow);
>        DFSF.setShadow(ExVal, ExShadow);
> -      DFSF.NonZeroChecks.insert(ExShadow);
> +      DFSF.NonZeroChecks.push_back(ExShadow);
>
>        CS.getInstruction()->replaceAllUsesWith(ExVal);
>      }
>
> Modified:
> llvm/trunk/test/Instrumentation/DataFlowSanitizer/debug-nonzero-labels.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/DataFlowSanitizer/debug-nonzero-labels.ll?rev=216255&r1=216254&r2=216255&view=diff
>
> ==============================================================================
> ---
> llvm/trunk/test/Instrumentation/DataFlowSanitizer/debug-nonzero-labels.ll
> (original)
> +++
> llvm/trunk/test/Instrumentation/DataFlowSanitizer/debug-nonzero-labels.ll
> Thu Aug 21 20:18:18 2014
> @@ -3,13 +3,16 @@ target datalayout = "e-p:64:64:64-i1:8:8
>
>  declare i32 @g()
>
> -; CHECK: define { i32, i16 } @"dfs$f"(i32, i16)
> -define i32 @f(i32) {
> +; CHECK: define { i32, i16 } @"dfs$f"(i32, i32, i16, i16)
> +define i32 @f(i32, i32) {
>    ; CHECK: [[LOCALLABELALLOCA:%.*]] = alloca i16
> -  ; CHECK: [[ARGCMP:%.*]] = icmp ne i16 %1, 0
> -  ; CHECK: br i1 [[ARGCMP]]
>    %i = alloca i32
> -  store i32 %0, i32* %i
> +  ; CHECK: [[ARGCMP1:%.*]] = icmp ne i16 %3, 0
> +  ; CHECK: br i1 [[ARGCMP1]]
> +  ; CHECK: [[ARGCMP2:%.*]] = icmp ne i16 %2, 0
> +  ; CHECK: br i1 [[ARGCMP2]]
> +  %x = add i32 %0, %1
> +  store i32 %x, i32* %i
>    ; CHECK: [[CALL:%.*]] = call { i32, i16 } @"dfs$g"()
>    ; CHECK: [[CALLLABEL:%.*]] = extractvalue { i32, i16 } [[CALL]], 1
>    ; CHECK: [[CALLCMP:%.*]] = icmp ne i16 [[CALLLABEL]], 0
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140821/68a9789f/attachment.html>


More information about the llvm-commits mailing list