[PATCH] D139761: Verifier: Enforce value of llvm.is.fpclass test mask

Matt Arsenault via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Dec 9 18:20:39 PST 2022


arsenm created this revision.
arsenm added reviewers: jyknight, jcranmer-intel, sepavloff.
Herald added a subscriber: hiraditya.
Herald added a project: All.
arsenm requested review of this revision.
Herald added a subscriber: wdng.
Herald added a project: LLVM.

As requested in D137811 <https://reviews.llvm.org/D137811>


https://reviews.llvm.org/D139761

Files:
  llvm/lib/IR/Verifier.cpp
  llvm/test/Verifier/llvm.is.fpclass.ll


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)
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<ConstantInt>(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;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D139761.481810.patch
Type: text/x-patch
Size: 1507 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20221210/b8d77139/attachment.bin>


More information about the llvm-commits mailing list