Skip to content

Commit

Permalink
[msan] Fix handling of select with struct arguments.
Browse files Browse the repository at this point in the history
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@189796 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
eugenis committed Sep 3, 2013
1 parent 6a9b29e commit 69086b2
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 3 deletions.
17 changes: 14 additions & 3 deletions lib/Transforms/Instrumentation/MemorySanitizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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?
Expand Down
13 changes: 13 additions & 0 deletions test/Instrumentation/MemorySanitizer/msan_basic.ll
Original file line number Diff line number Diff line change
Expand Up @@ -290,6 +290,19 @@ entry:
; CHECK-ORIGINS: ret <8 x i16>


define { i64, i64 } @SelectStruct(i1 zeroext %x, { i64, i64 } %a, { i64, i64 } %b) readnone sanitize_memory {
entry:
%c = select i1 %x, { i64, i64 } %a, { i64, i64 } %b
ret { i64, i64 } %c
}

; CHECK: @SelectStruct
; CHECK: select i1 {{.*}}, { i64, i64 }
; CHECK-NEXT: select i1 {{.*}}, { i64, i64 } { i64 -1, i64 -1 }, { i64, i64 }
; CHECK-NEXT: select i1 {{.*}}, { i64, i64 }
; CHECK: ret { i64, i64 }


define i8* @IntToPtr(i64 %x) nounwind uwtable readnone sanitize_memory {
entry:
%0 = inttoptr i64 %x to i8*
Expand Down

0 comments on commit 69086b2

Please sign in to comment.