Index: llvm/lib/IR/Verifier.cpp =================================================================== --- llvm/lib/IR/Verifier.cpp +++ llvm/lib/IR/Verifier.cpp @@ -3070,6 +3070,13 @@ Function *Callee = dyn_cast(Call.getCalledOperand()->stripPointerCasts()); + // TODO: This doesn't use isIntrinsic(), because some ObjCARC tests + // perform bitcasts on @llvm.objc.sendMsg intrinsics. Limit the check to + // intrinsics with an ID for now, as we already prevent taking their address. + if (Callee && Callee->getIntrinsicID()) + Assert(Callee->getValueType() == FTy, + "Intrinsic called with incompatible signature", Call); + if (Attrs.hasFnAttribute(Attribute::Speculatable)) { // Don't allow speculatable on call sites, unless the underlying function // declaration is also speculatable. Index: llvm/test/Verifier/force-opaque-ptr.ll =================================================================== --- /dev/null +++ llvm/test/Verifier/force-opaque-ptr.ll @@ -0,0 +1,9 @@ +; RUN: not opt -passes=verify -force-opaque-pointers -S < %s 2>&1 | FileCheck %s + +declare i32 @llvm.umax.i32(i32, i32) + +define void @intrinsic_signature_mismatch() { +; CHECK: Intrinsic called with incompatible signature + call i32 @llvm.umax.i32(i32 0) + ret void +}