forked from OSchip/llvm-project
[msan] Fix handling of select with vector condition.
llvm-svn: 171069
This commit is contained in:
parent
11a2eccc8b
commit
ec8371283b
|
@ -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) {
|
||||
|
|
|
@ -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*
|
||||
|
|
Loading…
Reference in New Issue