Verifier: Enforce value of llvm.is.fpclass test mask
authorMatt Arsenault <Matthew.Arsenault@amd.com>
Sat, 10 Dec 2022 02:18:29 +0000 (21:18 -0500)
committerMatt Arsenault <Matthew.Arsenault@amd.com>
Tue, 13 Dec 2022 02:53:28 +0000 (21:53 -0500)
As requested in D137811

llvm/lib/IR/Verifier.cpp
llvm/test/Transforms/InstCombine/is_fpclass.ll
llvm/test/Verifier/llvm.is.fpclass.ll [new file with mode: 0644]

index b487d24..093b30d 100644 (file)
@@ -5010,6 +5010,12 @@ void Verifier::visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call) {
           "an array");
     break;
   }
+  case Intrinsic::is_fpclass: {
+    const ConstantInt *TestMask = cast<ConstantInt>(Call.getOperand(1));
+    Check((TestMask->getZExtValue() & ~fcAllFlags) == 0,
+          "unsupported bits for llvm.is.fpclass test mask");
+    break;
+  }
   case Intrinsic::fptrunc_round: {
     // Check the rounding mode
     Metadata *MD = nullptr;
index 496a783..39653fb 100644 (file)
 ;   ret i1 %val
 ; }
 
-define i1 @test_class_over_max_mask_f32(float %x) {
-; CHECK-LABEL: @test_class_over_max_mask_f32(
-; CHECK-NEXT:    [[VAL:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X:%.*]], i32 1025)
-; CHECK-NEXT:    ret i1 [[VAL]]
-;
-  %val = call i1 @llvm.is.fpclass.f32(float %x, i32 1025)
-  ret i1 %val
-}
-
 define i1 @test_class_no_mask_f32(float %x) {
 ; CHECK-LABEL: @test_class_no_mask_f32(
 ; CHECK-NEXT:    [[VAL:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X:%.*]], i32 0)
diff --git a/llvm/test/Verifier/llvm.is.fpclass.ll b/llvm/test/Verifier/llvm.is.fpclass.ll
new file mode 100644 (file)
index 0000000..7426f82
--- /dev/null
@@ -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: unsupported bits for llvm.is.fpclass test mask
+define i1 @test_mask_neg1(double %val) {
+  %ret = call i1 @llvm.is.fpclass.f64(double %val, i32 -1)
+  ret i1 %ret
+}
+
+; CHECK: unsupported bits for llvm.is.fpclass test mask
+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)