diff --git a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp index b352558a1c0d25..0d45bc3bfebdc0 100644 --- a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp @@ -4486,10 +4486,15 @@ struct MemorySanitizerVisitor : public InstVisitor { Value *B = I.getCondition(); Value *C = I.getTrueValue(); Value *D = I.getFalseValue(); + Value *Sb = getShadow(B); Value *Sc = getShadow(C); Value *Sd = getShadow(D); + Value *Ob = MS.TrackOrigins ? getOrigin(B) : nullptr; + Value *Oc = MS.TrackOrigins ? getOrigin(C) : nullptr; + Value *Od = MS.TrackOrigins ? getOrigin(D) : nullptr; + // Result shadow if condition shadow is 0. Value *Sa0 = IRB.CreateSelect(B, Sc, Sd); Value *Sa1; @@ -4522,10 +4527,7 @@ struct MemorySanitizerVisitor : public InstVisitor { } // a = select b, c, d // Oa = Sb ? Ob : (b ? Oc : Od) - setOrigin( - &I, IRB.CreateSelect(Sb, getOrigin(I.getCondition()), - IRB.CreateSelect(B, getOrigin(I.getTrueValue()), - getOrigin(I.getFalseValue())))); + setOrigin(&I, IRB.CreateSelect(Sb, Ob, IRB.CreateSelect(B, Oc, Od))); } }