diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -2521,7 +2521,7 @@ // direct call/invokes, never having its "address taken". // Only do this if the module is materialized, otherwise we don't have all the // uses. - if (F.getIntrinsicID() && F.getParent()->isMaterialized()) { + if (F.isIntrinsic() && F.getParent()->isMaterialized()) { const User *U; if (F.hasAddressTaken(&U)) Assert(false, "Invalid user of intrinsic instruction!", U); diff --git a/llvm/test/Verifier/intrinsic-addr-taken.ll b/llvm/test/Verifier/intrinsic-addr-taken.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Verifier/intrinsic-addr-taken.ll @@ -0,0 +1,9 @@ +; RUN: not llvm-as < %s 2>&1 | FileCheck %s + +declare i32 @llvm.umax.i32(i32, i32) +declare i32 @llvm.my.custom.intrinsic() + +; CHECK: Invalid user of intrinsic instruction! +@g1 = global i32(i32, i32)* @llvm.umax.i32 +; CHECK: Invalid user of intrinsic instruction! +@g2 = global i32()* @llvm.my.custom.intrinsic