[llvm] e20a092 - Verifier: Enforce value of llvm.is.fpclass test mask
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Mon Dec 12 19:16:12 PST 2022
Author: Matt Arsenault
Date: 2022-12-12T21:53:28-05:00
New Revision: e20a092838f31c365b0e8a8d74b0b33d01e8117b
URL: https://github.com/llvm/llvm-project/commit/e20a092838f31c365b0e8a8d74b0b33d01e8117b
DIFF: https://github.com/llvm/llvm-project/commit/e20a092838f31c365b0e8a8d74b0b33d01e8117b.diff
LOG: Verifier: Enforce value of llvm.is.fpclass test mask
As requested in D137811
Added:
llvm/test/Verifier/llvm.is.fpclass.ll
Modified:
llvm/lib/IR/Verifier.cpp
llvm/test/Transforms/InstCombine/is_fpclass.ll
Removed:
################################################################################
diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp
index b487d24ab8daa..093b30d3b55ef 100644
--- a/llvm/lib/IR/Verifier.cpp
+++ b/llvm/lib/IR/Verifier.cpp
@@ -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;
diff --git a/llvm/test/Transforms/InstCombine/is_fpclass.ll b/llvm/test/Transforms/InstCombine/is_fpclass.ll
index 496a783d302b5..39653fb872725 100644
--- a/llvm/test/Transforms/InstCombine/is_fpclass.ll
+++ b/llvm/test/Transforms/InstCombine/is_fpclass.ll
@@ -11,15 +11,6 @@
; 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
index 0000000000000..7426f822fa8da
--- /dev/null
+++ b/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: 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)
More information about the llvm-commits
mailing list