[msan] Fix handling of select with vector condition.

llvm-svn: 171069
This commit is contained in:
Evgeniy Stepanov 2012-12-25 14:56:21 +00:00
parent 11a2eccc8b
commit ec8371283b
2 changed files with 28 additions and 2 deletions

View File

@ -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) {

View File

@ -251,6 +251,23 @@ entry:
; CHECK: ret i32
; Check that we propagate origin for "select" with vector condition.
; Select condition is flattened to i1, which is then used to select one of the
; argument origins.
define <8 x i16> @SelectVector(<8 x i16> %a, <8 x i16> %b, <8 x i1> %c) nounwind uwtable readnone {
entry:
%cond = select <8 x i1> %c, <8 x i16> %a, <8 x i16> %b
ret <8 x i16> %cond
}
; CHECK-ORIGINS: @SelectVector
; CHECK-ORIGINS: bitcast <8 x i1> {{.*}} to i8
; CHECK-ORIGINS: icmp ne i8
; CHECK-ORIGINS: select i1
; CHECK-ORIGINS: ret <8 x i16>
define i8* @IntToPtr(i64 %x) nounwind uwtable readnone {
entry:
%0 = inttoptr i64 %x to i8*