[Mlir-commits] [llvm] [mlir] [LLVM] Precise error message for intrinsic signature verification (2/n) (PR #199217)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Fri May 22 07:27:59 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-ir

@llvm/pr-subscribers-mlir-llvm

Author: Rahul Joshi (jurahul)

<details>
<summary>Changes</summary>

Print precise error message for overloaded types and `LLVMMatchType` when an intrinsic's type signature verfication fails.

---
Full diff: https://github.com/llvm/llvm-project/pull/199217.diff


12 Files Affected:

- (modified) llvm/lib/IR/Intrinsics.cpp (+28-17) 
- (modified) llvm/test/Assembler/implicit-intrinsic-declaration-invalid.ll (+1-1) 
- (modified) llvm/test/Verifier/arbitrary-fp-convert.ll (+5-5) 
- (modified) llvm/test/Verifier/callbr.ll (+1-1) 
- (modified) llvm/test/Verifier/get-active-lane-mask.ll (+1-1) 
- (modified) llvm/test/Verifier/intrinsic-arg-overloading-struct-ret.ll (+9-9) 
- (modified) llvm/test/Verifier/matrix-intrinsics.ll (+2-2) 
- (modified) llvm/test/Verifier/reduction-intrinsics.ll (+2-2) 
- (modified) llvm/test/Verifier/sat-intrinsics.ll (+6-6) 
- (modified) llvm/test/Verifier/scatter_gather.ll (+3-3) 
- (modified) llvm/test/Verifier/stepvector-intrinsic.ll (+1-1) 
- (modified) mlir/test/Dialect/LLVMIR/call-intrin.mlir (+1-1) 


``````````diff
diff --git a/llvm/lib/IR/Intrinsics.cpp b/llvm/lib/IR/Intrinsics.cpp
index 008d823315156..380108bc98512 100644
--- a/llvm/lib/IR/Intrinsics.cpp
+++ b/llvm/lib/IR/Intrinsics.cpp
@@ -940,11 +940,15 @@ matchIntrinsicType(Type *Ty, ArrayRef<Intrinsic::IITDescriptor> &Infos,
 
   IITDescriptor D = Infos.consume_front();
 
-  auto PrintMsg = [&OS, &Position, Ty](bool IsValid,
-                                       const Twine &Expected) -> bool {
+  auto PrintMsg = [&OS, &Position,
+                   Ty](bool IsValid, const Twine &Expected,
+                       std::optional<unsigned> OIdx = std::nullopt) -> bool {
     if (IsValid)
       return false;
-    OS << Position << " type expected " << Expected << ", but got " << *Ty;
+    OS << Position << " type";
+    if (OIdx)
+      OS << " (overload type " << *OIdx << ")";
+    OS << " expected " << Expected << ", but got " << *Ty;
     return true;
   };
 
@@ -1025,17 +1029,22 @@ matchIntrinsicType(Type *Ty, ArrayRef<Intrinsic::IITDescriptor> &Infos,
     return false;
   }
 
-  case IITDescriptor::Overloaded:
-    // If this is the second occurrence of an argument,
-    // verify that the later instance matches the previous instance.
-    if (D.getOverloadIndex() < OverloadTys.size())
-      return Ty != OverloadTys[D.getOverloadIndex()];
-
-    if (D.getOverloadIndex() > OverloadTys.size() ||
-        D.getOverloadKind() == IITDescriptor::AK_MatchType)
-      return IsDeferredCheck || DeferCheck(Ty);
+  case IITDescriptor::Overloaded: {
+    unsigned OIdx = D.getOverloadIndex();
+    if (D.getOverloadKind() == IITDescriptor::AK_MatchType) {
+      // This is a dependent type instance, check it similar to other dependent
+      // types.
+      if (OIdx >= OverloadTys.size())
+        return IsDeferredCheck || DeferCheck(Ty);
+
+      if (Ty == OverloadTys[OIdx])
+        return false;
+      OS << Position << " type (MatchType<" << OIdx << ">) expected "
+         << *OverloadTys[OIdx] << ", but got " << *Ty;
+      return true;
+    }
 
-    assert(D.getOverloadIndex() == OverloadTys.size() && !IsDeferredCheck &&
+    assert(OIdx == OverloadTys.size() && !IsDeferredCheck &&
            "Table consistency error");
     OverloadTys.push_back(Ty);
 
@@ -1043,17 +1052,19 @@ matchIntrinsicType(Type *Ty, ArrayRef<Intrinsic::IITDescriptor> &Infos,
     case IITDescriptor::AK_Any:
       return false; // Success
     case IITDescriptor::AK_AnyInteger:
-      return !Ty->isIntOrIntVectorTy();
+      return PrintMsg(Ty->isIntOrIntVectorTy(), "any integer or integer vector",
+                      OIdx);
     case IITDescriptor::AK_AnyFloat:
-      return !Ty->isFPOrFPVectorTy();
+      return PrintMsg(Ty->isFPOrFPVectorTy(), "any fp or fp vector", OIdx);
     case IITDescriptor::AK_AnyVector:
-      return !isa<VectorType>(Ty);
+      return PrintMsg(isa<VectorType>(Ty), "any vector type", OIdx);
     case IITDescriptor::AK_AnyPointer:
-      return !isa<PointerType>(Ty);
+      return PrintMsg(isa<PointerType>(Ty), "any pointer type", OIdx);
     default:
       break;
     }
     llvm_unreachable("all argument kinds not covered");
+  }
 
   case IITDescriptor::Extend: {
     // If this is a forward reference, defer the check for later.
diff --git a/llvm/test/Assembler/implicit-intrinsic-declaration-invalid.ll b/llvm/test/Assembler/implicit-intrinsic-declaration-invalid.ll
index f67afe2110aae..3b16de6307040 100644
--- a/llvm/test/Assembler/implicit-intrinsic-declaration-invalid.ll
+++ b/llvm/test/Assembler/implicit-intrinsic-declaration-invalid.ll
@@ -3,7 +3,7 @@
 ; Use of intrinsic without mangling suffix and invalid signature should
 ; be rejected.
 
-; CHECK: error: intrinsic has incorrect argument type!
+; CHECK: error: intrinsic argument 1 type (MatchType<0>) expected i8, but got i16
 define void @test() {
   call i8 @llvm.umax(i8 0, i16 1)
   ret void
diff --git a/llvm/test/Verifier/arbitrary-fp-convert.ll b/llvm/test/Verifier/arbitrary-fp-convert.ll
index a4b0a0955ccd1..dd9c95040fd43 100644
--- a/llvm/test/Verifier/arbitrary-fp-convert.ll
+++ b/llvm/test/Verifier/arbitrary-fp-convert.ll
@@ -47,7 +47,7 @@ define i8 @bad_rounding(half %v) {
 }
 
 ;--- ptr-to-arbitrary-fp.ll
-; PTR-TO-FP: intrinsic has incorrect argument type!
+; PTR-TO-FP: intrinsic argument 0 type (overload type 1) expected any fp or fp vector, but got ptr
 
 declare i8 @llvm.convert.to.arbitrary.fp.i8.ptr(ptr, metadata, metadata, i1)
 
@@ -58,7 +58,7 @@ define i8 @bad_ptr_to_fp(ptr %p) {
 }
 
 ;--- arbitrary-fp-to-ptr.ll
-; FP-TO-PTR: intrinsic has incorrect return type!
+; FP-TO-PTR: intrinsic return type (overload type 0) expected any fp or fp vector, but got ptr
 
 declare ptr @llvm.convert.from.arbitrary.fp.ptr.i8(i8, metadata)
 
@@ -69,7 +69,7 @@ define ptr @bad_fp_to_ptr(i8 %v) {
 }
 
 ;--- int-to-arbitrary-fp.ll
-; INT-TO-FP: intrinsic has incorrect argument type!
+; INT-TO-FP: intrinsic argument 0 type (overload type 1) expected any fp or fp vector, but got i32
 
 declare i8 @llvm.convert.to.arbitrary.fp.i8.i32(i32, metadata, metadata, i1)
 
@@ -80,7 +80,7 @@ define i8 @bad_int_to_fp(i32 %v) {
 }
 
 ;--- arbitrary-fp-to-int.ll
-; FP-TO-INT: intrinsic has incorrect return type!
+; FP-TO-INT: intrinsic return type (overload type 0) expected any fp or fp vector, but got i32
 
 declare i32 @llvm.convert.from.arbitrary.fp.i32.i8(i8, metadata)
 
@@ -91,7 +91,7 @@ define i32 @bad_fp_to_int(i8 %v) {
 }
 
 ;--- vec-ptr-to-arbitrary-fp.ll
-; VEC-PTR-TO-FP: intrinsic has incorrect argument type!
+; VEC-PTR-TO-FP: intrinsic argument 0 type (overload type 1) expected any fp or fp vector, but got <4 x ptr>
 
 declare <4 x i8> @llvm.convert.to.arbitrary.fp.v4i8.v4ptr(<4 x ptr>, metadata, metadata, i1)
 
diff --git a/llvm/test/Verifier/callbr.ll b/llvm/test/Verifier/callbr.ll
index eb0b6f76c64be..996c88c204b58 100644
--- a/llvm/test/Verifier/callbr.ll
+++ b/llvm/test/Verifier/callbr.ll
@@ -73,7 +73,7 @@ abnormal:
 declare i32 @llvm.callbr.landingpad.i64(i64)
 define void @callbrpad_bad_type() {
 entry:
-; CHECK: intrinsic has incorrect argument type!
+; CHECK: intrinsic argument 0 type (MatchType<0>) expected i32, but got i64
 ; CHECK-NEXT: ptr @llvm.callbr.landingpad.i64
   %foo = call i32 @llvm.callbr.landingpad.i64(i64 42)
   ret void
diff --git a/llvm/test/Verifier/get-active-lane-mask.ll b/llvm/test/Verifier/get-active-lane-mask.ll
index 351b8ceef59f2..0d07c033f71ec 100644
--- a/llvm/test/Verifier/get-active-lane-mask.ll
+++ b/llvm/test/Verifier/get-active-lane-mask.ll
@@ -13,7 +13,7 @@ define <4 x i32> @t1(i32 %IV, i32 %TC) {
 declare i32 @llvm.get.active.lane.mask.i32.i32(i32, i32)
 
 define i32 @t2(i32 %IV, i32 %TC) {
-; CHECK:      intrinsic has incorrect return type!
+; CHECK:      intrinsic return type (overload type 0) expected any vector type, but got i32
 ; CHECK-NEXT: ptr @llvm.get.active.lane.mask.i32.i32
 
   %res = call i32 @llvm.get.active.lane.mask.i32.i32(i32 %IV, i32 %TC)
diff --git a/llvm/test/Verifier/intrinsic-arg-overloading-struct-ret.ll b/llvm/test/Verifier/intrinsic-arg-overloading-struct-ret.ll
index ce2e54fff7ba1..28083d8c2474e 100644
--- a/llvm/test/Verifier/intrinsic-arg-overloading-struct-ret.ll
+++ b/llvm/test/Verifier/intrinsic-arg-overloading-struct-ret.ll
@@ -2,7 +2,7 @@
 
 ; LD2 and LD2LANE
 
-; CHECK: intrinsic has incorrect return type
+; CHECK: intrinsic return struct element 0 type (MatchType<0>) expected <4 x i32>, but got <4 x i64>
 ; CHECK-NEXT: llvm.aarch64.neon.ld2.v4i32
 define { <4 x i64>, <4 x i32> } @test_ld2_ret(ptr %ptr) {
   %res = call { <4 x i64>, <4 x i32> } @llvm.aarch64.neon.ld2.v4i32(ptr %ptr)
@@ -10,7 +10,7 @@ define { <4 x i64>, <4 x i32> } @test_ld2_ret(ptr %ptr) {
 }
 declare { <4 x i64>, <4 x i32> } @llvm.aarch64.neon.ld2.v4i32(ptr %ptr)
 
-; CHECK: intrinsic has incorrect return type
+; CHECK: intrinsic return struct element 1 type (MatchType<0>) expected <4 x i64>, but got <4 x i32>
 ; CHECK-NEXT: llvm.aarch64.neon.ld2lane.v4i64
 define { <4 x i64>, <4 x i32> } @test_ld2lane_ret(ptr %ptr, <4 x i64> %a, <4 x i64> %b) {
   %res = call { <4 x i64>, <4 x i32> } @llvm.aarch64.neon.ld2lane.v4i64(<4 x i64> %a, <4 x i64> %b, i64 0, ptr %ptr)
@@ -18,7 +18,7 @@ define { <4 x i64>, <4 x i32> } @test_ld2lane_ret(ptr %ptr, <4 x i64> %a, <4 x i
 }
 declare { <4 x i64>, <4 x i32> } @llvm.aarch64.neon.ld2lane.v4i64(<4 x i64>, <4 x i64>, i64, ptr)
 
-; CHECK: intrinsic has incorrect argument type
+; CHECK: intrinsic argument 0 type (MatchType<0>) expected <4 x i32>, but got <4 x i64>
 ; CHECK-NEXT: llvm.aarch64.neon.ld2lane.v4i32
 define { <4 x i32>, <4 x i32> } @test_ld2lane_arg(ptr %ptr, <4 x i64> %a, <4 x i32> %b) {
   %res = call { <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld2lane.v4i32(<4 x i64> %a, <4 x i32> %b, i64 0, ptr %ptr)
@@ -28,7 +28,7 @@ declare { <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld2lane.v4i32(<4 x i64>, <4
 
 ; LD3 and LD3LANE
 
-; CHECK: intrinsic has incorrect return type
+; CHECK: intrinsic return struct element 1 type (MatchType<0>) expected <4 x i32>, but got <4 x i64>
 ; CHECK-NEXT: llvm.aarch64.neon.ld3.v4i32
 define { <4 x i32>, <4 x i64>, <4 x i32> } @test_ld3_ret(ptr %ptr) {
   %res = call { <4 x i32>, <4 x i64>, <4 x i32> } @llvm.aarch64.neon.ld3.v4i32(ptr %ptr)
@@ -36,7 +36,7 @@ define { <4 x i32>, <4 x i64>, <4 x i32> } @test_ld3_ret(ptr %ptr) {
 }
 declare { <4 x i32>, <4 x i64>, <4 x i32> } @llvm.aarch64.neon.ld3.v4i32(ptr %ptr)
 
-; CHECK: intrinsic has incorrect return type
+; CHECK: intrinsic return struct element 1 type (MatchType<0>) expected <4 x i64>, but got <4 x i32>
 ; CHECK-NEXT: llvm.aarch64.neon.ld3lane.v4i64
 define { <4 x i64>, <4 x i32>, <4 x i64> } @test_ld3lane_ret(ptr %ptr, <4 x i64> %a, <4 x i64> %b, <4 x i64> %c) {
   %res = call { <4 x i64>, <4 x i32>, <4 x i64> } @llvm.aarch64.neon.ld3lane.v4i64(<4 x i64> %a, <4 x i64> %b, <4 x i64> %c, i64 0, ptr %ptr)
@@ -44,7 +44,7 @@ define { <4 x i64>, <4 x i32>, <4 x i64> } @test_ld3lane_ret(ptr %ptr, <4 x i64>
 }
 declare { <4 x i64>, <4 x i32>, <4 x i64> } @llvm.aarch64.neon.ld3lane.v4i64(<4 x i64>, <4 x i64>, <4 x i64>, i64, ptr)
 
-; CHECK: intrinsic has incorrect argument type
+; CHECK: intrinsic argument 0 type (MatchType<0>) expected <4 x i32>, but got <4 x i64>
 ; CHECK-NEXT: llvm.aarch64.neon.ld3lane.v4i32
 define { <4 x i32>, <4 x i32>, <4 x i32> } @test_ld3lane_arg(ptr %ptr, <4 x i64> %a, <4 x i32> %b, <4 x i32> %c) {
   %res = call { <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld3lane.v4i32(<4 x i64> %a, <4 x i32> %b, <4 x i32> %c, i64 0, ptr %ptr)
@@ -54,7 +54,7 @@ declare { <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld3lane.v4i32(<4
 
 ; LD4 and LD4LANE
 
-; CHECK: intrinsic has incorrect return type
+; CHECK: intrinsic return struct element 2 type (MatchType<0>) expected <4 x i32>, but got <4 x i64>
 ; CHECK-NEXT: llvm.aarch64.neon.ld4.v4i32
 define { <4 x i32>, <4 x i32>, <4 x i64>, <4 x i32> } @test_ld4_ret(ptr %ptr) {
   %res = call { <4 x i32>, <4 x i32>, <4 x i64>, <4 x i32> } @llvm.aarch64.neon.ld4.v4i32(ptr %ptr)
@@ -62,7 +62,7 @@ define { <4 x i32>, <4 x i32>, <4 x i64>, <4 x i32> } @test_ld4_ret(ptr %ptr) {
 }
 declare { <4 x i32>, <4 x i32>, <4 x i64>, <4 x i32> } @llvm.aarch64.neon.ld4.v4i32(ptr %ptr)
 
-; CHECK: intrinsic has incorrect return type
+; CHECK: intrinsic return struct element 2 type (MatchType<0>) expected <4 x i64>, but got <4 x i32>
 ; CHECK-NEXT: llvm.aarch64.neon.ld4lane.v4i64
 define { <4 x i64>, <4 x i64>, <4 x i32>, <4 x i64> } @test_ld4lane_ret(ptr %ptr, <4 x i64> %a, <4 x i64> %b, <4 x i64> %c, <4 x i64> %d) {
   %res = call { <4 x i64>, <4 x i64>, <4 x i32>, <4 x i64> } @llvm.aarch64.neon.ld4lane.v4i64(<4 x i64> %a, <4 x i64> %b, <4 x i64> %c, <4 x i64> %d, i64 0, ptr %ptr)
@@ -70,7 +70,7 @@ define { <4 x i64>, <4 x i64>, <4 x i32>, <4 x i64> } @test_ld4lane_ret(ptr %ptr
 }
 declare { <4 x i64>, <4 x i64>, <4 x i32>, <4 x i64> } @llvm.aarch64.neon.ld4lane.v4i64(<4 x i64>, <4 x i64>, <4 x i64>, <4 x i64>, i64, ptr)
 
-; CHECK: intrinsic has incorrect argument type
+; CHECK: intrinsic argument 0 type (MatchType<0>) expected <4 x i32>, but got <4 x i64>
 ; CHECK-NEXT: llvm.aarch64.neon.ld4lane.v4i32
 define { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @test_ld4lane_arg(ptr %ptr, <4 x i64> %a, <4 x i32> %b, <4 x i32> %c, <4 x i32> %d) {
   %res = call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld4lane.v4i32(<4 x i64> %a, <4 x i32> %b, <4 x i32> %c, <4 x i32> %d, i64 0, ptr %ptr)
diff --git a/llvm/test/Verifier/matrix-intrinsics.ll b/llvm/test/Verifier/matrix-intrinsics.ll
index 4cabaa1bfe630..94db33fe2233e 100644
--- a/llvm/test/Verifier/matrix-intrinsics.ll
+++ b/llvm/test/Verifier/matrix-intrinsics.ll
@@ -62,9 +62,9 @@ define void @column.major_store(ptr %m, ptr %n, i64 %arg) {
 
 define <4 x float> @transpose_mixed_types(<4 x float> %fvec, <4 x i32> %ivec, i32 %arg) {
 ;
-; CHECK-NEXT: intrinsic has incorrect argument type!
+; CHECK-NEXT: intrinsic argument 0 type (MatchType<0>) expected <4 x float>, but got <4 x i32>
 ; CHECK-NEXT: ptr @llvm.matrix.transpose.v4f32.v4i32
-; CHECK-NEXT: intrinsic has incorrect argument type!
+; CHECK-NEXT: intrinsic argument 0 type (MatchType<0>) expected <4 x i32>, but got <4 x float>
 ; CHECK-NEXT: ptr @llvm.matrix.transpose.v4i32.v4f32
 ;
   %result.0 = call <4 x float> @llvm.matrix.transpose.v4f32.v4i32(<4 x i32> %ivec, i32 0, i32 0)
diff --git a/llvm/test/Verifier/reduction-intrinsics.ll b/llvm/test/Verifier/reduction-intrinsics.ll
index c225776c37135..121d0fee4c65d 100644
--- a/llvm/test/Verifier/reduction-intrinsics.ll
+++ b/llvm/test/Verifier/reduction-intrinsics.ll
@@ -3,13 +3,13 @@
 ; Reject a vector reduction with a non-vector argument.
 
 define float @reduce_vector_not_vec_arg(float %x) {
-; CHECK: intrinsic has incorrect argument type!
+; CHECK: intrinsic argument 0 type (overload type 0) expected any vector type, but got float
   %r0 = call float @llvm.vector.reduce.fmax.f32(float %x)
   ret float %r0
 }
 
 define i32 @reduce_vector_not_vec_arg2(i32 %x) {
-; CHECK: intrinsic has incorrect argument type!
+; CHECK: intrinsic argument 0 type (overload type 0) expected any vector type, but got i32
   %r0 = call i32 @llvm.vector.reduce.smax.i32(i32 %x)
   ret i32 %r0
 }
diff --git a/llvm/test/Verifier/sat-intrinsics.ll b/llvm/test/Verifier/sat-intrinsics.ll
index bd5ff6c03a769..134cee7670e71 100644
--- a/llvm/test/Verifier/sat-intrinsics.ll
+++ b/llvm/test/Verifier/sat-intrinsics.ll
@@ -1,37 +1,37 @@
 ; RUN: not opt -S -passes=verify < %s 2>&1 | FileCheck %s
 
 define i32 @sadd_arg_int(float %x, i32 %y) {
-; CHECK: intrinsic has incorrect argument type!
+; CHECK: intrinsic argument 0 type (MatchType<0>) expected i32, but got float
   %r = call i32 @llvm.sadd.sat.i32(float %x, i32 %y)
   ret i32 %r
 }
 
 define i37 @uadd_arg_int(half %x, i37 %y) {
-; CHECK: intrinsic has incorrect argument type!
+; CHECK: intrinsic argument 1 type (MatchType<0>) expected i37, but got half
   %r = call i37 @llvm.uadd.sat.i37(i37 %y, half %x)
   ret i37 %r
 }
 
 define <4 x i32> @ssub_arg_int(<5 x i32> %x, <4 x i32> %y) {
-; CHECK: intrinsic has incorrect argument type!
+; CHECK: intrinsic argument 0 type (MatchType<0>) expected <4 x i32>, but got <5 x i32>
   %r = call <4 x i32> @llvm.ssub.sat.v4i32(<5 x i32> %x, <4 x i32> %y)
   ret <4 x i32> %r
 }
 
 define <3 x i37> @usub_arg_int(<3 x i37> %x, <3 x i32> %y) {
-; CHECK: intrinsic has incorrect argument type!
+; CHECK: intrinsic argument 1 type (MatchType<0>) expected <3 x i37>, but got <3 x i32>
   %r = call <3 x i37> @llvm.usub.sat.v3i37(<3 x i37> %x, <3 x i32> %y)
   ret <3 x i37> %r
 }
 
 define float @ushl_return_int(i32 %x, i32 %y) {
-; CHECK: intrinsic has incorrect return type!
+; CHECK: intrinsic return type (overload type 0) expected any integer or integer vector, but got float
   %r = call float @llvm.ushl.sat.i32(i32 %x, i32 %y)
   ret float %r
 }
 
 define <4 x float> @sshl_return_int_vec(<4 x i32> %x, <4 x i32> %y) {
-; CHECK: intrinsic has incorrect return type!
+; CHECK: intrinsic return type (overload type 0) expected any integer or integer vector, but got <4 x float>
   %r = call <4 x float> @llvm.sshl.sat.v4i32(<4 x i32> %x, <4 x i32> %y)
   ret <4 x float> %r
 }
diff --git a/llvm/test/Verifier/scatter_gather.ll b/llvm/test/Verifier/scatter_gather.ll
index 47ca27b7fa89c..8e4ac81b1b27b 100644
--- a/llvm/test/Verifier/scatter_gather.ll
+++ b/llvm/test/Verifier/scatter_gather.ll
@@ -17,7 +17,7 @@ define <8 x float> @gather3(<8 x ptr> %ptrs, <16 x i1> %mask, <8 x float> %passt
 declare <8 x float> @llvm.masked.gather.v8f32.v8p0(<8 x ptr>, <16 x i1>, <8 x float>)
 
 ; Return type is not a vector
-; CHECK: intrinsic has incorrect return type!
+; CHECK: intrinsic return type (overload type 0) expected any vector type, but got ptr
 define ptr @gather4(<8 x ptr> %ptrs, <8 x i1> %mask, <8 x float> %passthru) {
   %res = call ptr @llvm.masked.gather.p0.v8p0(<8 x ptr> %ptrs, <8 x i1> %mask, <8 x float> %passthru)
   ret ptr %res
@@ -50,7 +50,7 @@ define <8 x float> @gather8(<16 x ptr> %ptrs, <8 x i1> %mask, <8 x float> %passt
 declare <8 x float> @llvm.masked.gather.v8f32.v16p0(<16 x ptr>, <8 x i1>, <8 x float>)
 
 ; Passthru type doesn't match return type
-; CHECK: intrinsic has incorrect argument type!
+; CHECK: intrinsic argument 2 type (MatchType<0>) expected <16 x i32>, but got <8 x i32>
 ; CHECK-NEXT: ptr @llvm.masked.gather.v16i32.v16p0
 define <16 x i32> @gather9(<16 x ptr> %ptrs, <16 x i1> %mask, <8 x i32> %passthru) {
   %res = call <16 x i32> @llvm.masked.gather.v16i32.v16p0(<16 x ptr> %ptrs, <16 x i1> %mask, <8 x i32> %passthru)
@@ -77,7 +77,7 @@ define void @scatter3(<8 x float> %value, <8 x ptr> %ptrs, <16 x i1> %mask) {
 declare void @llvm.masked.scatter.v8f32.v8p0(<8 x float>, <8 x ptr>, <16 x i1>)
 
 ; Value type is not a vector
-; CHECK: intrinsic has incorrect argument type!
+; CHECK: intrinsic argument 0 type (overload type 0) expected any vector type, but got ptr
 ; CHECK-NEXT: ptr @llvm.masked.scatter.p0.v8p0
 define void @scatter4(ptr %value, <8 x ptr> %ptrs, <8 x i1> %mask) {
   call void @llvm.masked.scatter.p0.v8p0(ptr %value, <8 x ptr> %ptrs, <8 x i1> %mask)
diff --git a/llvm/test/Verifier/stepvector-intrinsic.ll b/llvm/test/Verifier/stepvector-intrinsic.ll
index e164873f40dcb..09d545f55a42a 100644
--- a/llvm/test/Verifier/stepvector-intrinsic.ll
+++ b/llvm/test/Verifier/stepvector-intrinsic.ll
@@ -3,7 +3,7 @@
 ; Reject stepvector intrinsics that return a scalar
 
 define i32 @stepvector_i32() {
-; CHECK: intrinsic has incorrect return type!
+; CHECK: intrinsic return type (overload type 0) expected any vector type, but got i32
   %1 = call i32 @llvm.stepvector.i32()
   ret i32 %1
 }
diff --git a/mlir/test/Dialect/LLVMIR/call-intrin.mlir b/mlir/test/Dialect/LLVMIR/call-intrin.mlir
index 81590d8c5f69d..74ae8bf6d3077 100644
--- a/mlir/test/Dialect/LLVMIR/call-intrin.mlir
+++ b/mlir/test/Dialect/LLVMIR/call-intrin.mlir
@@ -61,7 +61,7 @@ llvm.func @no_intrinsic() {
 
 llvm.func @bad_types() {
   %0 = llvm.mlir.constant(1 : i8) : i8
-  // expected-error at below {{call intrinsic signature i8 (i8) to overloaded intrinsic "llvm.round" does not match any of the overloads: intrinsic has incorrect return type}}
+  // expected-error at below {{call intrinsic signature i8 (i8) to overloaded intrinsic "llvm.round" does not match any of the overloads: intrinsic return type (overload type 0) expected any fp or fp vector, but got i8}}
   // expected-error at below {{LLVM Translation failed for operation: llvm.call_intrinsic}}
   llvm.call_intrinsic "llvm.round"(%0) {} : (i8) -> i8
   llvm.return

``````````

</details>


https://github.com/llvm/llvm-project/pull/199217


More information about the Mlir-commits mailing list