[msan] Instrument bswap intrinsic.
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>
Wed, 5 Dec 2012 14:39:55 +0000 (14:39 +0000)
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>
Wed, 5 Dec 2012 14:39:55 +0000 (14:39 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@169383 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Instrumentation/MemorySanitizer.cpp
test/Instrumentation/MemorySanitizer/msan_basic.ll

index 183403d5fcc817458591bbbbe69d358d459b74a2..342751296b499326ef003dd4448d55a45c910d5a 100644 (file)
@@ -1101,6 +1101,25 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
     VAHelper->visitVACopyInst(I);
   }
 
+  void handleBswap(IntrinsicInst &I) {
+    IRBuilder<> IRB(&I);
+    Value *Op = I.getArgOperand(0);
+    Type *OpType = Op->getType();
+    Function *BswapFunc = Intrinsic::getDeclaration(
+      F.getParent(), Intrinsic::bswap, ArrayRef<Type*>(&OpType, 1));
+    setShadow(&I, IRB.CreateCall(BswapFunc, getShadow(Op)));
+    setOrigin(&I, getOrigin(Op));
+  }
+
+  void visitIntrinsicInst(IntrinsicInst &I) {
+    switch (I.getIntrinsicID()) {
+    case llvm::Intrinsic::bswap:
+      handleBswap(I); break;
+    default:
+      visitInstruction(I); break;
+    }
+  }
+
   void visitCallSite(CallSite CS) {
     Instruction &I = *CS.getInstruction();
     assert((CS.isCall() || CS.isInvoke()) && "Unknown type of CallSite");
@@ -1120,12 +1139,8 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
       // will get propagated to a void RetVal.
       if (Call->isTailCall() && Call->getType() != Call->getParent()->getType())
         Call->setTailCall(false);
-      if (isa<IntrinsicInst>(&I)) {
-        // All intrinsics we care about are handled in corresponding visit*
-        // methods. Add checks for the arguments, mark retval as clean.
-        visitInstruction(I);
-        return;
-      }
+
+      assert(!isa<IntrinsicInst>(&I) && "intrinsics are handled elsewhere");
     }
     IRBuilder<> IRB(&I);
     unsigned ArgOffset = 0;
index 05cdaa7d6f3a4b95cc0460e4714586173d6e3c8f..a62b600cb1f4dc0f61c9ba1ae139e6d5e53627a3 100644 (file)
@@ -351,3 +351,19 @@ define <4 x i32> @ShuffleVector(<4 x i32> %vec, <4 x i32> %vec1) {
 ; CHECK-NOT: call void @__msan_warning
 ; CHECK: shufflevector
 ; CHECK: ret <4 x i32>
+
+; Test bswap intrinsic instrumentation
+define i32 @BSwap(i32 %x) nounwind uwtable readnone {
+  %y = tail call i32 @llvm.bswap.i32(i32 %x)
+  ret i32 %y
+}
+
+declare i32 @llvm.bswap.i32(i32) nounwind readnone
+
+; CHECK: @BSwap
+; CHECK-NOT: call void @__msan_warning
+; CHECK: @llvm.bswap.i32
+; CHECK-NOT: call void @__msan_warning
+; CHECK: @llvm.bswap.i32
+; CHECK-NOT: call void @__msan_warning
+; CHECK: ret i32