[msan] Propagate condition origin in select instruction.

llvm-svn: 195349
This commit is contained in:
Evgeniy Stepanov 2013-11-21 12:00:24 +00:00
parent 70fcec46e9
commit cb5bdffc4e
2 changed files with 19 additions and 5 deletions

View File

@ -2082,13 +2082,20 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
// Origins are always i32, so any vector conditions must be flattened.
// FIXME: consider tracking vector origins for app vectors?
Value *Cond = I.getCondition();
Value *CondShadow = getShadow(Cond);
if (Cond->getType()->isVectorTy()) {
Value *ConvertedShadow = convertToShadowTyNoVec(Cond, IRB);
Cond = IRB.CreateICmpNE(ConvertedShadow,
getCleanShadow(ConvertedShadow), "_mso_select");
Type *FlatTy = getShadowTyNoVec(Cond->getType());
Cond = IRB.CreateICmpNE(IRB.CreateBitCast(Cond, FlatTy),
ConstantInt::getNullValue(FlatTy));
CondShadow = IRB.CreateICmpNE(IRB.CreateBitCast(CondShadow, FlatTy),
ConstantInt::getNullValue(FlatTy));
}
setOrigin(&I, IRB.CreateSelect(Cond,
getOrigin(I.getTrueValue()), getOrigin(I.getFalseValue())));
// a = select b, c, d
// Oa = Sb ? Ob : (b ? Oc : Od)
setOrigin(&I, IRB.CreateSelect(
CondShadow, getOrigin(I.getCondition()),
IRB.CreateSelect(Cond, getOrigin(I.getTrueValue()),
getOrigin(I.getFalseValue()))));
}
}

View File

@ -255,6 +255,7 @@ entry:
; CHECK-NEXT: select
; CHECK-ORIGINS: select
; CHECK-ORIGINS: select
; CHECK: select
; CHECK: ret i32
@ -274,6 +275,9 @@ entry:
; CHECK-NEXT: or <8 x i16>
; CHECK-ORIGINS: bitcast <8 x i1> {{.*}} to i8
; CHECK-ORIGINS: icmp ne i8 {{.*}}, 0
; CHECK-ORIGINS: bitcast <8 x i1> {{.*}} to i8
; CHECK-ORIGINS: icmp ne i8 {{.*}}, 0
; CHECK-ORIGINS: select i1
; CHECK-ORIGINS: select i1
; CHECK: select <8 x i1>
; CHECK: ret <8 x i16>
@ -295,6 +299,8 @@ entry:
; CHECK: sext i1 {{.*}} to i128
; CHECK: bitcast i128 {{.*}} to <8 x i16>
; CHECK: or <8 x i16>
; CHECK-ORIGINS: select i1
; CHECK-ORIGINS: select i1
; CHECK: select i1
; CHECK: ret <8 x i16>
@ -309,6 +315,7 @@ entry:
; CHECK: select i1 {{.*}}, { i64, i64 }
; CHECK-NEXT: select i1 {{.*}}, { i64, i64 } { i64 -1, i64 -1 }, { i64, i64 }
; CHECK-ORIGINS: select i1
; CHECK-ORIGINS: select i1
; CHECK-NEXT: select i1 {{.*}}, { i64, i64 }
; CHECK: ret { i64, i64 }