Index: llvm/lib/IR/Verifier.cpp =================================================================== --- llvm/lib/IR/Verifier.cpp +++ llvm/lib/IR/Verifier.cpp @@ -5010,6 +5010,12 @@ "an array"); break; } + case Intrinsic::is_fpclass: { + const ConstantInt *TestMask = cast(Call.getOperand(1)); + Check((TestMask->getZExtValue() & ~fcAllFlags) == 0, + "llvm.is.fpclass test mask only has 10 bits"); + break; + } case Intrinsic::fptrunc_round: { // Check the rounding mode Metadata *MD = nullptr; Index: llvm/test/Verifier/llvm.is.fpclass.ll =================================================================== --- /dev/null +++ llvm/test/Verifier/llvm.is.fpclass.ll @@ -0,0 +1,23 @@ +; RUN: not llvm-as < %s 2>&1 | FileCheck %s + +; CHECK: immarg operand has non-immediate parameter +; CHECK-NEXT: i32 %variable +; CHECK-NEXT: %ret = call i1 @llvm.is.fpclass.f64(double %val, i32 %variable) +define i1 @test_mask_variable(double %val, i32 %variable) { + %ret = call i1 @llvm.is.fpclass.f64(double %val, i32 %variable) + ret i1 %ret +} + +; CHECK: llvm.is.fpclass test mask only has 10 bits +define i1 @test_mask_neg1(double %val) { + %ret = call i1 @llvm.is.fpclass.f64(double %val, i32 -1) + ret i1 %ret +} + +; CHECK: llvm.is.fpclass test mask only has 10 bits +define i1 @test_mask_bit11(double %val) { + %ret = call i1 @llvm.is.fpclass.f64(double %val, i32 2048) + ret i1 %ret +} + +declare i1 @llvm.is.fpclass.f64(double, i32 immarg)