diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2013-09-03 13:05:29 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2013-09-03 13:05:29 +0000 |
commit | e95d37c81d5813cc93d53348c01263c4fcb81b48 (patch) | |
tree | ef5a4cb212263c12d8b1f93e6b3b90fe70bf95cc /llvm/lib/Transforms | |
parent | d4183dabd7a959746d558098762ab61e97d5ee6d (diff) | |
download | bcm5719-llvm-e95d37c81d5813cc93d53348c01263c4fcb81b48.tar.gz bcm5719-llvm-e95d37c81d5813cc93d53348c01263c4fcb81b48.zip |
[msan] Fix handling of select with struct arguments.
llvm-svn: 189796
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r-- | llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp index f2cf7a76e54..e9b78acbfe5 100644 --- a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp @@ -1744,11 +1744,22 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> { void visitSelectInst(SelectInst& I) { IRBuilder<> IRB(&I); // a = select b, c, d - // Sa = (sext Sb) | (select b, Sc, Sd) Value *S = IRB.CreateSelect(I.getCondition(), getShadow(I.getTrueValue()), getShadow(I.getFalseValue())); - Value *S2 = IRB.CreateSExt(getShadow(I.getCondition()), S->getType()); - setShadow(&I, IRB.CreateOr(S, S2, "_msprop")); + if (I.getType()->isAggregateType()) { + // To avoid "sign extending" i1 to an arbitrary aggregate type, we just do + // an extra "select". This results in much more compact IR. + // Sa = select Sb, poisoned, (select b, Sc, Sd) + S = IRB.CreateSelect(getShadow(I.getCondition()), + getPoisonedShadow(getShadowTy(I.getType())), S, + "_msprop_select_agg"); + } else { + // Sa = (sext Sb) | (select b, Sc, Sd) + S = IRB.CreateOr( + S, IRB.CreateSExt(getShadow(I.getCondition()), S->getType()), + "_msprop_select"); + } + setShadow(&I, S); if (MS.TrackOrigins) { // Origins are always i32, so any vector conditions must be flattened. // FIXME: consider tracking vector origins for app vectors? |