diff options
| author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2012-12-25 14:56:21 +0000 |
|---|---|---|
| committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2012-12-25 14:56:21 +0000 |
| commit | ec8371283b8d616d5ab2ac14cfdb29e459f69b77 (patch) | |
| tree | 77d2860e9cf639722eb80bf60ac357265972fe93 /llvm/lib/Transforms/Instrumentation | |
| parent | 11a2eccc8b6e3d396b351007263115bc20eea9c3 (diff) | |
| download | bcm5719-llvm-ec8371283b8d616d5ab2ac14cfdb29e459f69b77.tar.gz bcm5719-llvm-ec8371283b8d616d5ab2ac14cfdb29e459f69b77.zip | |
[msan] Fix handling of select with vector condition.
llvm-svn: 171069
Diffstat (limited to 'llvm/lib/Transforms/Instrumentation')
| -rw-r--r-- | llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp index c151c3bd0f2..ba16e3dc3f7 100644 --- a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp @@ -1566,9 +1566,18 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> { setShadow(&I, IRB.CreateSelect(I.getCondition(), getShadow(I.getTrueValue()), getShadow(I.getFalseValue()), "_msprop")); - if (MS.TrackOrigins) - setOrigin(&I, IRB.CreateSelect(I.getCondition(), + if (MS.TrackOrigins) { + // Origins are always i32, so any vector conditions must be flattened. + // FIXME: consider tracking vector origins for app vectors? + Value *Cond = I.getCondition(); + if (Cond->getType()->isVectorTy()) { + Value *ConvertedShadow = convertToShadowTyNoVec(Cond, IRB); + Cond = IRB.CreateICmpNE(ConvertedShadow, + getCleanShadow(ConvertedShadow), "_mso_select"); + } + setOrigin(&I, IRB.CreateSelect(Cond, getOrigin(I.getTrueValue()), getOrigin(I.getFalseValue()))); + } } void visitLandingPadInst(LandingPadInst &I) { |

