diff --git a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp --- a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp @@ -2638,12 +2638,6 @@ return false; unsigned NumArgOperands = I.getNumArgOperands(); - if (I.getIntrinsicID() == Intrinsic::abs) { - assert(NumArgOperands == 2); - // The last argument is just a boolean flag. - NumArgOperands = 1; - } - for (unsigned i = 0; i < NumArgOperands; ++i) { Type *Ty = I.getArgOperand(i)->getType(); if (Ty != RetTy) @@ -2659,6 +2653,22 @@ return true; } + bool maybeHandleAbsIntrinsic(IntrinsicInst &I) { + if (I.getIntrinsicID() != Intrinsic::abs) + return false; + + Type *RetTy = I.getType(); + assert(RetTy->isIntOrIntVectorTy()); + assert(I.getArgOperand(0)->getType() == RetTy); + + // FIXME: Handle is_int_min_poison. + IRBuilder<> IRB(&I); + setShadow(&I, getShadow(&I, 0)); + setOrigin(&I, getOrigin(&I, 0)); + + return true; + } + /// Heuristically instrument unknown intrinsics. /// /// The main purpose of this code is to do something reasonable with all @@ -2691,6 +2701,9 @@ return handleVectorLoadIntrinsic(I); } + if (maybeHandleAbsIntrinsic(I)) + return true; + if (I.doesNotAccessMemory()) if (maybeHandleSimpleNomemIntrinsic(I)) return true;