[Mlir-commits] [mlir] [mlir][tosa] Allow integer gather/scatter ops in fp profile (PR #183342)

Luke Hutton llvmlistbot at llvm.org
Tue Mar 10 09:54:32 PDT 2026


https://github.com/lhutton1 updated https://github.com/llvm/llvm-project/pull/183342

>From 468e1ceb95fe38f8388753adae52cbd8ee1b2a22 Mon Sep 17 00:00:00 2001
From: Luke Hutton <luke.hutton at arm.com>
Date: Wed, 25 Feb 2026 16:55:38 +0000
Subject: [PATCH 1/3] [mlir][tosa] Allow integer gather/scatter ops in fp
 profile

This commit updates profile compliance to allow integer gather
and scatter operations to be used with the floating point profile.
This update aligns with the specification change:
https://github.com/arm/tosa-specification/pull/35

Change-Id: Idfee21f4e940000b633eb6a19d14dc2ad95c075f
---
 .../Dialect/Tosa/IR/TosaComplianceData.h.inc  | 22 +++--
 .../tosa-validation-version-1p1-valid.mlir    | 96 +++++++++++++++++++
 2 files changed, 112 insertions(+), 6 deletions(-)

diff --git a/mlir/include/mlir/Dialect/Tosa/IR/TosaComplianceData.h.inc b/mlir/include/mlir/Dialect/Tosa/IR/TosaComplianceData.h.inc
index 3bdb3805dc6a2..7ea0d134941c7 100644
--- a/mlir/include/mlir/Dialect/Tosa/IR/TosaComplianceData.h.inc
+++ b/mlir/include/mlir/Dialect/Tosa/IR/TosaComplianceData.h.inc
@@ -370,10 +370,16 @@ profileComplianceMap = {
         {{i16T, i32T, i16T}, SpecificationVersion::V_1_0},
         {{i32T, i32T, i32T}, SpecificationVersion::V_1_0}}},
       {{Profile::pro_fp},
-       {{{fp16T, i32T, fp16T}, SpecificationVersion::V_1_0},
+       {{{i8T, i32T, i8T}, SpecificationVersion::V_1_1_DRAFT},
+        {{i16T, i32T, i16T}, SpecificationVersion::V_1_1_DRAFT},
+        {{i32T, i32T, i32T}, SpecificationVersion::V_1_1_DRAFT},
+        {{fp16T, i32T, fp16T}, SpecificationVersion::V_1_0},
         {{fp32T, i32T, fp32T}, SpecificationVersion::V_1_0}}},
       {{Profile::pro_fp, Profile::pro_int},
-       {{{boolT, i32T, boolT}, SpecificationVersion::V_1_1_DRAFT}},
+       {{{boolT, i32T, boolT}, SpecificationVersion::V_1_1_DRAFT},
+        {{i8T, i64T, i8T}, SpecificationVersion::V_1_1_DRAFT},
+        {{i16T, i64T, i16T}, SpecificationVersion::V_1_1_DRAFT},
+        {{i32T, i64T, i32T}, SpecificationVersion::V_1_1_DRAFT}},
        anyOf}}},
     {"tosa.scatter",
      {{{Profile::pro_int},
@@ -381,12 +387,16 @@ profileComplianceMap = {
         {{i16T, i32T, i16T, i16T}, SpecificationVersion::V_1_0},
         {{i32T, i32T, i32T, i32T}, SpecificationVersion::V_1_0}}},
       {{Profile::pro_fp},
-       {{{fp16T, i32T, fp16T, fp16T}, SpecificationVersion::V_1_0},
+       {{{i8T, i32T, i8T, i8T}, SpecificationVersion::V_1_1_DRAFT},
+        {{i16T, i32T, i16T, i16T}, SpecificationVersion::V_1_1_DRAFT},
+        {{i32T, i32T, i32T, i32T}, SpecificationVersion::V_1_1_DRAFT},
+        {{fp16T, i32T, fp16T, fp16T}, SpecificationVersion::V_1_0},
         {{fp32T, i32T, fp32T, fp32T}, SpecificationVersion::V_1_0}}},
       {{Profile::pro_fp, Profile::pro_int},
-       {
-           {{boolT, i32T, boolT, boolT}, SpecificationVersion::V_1_1_DRAFT},
-       },
+       {{{boolT, i32T, boolT, boolT}, SpecificationVersion::V_1_1_DRAFT},
+        {{i8T, i64T, i8T, i8T}, SpecificationVersion::V_1_1_DRAFT},
+        {{i16T, i64T, i16T, i16T}, SpecificationVersion::V_1_1_DRAFT},
+        {{i32T, i64T, i32T, i32T}, SpecificationVersion::V_1_1_DRAFT}},
        anyOf}}},
     {"tosa.resize",
      {{{Profile::pro_int},
diff --git a/mlir/test/Dialect/Tosa/tosa-validation-version-1p1-valid.mlir b/mlir/test/Dialect/Tosa/tosa-validation-version-1p1-valid.mlir
index fa03abcccacd8..4a6ab456744db 100644
--- a/mlir/test/Dialect/Tosa/tosa-validation-version-1p1-valid.mlir
+++ b/mlir/test/Dialect/Tosa/tosa-validation-version-1p1-valid.mlir
@@ -215,6 +215,102 @@ func.func @test_scatter_bool_i32(%arg0: tensor<13x52x3xi1>, %arg1: tensor<13x26x
 
 // -----
 
+// CHECK-LABEL: test_gather_i8_i32_indices
+func.func @test_gather_i8_i32_indices(%arg0: tensor<13x21x3xi8>, %arg1: tensor<13x26xi32>) -> tensor<13x26x3xi8> {
+  %0 = tosa.gather %arg0, %arg1 : (tensor<13x21x3xi8>, tensor<13x26xi32>) -> tensor<13x26x3xi8>
+  return %0 : tensor<13x26x3xi8>
+}
+
+// -----
+
+// CHECK-LABEL: test_scatter_i8_i32_indices
+func.func @test_scatter_i8_i32_indices(%arg0: tensor<13x27x3xi8>, %arg1: tensor<13x26xi32>, %arg2: tensor<13x26x3xi8>) -> tensor<13x27x3xi8> {
+  %0 = tosa.scatter %arg0, %arg1, %arg2 : (tensor<13x27x3xi8>, tensor<13x26xi32>, tensor<13x26x3xi8>) -> tensor<13x27x3xi8>
+  return %0 : tensor<13x27x3xi8>
+}
+
+// -----
+
+// CHECK-LABEL: test_gather_i16_i32_indices
+func.func @test_gather_i16_i32_indices(%arg0: tensor<13x21x3xi16>, %arg1: tensor<13x26xi32>) -> tensor<13x26x3xi16> {
+  %0 = tosa.gather %arg0, %arg1 : (tensor<13x21x3xi16>, tensor<13x26xi32>) -> tensor<13x26x3xi16>
+  return %0 : tensor<13x26x3xi16>
+}
+
+// -----
+
+// CHECK-LABEL: test_scatter_i16_i32_indices
+func.func @test_scatter_i16_i32_indices(%arg0: tensor<13x27x3xi16>, %arg1: tensor<13x26xi32>, %arg2: tensor<13x26x3xi16>) -> tensor<13x27x3xi16> {
+  %0 = tosa.scatter %arg0, %arg1, %arg2 : (tensor<13x27x3xi16>, tensor<13x26xi32>, tensor<13x26x3xi16>) -> tensor<13x27x3xi16>
+  return %0 : tensor<13x27x3xi16>
+}
+
+// -----
+
+// CHECK-LABEL: test_gather_i32_i32_indices
+func.func @test_gather_i32_i32_indices(%arg0: tensor<13x21x3xi32>, %arg1: tensor<13x26xi32>) -> tensor<13x26x3xi32> {
+  %0 = tosa.gather %arg0, %arg1 : (tensor<13x21x3xi32>, tensor<13x26xi32>) -> tensor<13x26x3xi32>
+  return %0 : tensor<13x26x3xi32>
+}
+
+// -----
+
+// CHECK-LABEL: test_scatter_i32_i32_indices
+func.func @test_scatter_i32_i32_indices(%arg0: tensor<13x27x3xi32>, %arg1: tensor<13x26xi32>, %arg2: tensor<13x26x3xi32>) -> tensor<13x27x3xi32> {
+  %0 = tosa.scatter %arg0, %arg1, %arg2 : (tensor<13x27x3xi32>, tensor<13x26xi32>, tensor<13x26x3xi32>) -> tensor<13x27x3xi32>
+  return %0 : tensor<13x27x3xi32>
+}
+
+// -----
+
+// CHECK-LABEL: test_gather_i8_i64_indices
+func.func @test_gather_i8_i64_indices(%arg0: tensor<13x21x3xi8>, %arg1: tensor<13x26xi64>) -> tensor<13x26x3xi8> {
+  %0 = tosa.gather %arg0, %arg1 : (tensor<13x21x3xi8>, tensor<13x26xi64>) -> tensor<13x26x3xi8>
+  return %0 : tensor<13x26x3xi8>
+}
+
+// -----
+
+// CHECK-LABEL: test_scatter_i8_i64_indices
+func.func @test_scatter_i8_i64_indices(%arg0: tensor<13x27x3xi8>, %arg1: tensor<13x26xi64>, %arg2: tensor<13x26x3xi8>) -> tensor<13x27x3xi8> {
+  %0 = tosa.scatter %arg0, %arg1, %arg2 : (tensor<13x27x3xi8>, tensor<13x26xi64>, tensor<13x26x3xi8>) -> tensor<13x27x3xi8>
+  return %0 : tensor<13x27x3xi8>
+}
+
+// -----
+
+// CHECK-LABEL: test_gather_i16_i64_indices
+func.func @test_gather_i16_i64_indices(%arg0: tensor<13x21x3xi16>, %arg1: tensor<13x26xi64>) -> tensor<13x26x3xi16> {
+  %0 = tosa.gather %arg0, %arg1 : (tensor<13x21x3xi16>, tensor<13x26xi64>) -> tensor<13x26x3xi16>
+  return %0 : tensor<13x26x3xi16>
+}
+
+// -----
+
+// CHECK-LABEL: test_scatter_i16_i64_indices
+func.func @test_scatter_i16_i64_indices(%arg0: tensor<13x27x3xi16>, %arg1: tensor<13x26xi64>, %arg2: tensor<13x26x3xi16>) -> tensor<13x27x3xi16> {
+  %0 = tosa.scatter %arg0, %arg1, %arg2 : (tensor<13x27x3xi16>, tensor<13x26xi64>, tensor<13x26x3xi16>) -> tensor<13x27x3xi16>
+  return %0 : tensor<13x27x3xi16>
+}
+
+// -----
+
+// CHECK-LABEL: test_gather_i32_i64_indices
+func.func @test_gather_i32_i64_indices(%arg0: tensor<13x21x3xi32>, %arg1: tensor<13x26xi64>) -> tensor<13x26x3xi32> {
+  %0 = tosa.gather %arg0, %arg1 : (tensor<13x21x3xi32>, tensor<13x26xi64>) -> tensor<13x26x3xi32>
+  return %0 : tensor<13x26x3xi32>
+}
+
+// -----
+
+// CHECK-LABEL: test_scatter_i32_i64_indices
+func.func @test_scatter_i32_i64_indices(%arg0: tensor<13x27x3xi32>, %arg1: tensor<13x26xi64>, %arg2: tensor<13x26x3xi32>) -> tensor<13x27x3xi32> {
+  %0 = tosa.scatter %arg0, %arg1, %arg2 : (tensor<13x27x3xi32>, tensor<13x26xi64>, tensor<13x26x3xi32>) -> tensor<13x27x3xi32>
+  return %0 : tensor<13x27x3xi32>
+}
+
+// -----
+
 // CHECK-LABEL: test_cast_bool_fp32
 func.func @test_cast_bool_fp32(%arg0: tensor<13x21x3xi1>) -> tensor<13x21x3xf32> {
   %0 = tosa.cast %arg0 : (tensor<13x21x3xi1>) -> tensor<13x21x3xf32>

>From 553696e40e1090d02331f384308475b23bb88cad Mon Sep 17 00:00:00 2001
From: Luke Hutton <luke.hutton at arm.com>
Date: Mon, 9 Mar 2026 17:44:41 +0000
Subject: [PATCH 2/3] [mlir][tosa] Check extension cooperative profiles in
 target environment

This commit moves checks on extension cooperative profiles out of profile
conformance and into target environment verification. This allows the
checks to be enforced when the target is created, not during profile
conformance validation.

Change-Id: I1ceac9378d71df43936ab3d3d90ba62af4440f38
---
 .../Dialect/Tosa/IR/TosaProfileCompliance.h   | 26 ----------
 mlir/lib/Dialect/Tosa/IR/TargetEnv.cpp        | 48 ++++++++++++++++++-
 .../Tosa/Transforms/TosaAttachTarget.cpp      |  4 ++
 .../Tosa/Transforms/TosaProfileCompliance.cpp | 15 ------
 mlir/test/Dialect/Tosa/invalid_extension.mlir |  7 +++
 mlir/test/Dialect/Tosa/level_check.mlir       |  2 +-
 .../Dialect/Tosa/profile_all_unsupported.mlir |  8 ++--
 .../Tosa/profile_pro_fp_unsupported.mlir      |  8 ++--
 .../Tosa/profile_pro_int_unsupported.mlir     | 15 ++----
 ...attach-target-non-cooperative-profile.mlir |  9 ++++
 10 files changed, 80 insertions(+), 62 deletions(-)
 create mode 100644 mlir/test/Dialect/Tosa/tosa-attach-target-non-cooperative-profile.mlir

diff --git a/mlir/include/mlir/Dialect/Tosa/IR/TosaProfileCompliance.h b/mlir/include/mlir/Dialect/Tosa/IR/TosaProfileCompliance.h
index d9de79e415292..53372f56f2bf0 100644
--- a/mlir/include/mlir/Dialect/Tosa/IR/TosaProfileCompliance.h
+++ b/mlir/include/mlir/Dialect/Tosa/IR/TosaProfileCompliance.h
@@ -137,32 +137,6 @@ class TosaProfileCompliance {
   OpComplianceInfo<T>
   findMatchedEntry(Operation *op, SmallVector<OpComplianceInfo<T>> compInfo);
 
-  SmallVector<Profile> getCooperativeProfiles(Extension ext) {
-    switch (ext) {
-    case Extension::int16:
-    case Extension::int4:
-    case Extension::doubleround:
-    case Extension::inexactround:
-      return {Profile::pro_int};
-    case Extension::bf16:
-    case Extension::fp8e4m3:
-    case Extension::fp8e5m2:
-    case Extension::fft:
-    case Extension::mxfp:
-    case Extension::mxfp_conv:
-      return {Profile::pro_fp};
-    case Extension::variable:
-    case Extension::controlflow:
-    case Extension::dynamic:
-    case Extension::int64:
-    case Extension::shape:
-      return {Profile::pro_fp, Profile::pro_int};
-    case Extension::none:
-      return {};
-    };
-    llvm_unreachable("bad Extension type");
-  }
-
   // Debug utilites.
   template <typename T>
   SmallVector<StringRef> stringifyProfile(ArrayRef<T> profiles);
diff --git a/mlir/lib/Dialect/Tosa/IR/TargetEnv.cpp b/mlir/lib/Dialect/Tosa/IR/TargetEnv.cpp
index 9f616b223bf92..118d8c6443bee 100644
--- a/mlir/lib/Dialect/Tosa/IR/TargetEnv.cpp
+++ b/mlir/lib/Dialect/Tosa/IR/TargetEnv.cpp
@@ -52,6 +52,32 @@ TosaSpecificationVersion getMinVersion(const Extension &extension) {
   llvm_unreachable("Unknown TOSA extension");
 }
 
+SmallVector<Profile, 2> getCooperativeProfiles(Extension ext) {
+  switch (ext) {
+  case Extension::int16:
+  case Extension::int4:
+  case Extension::doubleround:
+  case Extension::inexactround:
+    return {Profile::pro_int};
+  case Extension::bf16:
+  case Extension::fp8e4m3:
+  case Extension::fp8e5m2:
+  case Extension::fft:
+  case Extension::mxfp:
+  case Extension::mxfp_conv:
+    return {Profile::pro_fp};
+  case Extension::variable:
+  case Extension::controlflow:
+  case Extension::dynamic:
+  case Extension::int64:
+  case Extension::shape:
+    return {Profile::pro_fp, Profile::pro_int};
+  case Extension::none:
+    return {};
+  };
+  llvm_unreachable("bad Extension type");
+}
+
 TosaSpecificationVersion getMinVersion(const Level &level) {
   switch (level) {
   case Level::eightK:
@@ -90,14 +116,34 @@ LogicalResult TargetEnv::verifyTargetInformation(TargetEnvAttr targetAttr,
     return success();
   };
 
+  const auto isExtensionCooperativeWithProfile =
+      [&](Extension ext) -> LogicalResult {
+    const auto cooperativeProfiles = getCooperativeProfiles(ext);
+
+    const ArrayRef<Profile> targetProfiles = targetAttr.getProfiles();
+    if (!llvm::any_of(cooperativeProfiles,
+                      [&targetProfiles](const auto &profile) {
+                        return llvm::is_contained(targetProfiles, profile);
+                      }))
+      return emitError(targetAttrLoc)
+             << "use of extension '" << stringifyEnum(ext)
+             << "' requires any of profiles: [" << cooperativeProfiles
+             << "] to be enabled in the target";
+
+    return success();
+  };
+
   for (const auto &profile : targetAttr.getProfiles())
     if (failed(
             isCompatibleWithTargetVersion(profile, targetAttrLoc, "profile")))
       return failure();
-  for (const auto &extension : targetAttr.getExtensions())
+  for (const auto &extension : targetAttr.getExtensions()) {
     if (failed(isCompatibleWithTargetVersion(extension, targetAttrLoc,
                                              "extension")))
       return failure();
+    if (failed(isExtensionCooperativeWithProfile(extension)))
+      return failure();
+  }
   if (failed(isCompatibleWithTargetVersion(targetAttr.getLevel(), targetAttrLoc,
                                            "level")))
     return failure();
diff --git a/mlir/lib/Dialect/Tosa/Transforms/TosaAttachTarget.cpp b/mlir/lib/Dialect/Tosa/Transforms/TosaAttachTarget.cpp
index a0661e4ee0bd2..410d55d63e5fd 100644
--- a/mlir/lib/Dialect/Tosa/Transforms/TosaAttachTarget.cpp
+++ b/mlir/lib/Dialect/Tosa/Transforms/TosaAttachTarget.cpp
@@ -63,6 +63,10 @@ class TosaAttachTarget
     MLIRContext *ctx = &getContext();
     const auto targetEnvAttr = TargetEnvAttr::get(
         ctx, specificationVersion, level, selectedProfiles, selectedExtensions);
+
+    if (failed(TargetEnv::verifyTargetInformation(targetEnvAttr, mod.getLoc())))
+      return signalPassFailure();
+
     mod->setAttr(TargetEnvAttr::name, targetEnvAttr);
   }
 
diff --git a/mlir/lib/Dialect/Tosa/Transforms/TosaProfileCompliance.cpp b/mlir/lib/Dialect/Tosa/Transforms/TosaProfileCompliance.cpp
index 5037d0176d68d..1b824a4d32586 100644
--- a/mlir/lib/Dialect/Tosa/Transforms/TosaProfileCompliance.cpp
+++ b/mlir/lib/Dialect/Tosa/Transforms/TosaProfileCompliance.cpp
@@ -435,21 +435,6 @@ LogicalResult TosaProfileCompliance::checkProfileOrExtension(
     return failure();
   }
 
-  // Each extension can contain a list of profiles that it works with, usually
-  // have the same data type.
-  if constexpr (std::is_same_v<T, Extension>) {
-    for (const auto &mode : opRequiredMode) {
-      SmallVector<Profile> coProfs = getCooperativeProfiles(mode);
-      if (!targetEnv.allowsAnyOf(coProfs)) {
-        op->emitOpError() << "illegal: requires ["
-                          << llvm::join(stringifyProfile<Profile>(coProfs),
-                                        ", ")
-                          << "] to work with but not enabled in target\n";
-        return failure();
-      }
-    }
-  }
-
   // Ensure the profile inference match the profile knowledge of the
   // specification.
   for (const auto &cands : specRequiredModeSet) {
diff --git a/mlir/test/Dialect/Tosa/invalid_extension.mlir b/mlir/test/Dialect/Tosa/invalid_extension.mlir
index 16190bb69411c..f0f001ec8511b 100644
--- a/mlir/test/Dialect/Tosa/invalid_extension.mlir
+++ b/mlir/test/Dialect/Tosa/invalid_extension.mlir
@@ -186,6 +186,13 @@ func.func @test_concat(%arg0: tensor<13x21x3xbf16>, %arg1: tensor<13x21x3xbf16>)
   return %0 : tensor<26x21x3xbf16>
 }
 
+// -----
+func.func @test_concat(%arg0: tensor<13x21x3xi16>, %arg1: tensor<13x21x3xi16>) -> tensor<26x21x3xi16> {
+  // expected-error at +1 {{'tosa.concat' op illegal: requires [int16] but not enabled in target}}
+  %0 = tosa.concat %arg0, %arg1 {axis = 0 : i32} : (tensor<13x21x3xi16>, tensor<13x21x3xi16>) -> tensor<26x21x3xi16>
+  return %0 : tensor<26x21x3xi16>
+}
+
 // -----
 func.func @test_pad(%arg0: tensor<13x21x3xbf16>) -> tensor<13x21x3xbf16> {
   %padding = tosa.const_shape {values = dense<0> : tensor<6xindex>} : () -> !tosa.shape<6>
diff --git a/mlir/test/Dialect/Tosa/level_check.mlir b/mlir/test/Dialect/Tosa/level_check.mlir
index d9de2e0d37c25..d061da14bb109 100644
--- a/mlir/test/Dialect/Tosa/level_check.mlir
+++ b/mlir/test/Dialect/Tosa/level_check.mlir
@@ -1,4 +1,4 @@
-// RUN: mlir-opt %s -split-input-file -verify-diagnostics -tosa-attach-target="extensions=dynamic" -tosa-validate
+// RUN: mlir-opt %s -split-input-file -verify-diagnostics -tosa-attach-target="profiles=pro_int,pro_fp extensions=dynamic" -tosa-validate
 
 func.func @test_argmax_rank_invalid(%arg0: tensor<1x1x1x1x29x29x4xf32>) -> tensor<1x1x1x1x29x4xi32> {
   // expected-error at +1 {{'tosa.argmax' op failed level check: operand rank(shape) <= MAX_RANK}}
diff --git a/mlir/test/Dialect/Tosa/profile_all_unsupported.mlir b/mlir/test/Dialect/Tosa/profile_all_unsupported.mlir
index d1e61345ff313..8e56c9c54446b 100644
--- a/mlir/test/Dialect/Tosa/profile_all_unsupported.mlir
+++ b/mlir/test/Dialect/Tosa/profile_all_unsupported.mlir
@@ -1,8 +1,8 @@
-//--------------------------------------------------------------------------------------------------
-// Enable all supported extensions to focus the verification of expected profile requirement errors.
-//--------------------------------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+// Check validation of operations when no profiles are specified in the target.
+//-----------------------------------------------------------------------------
 
-// RUN: mlir-opt %s -split-input-file -verify-diagnostics -tosa-attach-target="extensions=int16,int4,bf16,fp8e4m3,fp8e5m2,fft,variable,controlflow,dynamic,doubleround,inexactround" -tosa-validate="strict-op-spec-alignment"
+// RUN: mlir-opt %s -split-input-file -verify-diagnostics -tosa-attach-target="" -tosa-validate="strict-op-spec-alignment"
 
 // -----
 func.func @test_add_i32(%arg0: tensor<13x21x1xi32>, %arg1: tensor<13x21x3xi32>) -> tensor<13x21x3xi32> {
diff --git a/mlir/test/Dialect/Tosa/profile_pro_fp_unsupported.mlir b/mlir/test/Dialect/Tosa/profile_pro_fp_unsupported.mlir
index d7330cb763fc0..fb0ce19dfc5b0 100644
--- a/mlir/test/Dialect/Tosa/profile_pro_fp_unsupported.mlir
+++ b/mlir/test/Dialect/Tosa/profile_pro_fp_unsupported.mlir
@@ -1,8 +1,8 @@
-//--------------------------------------------------------------------------------------------------
-// Enable all supported extensions to focus the verification of expected profile requirement errors.
-//--------------------------------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+// Check operations fail to validate when pro_fp is not provided in the target.
+//-----------------------------------------------------------------------------
 
-// RUN: mlir-opt %s -split-input-file -verify-diagnostics -tosa-attach-target="specification_version=1.1.draft profiles=pro_int extensions=int16,int4,bf16,fp8e4m3,fp8e5m2,fft,variable,controlflow,dynamic,doubleround,inexactround,mxfp,mxfp_conv" -tosa-validate="strict-op-spec-alignment"
+// RUN: mlir-opt %s -split-input-file -verify-diagnostics -tosa-attach-target="specification_version=1.1.draft profiles=pro_int" -tosa-validate="strict-op-spec-alignment"
 
 // -----
 func.func @test_const_f16() -> tensor<3x11x11x3xf16> {
diff --git a/mlir/test/Dialect/Tosa/profile_pro_int_unsupported.mlir b/mlir/test/Dialect/Tosa/profile_pro_int_unsupported.mlir
index cb760956fbd68..99b602e48febb 100644
--- a/mlir/test/Dialect/Tosa/profile_pro_int_unsupported.mlir
+++ b/mlir/test/Dialect/Tosa/profile_pro_int_unsupported.mlir
@@ -1,8 +1,8 @@
-//--------------------------------------------------------------------------------------------------
-// Enable all supported extensions to focus the verification of expected profile requirement errors.
-//--------------------------------------------------------------------------------------------------
+//--------------------------------------------------------------------------------
+// Check operations fail to validation when pro_int is not provided in the target.
+//--------------------------------------------------------------------------------
 
-// RUN: mlir-opt %s -split-input-file -verify-diagnostics -tosa-attach-target="profiles=pro_fp extensions=int16,int4,bf16,fp8e4m3,fp8e5m2,fft,variable,controlflow,dynamic,doubleround,inexactround" -tosa-validate="strict-op-spec-alignment"
+// RUN: mlir-opt %s -split-input-file -verify-diagnostics -tosa-attach-target="profiles=pro_fp" -tosa-validate="strict-op-spec-alignment"
 
 // -----
 func.func @test_const_i1() -> tensor<3x11x11x3xi1> {
@@ -179,13 +179,6 @@ func.func @test_reduce_sum(%arg0: tensor<13x21x3xi32>) -> tensor<1x21x3xi32> {
   return %0 : tensor<1x21x3xi32>
 }
 
-// -----
-func.func @test_concat(%arg0: tensor<13x21x3xi16>, %arg1: tensor<13x21x3xi16>) -> tensor<26x21x3xi16> {
-  // expected-error at +1 {{'tosa.concat' op illegal: requires [pro_int] to work with but not enabled in target}}
-  %0 = tosa.concat %arg0, %arg1 {axis = 0 : i32} : (tensor<13x21x3xi16>, tensor<13x21x3xi16>) -> tensor<26x21x3xi16>
-  return %0 : tensor<26x21x3xi16>
-}
-
 // -----
 func.func @test_pad(%arg0: tensor<13x21x3xi8>) -> tensor<13x21x3xi8> {
   %padding = tosa.const_shape {values = dense<0> : tensor<6xindex>} : () -> !tosa.shape<6>
diff --git a/mlir/test/Dialect/Tosa/tosa-attach-target-non-cooperative-profile.mlir b/mlir/test/Dialect/Tosa/tosa-attach-target-non-cooperative-profile.mlir
new file mode 100644
index 0000000000000..a72228896cd0a
--- /dev/null
+++ b/mlir/test/Dialect/Tosa/tosa-attach-target-non-cooperative-profile.mlir
@@ -0,0 +1,9 @@
+// RUN: mlir-opt %s -verify-diagnostics -tosa-attach-target="profiles=pro_fp extensions=int16"
+
+// expected-error at below {{use of extension 'int16' requires any of profiles: [pro_int] to be enabled in the target}}
+module {
+    func.func @test_simple(%arg0 : tensor<1x1x1x1xf32>, %arg1 : tensor<1x1x1x1xf32>) -> tensor<1x1x1x1xf32> {
+        %1 = tosa.add %arg0, %arg1 : (tensor<1x1x1x1xf32>, tensor<1x1x1x1xf32>) -> tensor<1x1x1x1xf32>
+        return %1 : tensor<1x1x1x1xf32>
+    }
+}

>From 197fd13b367894a9de9cc4575de78d5d99f3686c Mon Sep 17 00:00:00 2001
From: Luke Hutton <luke.hutton at arm.com>
Date: Tue, 10 Mar 2026 11:30:35 +0000
Subject: [PATCH 3/3] Extend profile/extension check to support multiple
 entries

When adding tests gather/scatter when only the pro_fp profile is provided
in the target, an issue was noticed. These gather/scatter ops now have
multiple profile entries, one for pro_fp and one for pro_int. This commit
extends the profile/extension check to support multiple entries.

In addition, it also cleans up the error messages, printing all the rules
required for the op instead of just the first one found.

The checks for profile/extension alignment between those included in the
operator definition and those included in the profile compliance table
has been moved to an assert, as they should never fail from a user
perspective.

Change-Id: Id0af068b770d9e5ba7df5cef94065b8bc8e581bb
---
 .../Dialect/Tosa/IR/TosaProfileCompliance.h   |   7 +-
 .../Tosa/Transforms/TosaProfileCompliance.cpp | 138 ++++++++++--------
 mlir/test/Dialect/Tosa/invalid_extension.mlir | 114 +++++++--------
 .../Dialect/Tosa/profile_all_unsupported.mlir |  87 ++++++-----
 .../Tosa/profile_pro_fp_unsupported.mlir      |  94 ++++++------
 .../Tosa/profile_pro_int_unsupported.mlir     |  74 +++++-----
 .../tosa-validation-version-1p0-invalid.mlir  |  28 ++--
 ...validation-version-1p0-pro-fp-invalid.mlir |  15 ++
 .../tosa-validation-version-1p0-valid.mlir    |  15 ++
 ...a-validation-version-1p1-pro-fp-valid.mlir |  15 ++
 10 files changed, 321 insertions(+), 266 deletions(-)
 create mode 100644 mlir/test/Dialect/Tosa/tosa-validation-version-1p0-pro-fp-invalid.mlir
 create mode 100644 mlir/test/Dialect/Tosa/tosa-validation-version-1p0-valid.mlir
 create mode 100644 mlir/test/Dialect/Tosa/tosa-validation-version-1p1-pro-fp-valid.mlir

diff --git a/mlir/include/mlir/Dialect/Tosa/IR/TosaProfileCompliance.h b/mlir/include/mlir/Dialect/Tosa/IR/TosaProfileCompliance.h
index 53372f56f2bf0..0135a651be481 100644
--- a/mlir/include/mlir/Dialect/Tosa/IR/TosaProfileCompliance.h
+++ b/mlir/include/mlir/Dialect/Tosa/IR/TosaProfileCompliance.h
@@ -134,8 +134,8 @@ class TosaProfileCompliance {
   // Find the required profiles or extensions from the compliance info according
   // to the operand type combination.
   template <typename T>
-  OpComplianceInfo<T>
-  findMatchedEntry(Operation *op, SmallVector<OpComplianceInfo<T>> compInfo);
+  SmallVector<OpComplianceInfo<T>>
+  findMatchedEntries(Operation *op, SmallVector<OpComplianceInfo<T>> compInfo);
 
   // Debug utilites.
   template <typename T>
@@ -149,7 +149,8 @@ class TosaProfileCompliance {
 
 private:
   template <typename T>
-  FailureOr<OpComplianceInfo<T>> getOperatorDefinition(Operation *op);
+  FailureOr<SmallVector<OpComplianceInfo<T>>>
+  getOperatorMatchedEntries(Operation *op);
 
   OperationProfileComplianceMap profileComplianceMap;
   OperationExtensionComplianceMap extensionComplianceMap;
diff --git a/mlir/lib/Dialect/Tosa/Transforms/TosaProfileCompliance.cpp b/mlir/lib/Dialect/Tosa/Transforms/TosaProfileCompliance.cpp
index 1b824a4d32586..3368e70af2209 100644
--- a/mlir/lib/Dialect/Tosa/Transforms/TosaProfileCompliance.cpp
+++ b/mlir/lib/Dialect/Tosa/Transforms/TosaProfileCompliance.cpp
@@ -364,15 +364,15 @@ LogicalResult ProfileInfoDepot::populatationDispatch(Operation *op) {
 //===----------------------------------------------------------------------===//
 
 template <typename T>
-FailureOr<OpComplianceInfo<T>>
-TosaProfileCompliance::getOperatorDefinition(Operation *op) {
+FailureOr<SmallVector<OpComplianceInfo<T>>>
+TosaProfileCompliance::getOperatorMatchedEntries(Operation *op) {
   const std::string opName = op->getName().getStringRef().str();
   const auto complianceMap = getProfileComplianceMap<T>();
   const auto it = complianceMap.find(opName);
   if (it == complianceMap.end())
     return {};
 
-  return findMatchedEntry<T>(op, it->second);
+  return findMatchedEntries<T>(op, it->second);
 }
 
 template <typename T>
@@ -384,8 +384,8 @@ LogicalResult TosaProfileCompliance::checkProfileOrExtension(
   if (specRequiredModeSet.size() == 0)
     return success();
 
-  const auto maybeOpDefinition = getOperatorDefinition<T>(op);
-  if (failed(maybeOpDefinition)) {
+  const auto maybeOpEntries = getOperatorMatchedEntries<T>(op);
+  if (failed(maybeOpEntries)) {
     // Operators such as control-flow and shape ops do not have an operand type
     // restriction. When the profile compliance information of operation is not
     // found, confirm if the target have enabled the profile required from the
@@ -406,68 +406,76 @@ LogicalResult TosaProfileCompliance::checkProfileOrExtension(
     return failure();
   }
 
-  // Find the required profiles or extensions according to the operand type
-  // combination.
-  const auto opDefinition = maybeOpDefinition.value();
-  const SmallVector<T> opRequiredMode = opDefinition.mode;
-  const CheckCondition condition = opDefinition.condition;
-
-  if (opRequiredMode.size() == 0) {
+  const auto opEntries = maybeOpEntries.value();
+  if (opEntries.size() == 0) {
     // No matched restriction found.
     return success();
   }
 
-  if (condition == CheckCondition::allOf &&
-      !targetEnv.allowsAllOf(opRequiredMode)) {
-    op->emitOpError() << "illegal: requires"
-                      << (opRequiredMode.size() > 1 ? " all of " : " ") << "["
-                      << llvm::join(stringifyProfile<T>(opRequiredMode), ", ")
-                      << "] but not enabled in target\n";
-    return failure();
-  }
+  // Check the profile/extension requirement according to the current target
+  // profiles/extensions.
+  const auto isModeAllowed = [&](const OpComplianceInfo<T> &info) -> bool {
+    if (info.condition == CheckCondition::allOf)
+      return targetEnv.allowsAllOf(info.mode);
+    return targetEnv.allowsAnyOf(info.mode);
+  };
 
-  if (condition == CheckCondition::anyOf &&
-      !targetEnv.allowsAnyOf(opRequiredMode)) {
-    op->emitOpError() << "illegal: requires"
-                      << (opRequiredMode.size() > 1 ? " any of " : " ") << "["
-                      << llvm::join(stringifyProfile<T>(opRequiredMode), ", ")
-                      << "] but not enabled in target\n";
-    return failure();
+  // Check the matched op compliance version does not exceed the target
+  // specification version.
+  const TosaSpecificationVersion targetVersion{targetEnv.getSpecVersion()};
+  const auto isVersionCompatible =
+      [&targetVersion](const OpComplianceInfo<T> &info) -> bool {
+    const TosaSpecificationVersion complianceVersion{
+        info.operandTypeInfoSet.front().second};
+    return targetVersion.isBackwardsCompatibleWith(complianceVersion);
+  };
+
+  for (const auto &info : opEntries) {
+    // Ensure the profile compliance is compatible with the profile knowledge of
+    // the op definition.
+    assert(llvm::all_of(info.mode,
+                        [&specRequiredModeSet](const T &mode) {
+                          return llvm::is_contained(specRequiredModeSet.front(),
+                                                    mode);
+                        }) &&
+           "the profile/extension requirement of the operator should be "
+           "included in the profile compliance information");
+
+    if (isModeAllowed(info) && isVersionCompatible(info))
+      return success();
   }
 
-  // Ensure the profile inference match the profile knowledge of the
-  // specification.
-  for (const auto &cands : specRequiredModeSet) {
-    for (const auto &mode : opRequiredMode) {
-      if (!llvm::is_contained(cands, mode)) {
-        op->emitOpError() << "illegal: requires ["
-                          << llvm::join(stringifyProfile<T>(opRequiredMode),
-                                        ", ")
-                          << "] but not included in the profile compliance ["
-                          << llvm::join(
-                                 stringifyProfile<T>(specRequiredModeSet), ", ")
-                          << "]\n";
-        return failure();
-      }
+  // No valid entry was found, now emit appropriate error message and return
+  // failure
+  std::string message;
+  llvm::raw_string_ostream os(message);
+
+  os << "illegal: ";
+  const size_t numOpEntries = opEntries.size();
+  for (const auto &[index, info] : llvm::enumerate(opEntries)) {
+    bool mismatchedVersion = false;
+    if (!isVersionCompatible(info)) {
+      mismatchedVersion = true;
+      os << "requires specification version compatible with "
+         << stringifyVersion(info.operandTypeInfoSet.front().second) << " (got "
+         << stringifyVersion(targetVersion) << ") ";
     }
-  }
 
-  // Ensure the matched op compliance version does not exceed the target
-  // specification version.
-  const VersionedTypeInfo versionedTypeInfo =
-      opDefinition.operandTypeInfoSet[0];
-  const TosaSpecificationVersion complianceVersion{versionedTypeInfo.second};
-  const TosaSpecificationVersion targetVersion{targetEnv.getSpecVersion()};
-  if (!targetVersion.isBackwardsCompatibleWith(complianceVersion)) {
-    op->emitOpError() << "illegal: the target specification version ("
-                      << stringifyVersion(targetVersion)
-                      << ") is not backwards compatible with the op compliance "
-                         "specification version ("
-                      << stringifyVersion(complianceVersion) << ")\n";
-    return failure();
+    if (!isModeAllowed(info)) {
+      if (mismatchedVersion)
+        os << "and ";
+      os << "requires "
+         << (info.condition == CheckCondition::allOf ? "all of " : "any of ")
+         << "[" << llvm::join(stringifyProfile<T>(info.mode), ", ")
+         << "] profiles/extensions ";
+    }
+
+    if (index != numOpEntries - 1)
+      os << "OR ";
   }
+  os << "to be specified in the target environment";
 
-  return success();
+  return op->emitOpError(message);
 }
 
 LogicalResult
@@ -491,14 +499,15 @@ TosaProfileCompliance::checkExtension(Operation *op,
 }
 
 LogicalResult TosaProfileCompliance::checkInvalid(Operation *op) {
-  const auto maybeProfDef = getOperatorDefinition<Profile>(op);
-  const auto maybeExtDef = getOperatorDefinition<Extension>(op);
-  if (failed(maybeProfDef) && failed(maybeExtDef))
+  const auto maybeProfEntries = getOperatorMatchedEntries<Profile>(op);
+  const auto maybeExtEntries = getOperatorMatchedEntries<Extension>(op);
+  if (failed(maybeProfEntries) && failed(maybeExtEntries))
     return success();
 
   const bool hasEntry =
-      (succeeded(maybeProfDef) && !maybeProfDef->mode.empty()) ||
-      (succeeded(maybeExtDef) && !maybeExtDef->mode.empty());
+      (succeeded(maybeProfEntries) && !maybeProfEntries.value().empty()) ||
+      (succeeded(maybeExtEntries) && !maybeExtEntries.value().empty());
+
   if (!hasEntry) {
     std::string message;
     llvm::raw_string_ostream os(message);
@@ -552,7 +561,7 @@ LogicalResult TosaProfileCompliance::checkInvalid(Operation *op) {
 // Find the profiles or extensions requirement according to the signature of
 // type of the operand list.
 template <typename T>
-OpComplianceInfo<T> TosaProfileCompliance::findMatchedEntry(
+SmallVector<OpComplianceInfo<T>> TosaProfileCompliance::findMatchedEntries(
     Operation *op, SmallVector<OpComplianceInfo<T>> compInfo) {
   assert(compInfo.size() != 0 &&
          "profile-based compliance information is empty");
@@ -563,6 +572,7 @@ OpComplianceInfo<T> TosaProfileCompliance::findMatchedEntry(
   if (present.size() == 0)
     return {};
 
+  SmallVector<OpComplianceInfo<T>> matchedInfos;
   for (size_t i = 0; i < compInfo.size(); i++) {
     SmallVector<VersionedTypeInfo> sets = compInfo[i].operandTypeInfoSet;
     for (const auto &set : sets) {
@@ -587,12 +597,12 @@ OpComplianceInfo<T> TosaProfileCompliance::findMatchedEntry(
         SmallVector<VersionedTypeInfo> typeInfoSet{set};
         OpComplianceInfo<T> info{compInfo[i].mode, typeInfoSet,
                                  compInfo[i].condition};
-        return info;
+        matchedInfos.push_back(info);
       }
     }
   }
 
-  return {};
+  return matchedInfos;
 }
 
 // Debug utilites.
diff --git a/mlir/test/Dialect/Tosa/invalid_extension.mlir b/mlir/test/Dialect/Tosa/invalid_extension.mlir
index f0f001ec8511b..901d865f4caeb 100644
--- a/mlir/test/Dialect/Tosa/invalid_extension.mlir
+++ b/mlir/test/Dialect/Tosa/invalid_extension.mlir
@@ -6,189 +6,189 @@
 
 // -----
 func.func @test_argmax(%arg0: tensor<14x19xbf16>) -> tensor<14xi32> {
-  // expected-error at +1 {{'tosa.argmax' op illegal: requires [bf16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.argmax' op illegal: requires any of [bf16] profiles/extensions to be specified in the target environment}}
   %0 = tosa.argmax %arg0 {axis = 1 : i32} : (tensor<14x19xbf16>) -> tensor<14xi32>
   return %0 : tensor<14xi32>
 }
 
 // -----
 func.func @test_avg_pool2d(%arg0: tensor<1x7x7x9xbf16>, %arg1: tensor<1xbf16>, %arg2: tensor<1xbf16>) -> tensor<1x7x7x9xbf16> {
-  // expected-error at +1 {{'tosa.avg_pool2d' op illegal: requires [bf16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.avg_pool2d' op illegal: requires any of [bf16] profiles/extensions to be specified in the target environment}}
   %0 = tosa.avg_pool2d %arg0, %arg1, %arg2 {acc_type = f32, kernel = array<i64: 2, 2>, pad = array<i64: 0, 1, 0, 1>, stride = array<i64: 1, 1>} : (tensor<1x7x7x9xbf16>, tensor<1xbf16>, tensor<1xbf16>) -> tensor<1x7x7x9xbf16>
   return %0 : tensor<1x7x7x9xbf16>
 }
 
 // -----
 func.func @test_conv2d(%arg0: tensor<1x4x4x4xi8>, %arg1: tensor<8x1x1x4xi4>, %arg2: tensor<8xi32>, %arg3: tensor<1xi8>, %arg4: tensor<1xi4>) -> tensor<1x4x4x8xi32> {
-  // expected-error at +1 {{'tosa.conv2d' op illegal: requires [int4] but not enabled in target}}
+  // expected-error at +1 {{'tosa.conv2d' op illegal: requires any of [int4] profiles/extensions to be specified in the target environment}}
   %0 = tosa.conv2d %arg0, %arg1, %arg2, %arg3, %arg4 {acc_type = i32, dilation = array<i64: 1, 1>, pad = array<i64: 0, 0, 0, 0>, stride = array<i64: 1, 1>, local_bound = true} : (tensor<1x4x4x4xi8>, tensor<8x1x1x4xi4>, tensor<8xi32>, tensor<1xi8>, tensor<1xi4>) -> tensor<1x4x4x8xi32>
   return %0 : tensor<1x4x4x8xi32>
 }
 
 // -----
 func.func @test_conv3d(%arg0: tensor<1x4x8x21x17xi16>, %arg1: tensor<34x1x1x1x17xi8>, %arg2: tensor<34xi48>, %arg3: tensor<1xi16>, %arg4: tensor<1xi8>) -> tensor<1x4x8x21x34xi48> {
-  // expected-error at +1 {{'tosa.conv3d' op illegal: requires [int16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.conv3d' op illegal: requires any of [int16] profiles/extensions to be specified in the target environment}}
   %0 = tosa.conv3d %arg0, %arg1, %arg2, %arg3, %arg4 {acc_type = i48, dilation = array<i64: 1, 1, 1>, pad = array<i64: 0, 0, 0, 0, 0, 0>, stride = array<i64: 1, 1, 1>} : (tensor<1x4x8x21x17xi16>, tensor<34x1x1x1x17xi8>, tensor<34xi48>, tensor<1xi16>, tensor<1xi8>) -> tensor<1x4x8x21x34xi48>
   return %0 : tensor<1x4x8x21x34xi48>
 }
 
 // -----
 func.func @test_depthwise_conv2d(%arg0: tensor<1x4x4x4xbf16>, %arg1: tensor<1x1x4x2xbf16>, %arg2: tensor<8xbf16>, %arg3: tensor<1xbf16>, %arg4: tensor<1xbf16>) -> tensor<1x4x4x8xbf16> {
-  // expected-error at +1 {{'tosa.depthwise_conv2d' op illegal: requires [bf16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.depthwise_conv2d' op illegal: requires any of [bf16] profiles/extensions to be specified in the target environment}}
   %0 = tosa.depthwise_conv2d %arg0, %arg1, %arg2, %arg3, %arg4 {acc_type = f32, dilation = array<i64: 1, 1>, pad = array<i64: 0, 0, 0, 0>, stride = array<i64: 1, 1>} : (tensor<1x4x4x4xbf16>, tensor<1x1x4x2xbf16>, tensor<8xbf16>, tensor<1xbf16>, tensor<1xbf16>) -> tensor<1x4x4x8xbf16>
   return %0 : tensor<1x4x4x8xbf16>
 }
 
 // -----
 func.func @test_max_pool2d(%arg0: tensor<1x32x32x8xi16>) -> tensor<1x32x32x8xi16> {
-  // expected-error at +1 {{'tosa.max_pool2d' op illegal: requires [int16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.max_pool2d' op illegal: requires any of [int16] profiles/extensions to be specified in the target environment}}
   %0 = tosa.max_pool2d %arg0 {kernel = array<i64: 1, 1>, pad = array<i64: 0, 0, 0, 0>, stride = array<i64: 1, 1>} : (tensor<1x32x32x8xi16>) -> tensor<1x32x32x8xi16>
   return %0 : tensor<1x32x32x8xi16>
 }
 
 // -----
 func.func @test_clamp(%arg0: tensor<13x21x3xi16>) -> tensor<13x21x3xi16> {
-  // expected-error at +1 {{'tosa.clamp' op illegal: requires [int16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.clamp' op illegal: requires any of [int16] profiles/extensions to be specified in the target environment}}
   %0 = tosa.clamp %arg0 {min_val = 0 : i16, max_val = 1 : i16} : (tensor<13x21x3xi16>) -> tensor<13x21x3xi16>
   return %0 : tensor<13x21x3xi16>
 }
 
 // -----
 func.func @test_sigmoid(%arg0: tensor<13x21x3xbf16>) -> tensor<13x21x3xbf16> {
-  // expected-error at +1 {{'tosa.sigmoid' op illegal: requires [bf16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.sigmoid' op illegal: requires any of [bf16] profiles/extensions to be specified in the target environment}}
   %0 = tosa.sigmoid %arg0 : (tensor<13x21x3xbf16>) -> tensor<13x21x3xbf16>
   return %0 : tensor<13x21x3xbf16>
 }
 
 // -----
 func.func @test_tanh(%arg0: tensor<13x21x3xbf16>) -> tensor<13x21x3xbf16> {
-  // expected-error at +1 {{'tosa.tanh' op illegal: requires [bf16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.tanh' op illegal: requires any of [bf16] profiles/extensions to be specified in the target environment}}
   %0 = tosa.tanh %arg0 : (tensor<13x21x3xbf16>) -> tensor<13x21x3xbf16>
   return %0 : tensor<13x21x3xbf16>
 }
 
 // -----
 func.func @test_add(%arg0: tensor<13x21x1xbf16>, %arg1: tensor<13x21x3xbf16>) -> tensor<13x21x3xbf16> {
-  // expected-error at +1 {{'tosa.add' op illegal: requires [bf16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.add' op illegal: requires any of [bf16] profiles/extensions to be specified in the target environment}}
   %0 = tosa.add %arg0, %arg1 : (tensor<13x21x1xbf16>, tensor<13x21x3xbf16>) -> tensor<13x21x3xbf16>
   return %0 : tensor<13x21x3xbf16>
 }
 
 // -----
 func.func @test_max(%arg0: tensor<13x21x3xbf16>, %arg1: tensor<13x21x1xbf16>) -> tensor<13x21x3xbf16> {
-  // expected-error at +1 {{'tosa.maximum' op illegal: requires [bf16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.maximum' op illegal: requires any of [bf16] profiles/extensions to be specified in the target environment}}
   %0 = tosa.maximum %arg0, %arg1 : (tensor<13x21x3xbf16>, tensor<13x21x1xbf16>) -> tensor<13x21x3xbf16>
   return %0 : tensor<13x21x3xbf16>
 }
 
 // -----
 func.func @test_mul(%arg0: tensor<13x21x3xbf16>, %arg1: tensor<13x1x3xbf16>, %shift: tensor<1xi8>) -> tensor<13x21x3xbf16> {
-  // expected-error at +1 {{'tosa.mul' op illegal: requires [bf16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.mul' op illegal: requires any of [bf16] profiles/extensions to be specified in the target environment}}
   %0 = tosa.mul %arg0, %arg1, %shift : (tensor<13x21x3xbf16>, tensor<13x1x3xbf16>, tensor<1xi8>) -> tensor<13x21x3xbf16>
   return %0 : tensor<13x21x3xbf16>
 }
 
 // -----
 func.func @test_pow(%arg0: tensor<13x21x3xbf16>, %arg1: tensor<13x21x1xbf16>) -> tensor<13x21x3xbf16> {
-  // expected-error at +1 {{'tosa.pow' op illegal: requires [bf16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.pow' op illegal: requires any of [bf16] profiles/extensions to be specified in the target environment}}
   %0 = tosa.pow %arg0, %arg1 : (tensor<13x21x3xbf16>, tensor<13x21x1xbf16>) -> tensor<13x21x3xbf16>
   return %0 : tensor<13x21x3xbf16>
 }
 
 // -----
 func.func @test_sub(%arg0: tensor<1x21x3xbf16>, %arg1: tensor<13x21x3xbf16>) -> tensor<13x21x3xbf16> {
-  // expected-error at +1 {{'tosa.sub' op illegal: requires [bf16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.sub' op illegal: requires any of [bf16] profiles/extensions to be specified in the target environment}}
   %0 = tosa.sub %arg0, %arg1 : (tensor<1x21x3xbf16>, tensor<13x21x3xbf16>) -> tensor<13x21x3xbf16>
   return %0 : tensor<13x21x3xbf16>
 }
 
 // -----
 func.func @test_table(%arg0 : tensor<4x5xi16>, %arg1 : tensor<513xi16>) -> () {
-  // expected-error at +1 {{'tosa.table' op illegal: requires [int16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.table' op illegal: requires any of [int16] profiles/extensions to be specified in the target environment}}
   %0 = tosa.table %arg0, %arg1 : (tensor<4x5xi16>, tensor<513xi16>) -> tensor<?x?xi32>
   return
 }
 
 // -----
 func.func @test_abs(%arg0: tensor<13x21x3xbf16>) -> tensor<13x21x3xbf16> {
-  // expected-error at +1 {{'tosa.abs' op illegal: requires [bf16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.abs' op illegal: requires any of [bf16] profiles/extensions to be specified in the target environment}}
   %0 = tosa.abs %arg0 : (tensor<13x21x3xbf16>) -> tensor<13x21x3xbf16>
   return %0 : tensor<13x21x3xbf16>
 }
 
 // -----
 func.func @test_cos(%arg0: tensor<13x21x3xbf16>) -> tensor<13x21x3xbf16> {
-  // expected-error at +1 {{'tosa.cos' op illegal: requires [bf16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.cos' op illegal: requires any of [bf16] profiles/extensions to be specified in the target environment}}
   %0 = tosa.cos %arg0 : (tensor<13x21x3xbf16>) -> tensor<13x21x3xbf16>
   return %0 : tensor<13x21x3xbf16>
 }
 
 // -----
 func.func @test_exp(%arg0: tensor<13x21x3xbf16>) -> tensor<13x21x3xbf16> {
-  // expected-error at +1 {{'tosa.exp' op illegal: requires [bf16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.exp' op illegal: requires any of [bf16] profiles/extensions to be specified in the target environment}}
   %0 = tosa.exp %arg0 : (tensor<13x21x3xbf16>) -> tensor<13x21x3xbf16>
   return %0 : tensor<13x21x3xbf16>
 }
 
 // -----
 func.func @test_floor(%arg0: tensor<13x21x3xbf16>) -> tensor<13x21x3xbf16> {
-  // expected-error at +1 {{'tosa.floor' op illegal: requires [bf16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.floor' op illegal: requires any of [bf16] profiles/extensions to be specified in the target environment}}
   %0 = tosa.floor %arg0 : (tensor<13x21x3xbf16>) -> tensor<13x21x3xbf16>
   return %0 : tensor<13x21x3xbf16>
 }
 
 // -----
 func.func @test_log(%arg0: tensor<13x21x3xbf16>) -> tensor<13x21x3xbf16> {
-  // expected-error at +1 {{'tosa.log' op illegal: requires [bf16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.log' op illegal: requires any of [bf16] profiles/extensions to be specified in the target environment}}
   %0 = tosa.log %arg0 : (tensor<13x21x3xbf16>) -> tensor<13x21x3xbf16>
   return %0 : tensor<13x21x3xbf16>
 }
 
 // -----
 func.func @test_negate(%arg0: tensor<13x21x3xbf16>, %arg1: tensor<1xbf16>, %arg2: tensor<1xbf16>) -> tensor<13x21x3xbf16> {
-  // expected-error at +1 {{'tosa.negate' op illegal: requires [bf16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.negate' op illegal: requires any of [bf16] profiles/extensions to be specified in the target environment}}
   %0 = tosa.negate %arg0, %arg1, %arg2 : (tensor<13x21x3xbf16>, tensor<1xbf16>, tensor<1xbf16>) -> tensor<13x21x3xbf16>
   return %0 : tensor<13x21x3xbf16>
 }
 
 // -----
 func.func @test_reciprocal(%arg0: tensor<13x21x3xbf16>) -> tensor<13x21x3xbf16> {
-  // expected-error at +1 {{'tosa.reciprocal' op illegal: requires [bf16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.reciprocal' op illegal: requires any of [bf16] profiles/extensions to be specified in the target environment}}
   %0 = tosa.reciprocal %arg0 : (tensor<13x21x3xbf16>) -> tensor<13x21x3xbf16>
   return %0 : tensor<13x21x3xbf16>
 }
 
 // -----
 func.func @test_rsqrt(%arg0: tensor<13x21x3xbf16>) -> tensor<13x21x3xbf16> {
-  // expected-error at +1 {{'tosa.rsqrt' op illegal: requires [bf16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.rsqrt' op illegal: requires any of [bf16] profiles/extensions to be specified in the target environment}}
   %0 = tosa.rsqrt %arg0 : (tensor<13x21x3xbf16>) -> tensor<13x21x3xbf16>
   return %0 : tensor<13x21x3xbf16>
 }
 
 // -----
 func.func @test_equal(%arg0: tensor<13x21x3xbf16>, %arg1: tensor<13x1x3xbf16>) -> tensor<13x21x3xi1> {
-  // expected-error at +1 {{'tosa.equal' op illegal: requires [bf16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.equal' op illegal: requires any of [bf16] profiles/extensions to be specified in the target environment}}
   %0 = tosa.equal %arg0, %arg1 : (tensor<13x21x3xbf16>, tensor<13x1x3xbf16>) -> tensor<13x21x3xi1>
   return %0 : tensor<13x21x3xi1>
 }
 
 // -----
 func.func @test_reduce_max(%arg0: tensor<13x21x3xbf16>) -> tensor<1x21x3xbf16> {
-  // expected-error at +1 {{'tosa.reduce_max' op illegal: requires [bf16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.reduce_max' op illegal: requires any of [bf16] profiles/extensions to be specified in the target environment}}
   %0 = tosa.reduce_max %arg0 {axis = 0 : i32} : (tensor<13x21x3xbf16>) -> tensor<1x21x3xbf16>
   return %0 : tensor<1x21x3xbf16>
 }
 
 // -----
 func.func @test_concat(%arg0: tensor<13x21x3xbf16>, %arg1: tensor<13x21x3xbf16>) -> tensor<26x21x3xbf16> {
-  // expected-error at +1 {{'tosa.concat' op illegal: requires [bf16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.concat' op illegal: requires any of [bf16] profiles/extensions to be specified in the target environment}}
   %0 = tosa.concat %arg0, %arg1 {axis = 0 : i32} : (tensor<13x21x3xbf16>, tensor<13x21x3xbf16>) -> tensor<26x21x3xbf16>
   return %0 : tensor<26x21x3xbf16>
 }
 
 // -----
 func.func @test_concat(%arg0: tensor<13x21x3xi16>, %arg1: tensor<13x21x3xi16>) -> tensor<26x21x3xi16> {
-  // expected-error at +1 {{'tosa.concat' op illegal: requires [int16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.concat' op illegal: requires any of [int16] profiles/extensions to be specified in the target environment}}
   %0 = tosa.concat %arg0, %arg1 {axis = 0 : i32} : (tensor<13x21x3xi16>, tensor<13x21x3xi16>) -> tensor<26x21x3xi16>
   return %0 : tensor<26x21x3xi16>
 }
@@ -196,9 +196,9 @@ func.func @test_concat(%arg0: tensor<13x21x3xi16>, %arg1: tensor<13x21x3xi16>) -
 // -----
 func.func @test_pad(%arg0: tensor<13x21x3xbf16>) -> tensor<13x21x3xbf16> {
   %padding = tosa.const_shape {values = dense<0> : tensor<6xindex>} : () -> !tosa.shape<6>
-  // expected-error at +1 {{'tosa.const' op illegal: requires [bf16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.const' op illegal: requires any of [bf16] profiles/extensions to be specified in the target environment}}
   %pad_const = "tosa.const"() {values = dense<3.14> : tensor<1xbf16>} : () -> tensor<1xbf16>
-  // expected-error at +1 {{'tosa.pad' op illegal: requires [bf16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.pad' op illegal: requires any of [bf16] profiles/extensions to be specified in the target environment}}
   %0 = tosa.pad %arg0, %padding, %pad_const : (tensor<13x21x3xbf16>, !tosa.shape<6>, tensor<1xbf16>) -> tensor<13x21x3xbf16>
   return %0 : tensor<13x21x3xbf16>
 }
@@ -206,14 +206,14 @@ func.func @test_pad(%arg0: tensor<13x21x3xbf16>) -> tensor<13x21x3xbf16> {
 // -----
 func.func @test_reshape(%arg0: tensor<13x21x3xbf16>) -> tensor<1x819xbf16> {
   %1 = tosa.const_shape {values = dense<[1, 819]> : tensor<2xindex>} : () -> !tosa.shape<2>
-  // expected-error at +1 {{'tosa.reshape' op illegal: requires [bf16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.reshape' op illegal: requires any of [bf16] profiles/extensions to be specified in the target environment}}
   %0 = tosa.reshape %arg0, %1 : (tensor<13x21x3xbf16>, !tosa.shape<2>) -> tensor<1x819xbf16>
   return %0 : tensor<1x819xbf16>
 }
 
 // -----
 func.func @test_reverse(%arg0: tensor<13x21x3xbf16>) -> tensor<13x21x3xbf16> {
-  // expected-error at +1 {{'tosa.reverse' op illegal: requires [bf16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.reverse' op illegal: requires any of [bf16] profiles/extensions to be specified in the target environment}}
   %0 = tosa.reverse %arg0 {axis = 0 : i32} : (tensor<13x21x3xbf16>) -> tensor<13x21x3xbf16>
   return %0 : tensor<13x21x3xbf16>
 }
@@ -222,7 +222,7 @@ func.func @test_reverse(%arg0: tensor<13x21x3xbf16>) -> tensor<13x21x3xbf16> {
 func.func @test_slice(%arg0: tensor<13x21x3xbf16>) -> tensor<4x11x1xbf16> {
   %size = tosa.const_shape {values = dense<[4, 11, 1]> : tensor<3xindex>} : () -> !tosa.shape<3>
   %start = tosa.const_shape {values = dense<[6, 8, 0]> : tensor<3xindex>} : () -> !tosa.shape<3>
-  // expected-error at +1 {{'tosa.slice' op illegal: requires [bf16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.slice' op illegal: requires any of [bf16] profiles/extensions to be specified in the target environment}}
   %0 = tosa.slice %arg0, %start, %size : (tensor<13x21x3xbf16>, !tosa.shape<3>, !tosa.shape<3>) -> tensor<4x11x1xbf16>
   return %0 : tensor<4x11x1xbf16>
 }
@@ -230,28 +230,28 @@ func.func @test_slice(%arg0: tensor<13x21x3xbf16>) -> tensor<4x11x1xbf16> {
 // -----
 func.func @test_tile(%arg0: tensor<13x21x3xbf16>) -> tensor<39x21x6xbf16> {
   %cst = tosa.const_shape { values = dense<[3, 1, 2]> : tensor<3xindex> } : () -> !tosa.shape<3>
-  // expected-error at +1 {{'tosa.tile' op illegal: requires [bf16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.tile' op illegal: requires any of [bf16] profiles/extensions to be specified in the target environment}}
   %0 = tosa.tile %arg0, %cst: (tensor<13x21x3xbf16>, !tosa.shape<3>) -> tensor<39x21x6xbf16>
   return %0 : tensor<39x21x6xbf16>
 }
 
 // -----
 func.func @test_transpose(%arg0: tensor<13x21x3xbf16>) -> tensor<3x13x21xbf16> {
-  // expected-error at +1 {{'tosa.transpose' op illegal: requires [bf16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.transpose' op illegal: requires any of [bf16] profiles/extensions to be specified in the target environment}}
   %1 = tosa.transpose %arg0 {perms = array<i32: 2, 0, 1>} : (tensor<13x21x3xbf16>) -> tensor<3x13x21xbf16>
   return %1 : tensor<3x13x21xbf16>
 }
 
 // -----
 func.func @test_gather(%arg0: tensor<13x21x3xbf16>, %arg1: tensor<13x26xi32>) -> tensor<13x26x3xbf16> {
-  // expected-error at +1 {{'tosa.gather' op illegal: requires [bf16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.gather' op illegal: requires any of [bf16] profiles/extensions to be specified in the target environment}}
   %0 = tosa.gather %arg0, %arg1 : (tensor<13x21x3xbf16>, tensor<13x26xi32>) -> tensor<13x26x3xbf16>
   return %0 : tensor<13x26x3xbf16>
 }
 
 // -----
 func.func @test_scatter(%arg0: tensor<13x26x3xbf16>, %arg1: tensor<13x26xi32>, %arg2: tensor<13x26x3xbf16>) -> tensor<13x26x3xbf16> {
-  // expected-error at +1 {{'tosa.scatter' op illegal: requires [bf16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.scatter' op illegal: requires any of [bf16] profiles/extensions to be specified in the target environment}}
   %0 = tosa.scatter %arg0, %arg1, %arg2 : (tensor<13x26x3xbf16>, tensor<13x26xi32>, tensor<13x26x3xbf16>) -> tensor<13x26x3xbf16>
   return %0 : tensor<13x26x3xbf16>
 }
@@ -261,49 +261,49 @@ func.func @test_resize(%arg0: tensor<1x32x32x8xbf16>) -> tensor<1x64x64x8xbf16>
   %scale = tosa.const_shape { values = dense<[4, 2, 4, 2]> : tensor<4xindex> } : () -> !tosa.shape<4>
   %offset = tosa.const_shape { values = dense<[-1, -1]> : tensor<2xindex> } : () -> !tosa.shape<2>
   %border = tosa.const_shape { values = dense<[1, 1]> : tensor<2xindex> } : () -> !tosa.shape<2>
-  // expected-error at +1 {{'tosa.resize' op illegal: requires [bf16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.resize' op illegal: requires any of [bf16] profiles/extensions to be specified in the target environment}}
   %1 = tosa.resize %arg0, %scale, %offset, %border { mode = BILINEAR } : (tensor<1x32x32x8xbf16>, !tosa.shape<4>, !tosa.shape<2>, !tosa.shape<2>) -> tensor<1x64x64x8xbf16>
   return %1 : tensor<1x64x64x8xbf16>
 }
 
 // -----
 func.func @test_cast_i8_bf16(%arg0: tensor<13x21x3xi8>) -> tensor<13x21x3xbf16> {
-  // expected-error at +1 {{'tosa.cast' op illegal: requires [bf16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.cast' op illegal: requires any of [bf16] profiles/extensions to be specified in the target environment}}
   %0 = tosa.cast %arg0 : (tensor<13x21x3xi8>) -> tensor<13x21x3xbf16>
   return %0 : tensor<13x21x3xbf16>
 }
 
 // -----
 func.func @test_cast_bf16_i8(%arg0: tensor<13x21x3xbf16>) -> tensor<13x21x3xi8> {
-  // expected-error at +1 {{'tosa.cast' op illegal: requires [bf16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.cast' op illegal: requires any of [bf16] profiles/extensions to be specified in the target environment}}
   %0 = tosa.cast %arg0 : (tensor<13x21x3xbf16>) -> tensor<13x21x3xi8>
   return %0 : tensor<13x21x3xi8>
 }
 
 // -----
 func.func @test_cast_f32_bf16(%arg0: tensor<13x21x3xf32>) -> tensor<13x21x3xbf16> {
-  // expected-error at +1 {{'tosa.cast' op illegal: requires [bf16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.cast' op illegal: requires any of [bf16] profiles/extensions to be specified in the target environment}}
   %0 = tosa.cast %arg0 : (tensor<13x21x3xf32>) -> tensor<13x21x3xbf16>
   return %0 : tensor<13x21x3xbf16>
 }
 
 // -----
 func.func @test_fft2d(%arg0: tensor<1x4x8xf32>, %arg1: tensor<1x4x8xf32>) -> (tensor<1x4x8xf32>, tensor<1x4x8xf32>) {
-  // expected-error at +1 {{'tosa.fft2d' op illegal: requires [fft] but not enabled in target}}
+  // expected-error at +1 {{'tosa.fft2d' op illegal: requires any of [fft] profiles/extensions to be specified in the target environment}}
   %0, %1 = tosa.fft2d %arg0, %arg1 {inverse = false} : (tensor<1x4x8xf32>, tensor<1x4x8xf32>) -> (tensor<1x4x8xf32>, tensor<1x4x8xf32>)
   return %0, %1 : tensor<1x4x8xf32>, tensor<1x4x8xf32>
 }
 
 // -----
 func.func @test_const_i4() -> tensor<3x11x11x3xi4> {
-  // expected-error at +1 {{'tosa.const' op illegal: requires [int4] but not enabled in target}}
+  // expected-error at +1 {{'tosa.const' op illegal: requires any of [int4] profiles/extensions to be specified in the target environment}}
   %0 = "tosa.const"() {values = dense<0> : tensor<3x11x11x3xi4>} : () -> tensor<3x11x11x3xi4>
   return %0 : tensor<3x11x11x3xi4>
 }
 
 // -----
 func.func @test_const_i48() -> tensor<3x11x11x3xi48> {
-  // expected-error at +1 {{'tosa.const' op illegal: requires [int16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.const' op illegal: requires any of [int16] profiles/extensions to be specified in the target environment}}
   %0 = "tosa.const"() {values = dense<0> : tensor<3x11x11x3xi48>} : () -> tensor<3x11x11x3xi48>
   return %0 : tensor<3x11x11x3xi48>
 }
@@ -311,18 +311,18 @@ func.func @test_const_i48() -> tensor<3x11x11x3xi48> {
 // -----
 // CHECK-LABEL: identity
 func.func @test_identity(%arg0: tensor<13x21x3xi4>) -> tensor<13x21x3xi4> {
-  // expected-error at +1 {{'tosa.identity' op illegal: requires [int4] but not enabled in target}}
+  // expected-error at +1 {{'tosa.identity' op illegal: requires any of [int4] profiles/extensions to be specified in the target environment}}
   %0 = tosa.identity %arg0 : (tensor<13x21x3xi4>) -> tensor<13x21x3xi4>
   return %0 : tensor<13x21x3xi4>
 }
 
 // -----
 module {
-  // expected-error at +1 {{'tosa.variable' op illegal: requires [variable] but not enabled in target}}
+  // expected-error at +1 {{'tosa.variable' op illegal: requires any of [variable] profiles/extensions to be specified in the target environment}}
   tosa.variable @stored_var = dense<-1> : tensor<2x4x8xi8>
 
   func.func @test_variable_read_type(%arg0: tensor<2x4x8xi8>) -> () {
-    // expected-error at +1 {{'tosa.variable_read' op illegal: requires [variable]}}
+    // expected-error at +1 {{'tosa.variable_read' op illegal: requires any of [variable] profiles/extensions to be specified in the target environment}}
     %0 = tosa.variable_read @stored_var : tensor<2x4x8xi8>
     return
   }
@@ -330,11 +330,11 @@ module {
 
 // -----
 module {
-  // expected-error at +1 {{'tosa.variable' op illegal: requires [variable] but not enabled in target}}
+  // expected-error at +1 {{'tosa.variable' op illegal: requires any of [variable] profiles/extensions to be specified in the target environment}}
   tosa.variable @stored_var = dense<-1> : tensor<2x4x8xi8>
 
   func.func @test_variable_write_type(%arg0: tensor<2x4x8xi8>) -> () {
-    // expected-error at +1 {{'tosa.variable_write' op illegal: requires [variable]}}
+    // expected-error at +1 {{'tosa.variable_write' op illegal: requires any of [variable] profiles/extensions to be specified in the target environment}}
     tosa.variable_write @stored_var, %arg0 : tensor<2x4x8xi8>
     return
   }
@@ -342,14 +342,14 @@ module {
 
 // -----
 func.func @test_cast_bf16_i32(%arg0: tensor<13x21x3xbf16>) -> tensor<13x21x3xi32> {
-  // expected-error at +1 {{'tosa.cast' op illegal: requires [bf16] but not enabled in target}}
+  // expected-error at +1 {{'tosa.cast' op illegal: requires any of [bf16] profiles/extensions to be specified in the target environment}}
   %0 = tosa.cast %arg0 : (tensor<13x21x3xbf16>) -> tensor<13x21x3xi32>
   return %0 : tensor<13x21x3xi32>
 }
 
 // -----
 func.func @test_cond_if(%arg0: tensor<f32>, %arg1: tensor<f32>, %arg2: tensor<i1>) -> tensor<f32> {
-  // expected-error at +1 {{'tosa.cond_if' op illegal: requires [controlflow]}}
+  // expected-error at +1 {{'tosa.cond_if' op illegal: requires [controlflow] but not enabled in target}}
   %0 = tosa.cond_if %arg2 : tensor<i1> -> tensor<f32> {
     %1 = tosa.add %arg0, %arg1 : (tensor<f32>, tensor<f32>) -> tensor<f32>
     tosa.yield %1 : tensor<f32>
@@ -363,7 +363,7 @@ func.func @test_cond_if(%arg0: tensor<f32>, %arg1: tensor<f32>, %arg2: tensor<i1
 // -----
 func.func @test_while_loop(%arg0: tensor<10xi32>, %arg1: tensor<i32>) {
   %0 = "tosa.const"() {values = dense<0> : tensor<i32>} : () -> tensor<i32>
-  // expected-error at +1 {{'tosa.while_loop' op illegal: requires [controlflow]}}
+  // expected-error at +1 {{'tosa.while_loop' op illegal: requires [controlflow] but not enabled in target}}
   %1:3 = tosa.while_loop (%arg2 = %0, %arg3 = %0, %arg4 = %arg0) : (tensor<i32>, tensor<i32>, tensor<10xi32>) -> (tensor<i32>, tensor<i32>, tensor<10xi32>) {
     %2 = tosa.greater_equal %arg3, %arg1 : (tensor<i32>, tensor<i32>) -> tensor<i1>
     %3 = tosa.logical_not %2 : (tensor<i1>) -> tensor<i1>
@@ -549,7 +549,7 @@ func.func @test_avg_pool2d_non_const_output_zp(%arg0: tensor<1x32x32x8xf32>, %ou
 // -----
 
 func.func @test_matmul_t_block_scaled(%arg0: tensor<4x8x32xf8E4M3FN>, %arg1: tensor<4x8x1xf8E8M0FNU>, %arg2: tensor<4x16x32xf8E4M3FN>, %arg3: tensor<4x16x1xf8E8M0FNU>) -> tensor<4x8x16xf32> {
-  // expected-error at +1 {{'tosa.matmul_t_block_scaled' op illegal: requires [mxfp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.matmul_t_block_scaled' op illegal: requires specification version compatible with 1.1 (got 1.0) and requires any of [mxfp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.matmul_t_block_scaled %arg0, %arg1, %arg2, %arg3 {block_size = #tosa.block_size<BLOCK_SIZE_32>} : (tensor<4x8x32xf8E4M3FN>, tensor<4x8x1xf8E8M0FNU>, tensor<4x16x32xf8E4M3FN>, tensor<4x16x1xf8E8M0FNU>) -> tensor<4x8x16xf32>
   return %0 : tensor<4x8x16xf32>
 }
@@ -557,14 +557,14 @@ func.func @test_matmul_t_block_scaled(%arg0: tensor<4x8x32xf8E4M3FN>, %arg1: ten
 // -----
 
 func.func @test_argmax_int64(%arg0: tensor<1x13x13x5xf32>) -> tensor<1x13x13xi64> {
-  // expected-error at +1 {{'tosa.argmax' op illegal: requires [int64] but not enabled in target}}
+  // expected-error at +1 {{'tosa.argmax' op illegal: requires specification version compatible with 1.1 (got 1.0) and requires any of [int64] profiles/extensions to be specified in the target environment}}
   %0 = tosa.argmax %arg0 {axis = 3 : i32} : (tensor<1x13x13x5xf32>) -> tensor<1x13x13xi64>
   return %0 : tensor<1x13x13xi64>
 }
 
 // -----
 func.func @test_const_fp6e3m2(%arg0 : index) -> tensor<4xf6E3M2FN> {
-  // expected-error at +1 {{'tosa.const' op illegal: requires [mxfp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.const' op illegal: requires specification version compatible with 1.1 (got 1.0) and requires any of [mxfp] profiles/extensions to be specified in the target environment}}
     %0 = "tosa.const"() {values = dense<[0.0, 0.0, 0.0, 0.0]> : tensor<4xf6E3M2FN>} : () -> tensor<4xf6E3M2FN>
     return %0 : tensor<4xf6E3M2FN>
 }
@@ -572,7 +572,7 @@ func.func @test_const_fp6e3m2(%arg0 : index) -> tensor<4xf6E3M2FN> {
 // -----
 
 func.func @test_cast_from_block_scaled(%arg0: tensor<4x32xf8E5M2>, %arg1: tensor<4x1xf8E8M0FNU>) -> tensor<4x32xf32> {
-  // expected-error at +1 {{'tosa.cast_from_block_scaled' op illegal: requires [mxfp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.cast_from_block_scaled' op illegal: requires specification version compatible with 1.1 (got 1.0) and requires any of [mxfp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.cast_from_block_scaled %arg0, %arg1 {block_size = #tosa.block_size<BLOCK_SIZE_32> : i32} : (tensor<4x32xf8E5M2>, tensor<4x1xf8E8M0FNU>) -> tensor<4x32xf32>
   return %0 : tensor<4x32xf32>
 }
@@ -580,7 +580,7 @@ func.func @test_cast_from_block_scaled(%arg0: tensor<4x32xf8E5M2>, %arg1: tensor
 // -----
 
 func.func @test_cast_to_block_scaled(%arg0: tensor<4x32xf32>) -> (tensor<4x32xf6E3M2FN>, tensor<4x1xf8E8M0FNU>) {
-  // expected-error at +1 {{'tosa.cast_to_block_scaled' op illegal: requires [mxfp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.cast_to_block_scaled' op illegal: requires specification version compatible with 1.1 (got 1.0) and requires any of [mxfp] profiles/extensions to be specified in the target environment}}
   %0:2 = tosa.cast_to_block_scaled %arg0 {block_size = #tosa.block_size<BLOCK_SIZE_32>} : (tensor<4x32xf32>) -> (tensor<4x32xf6E3M2FN>, tensor<4x1xf8E8M0FNU>)
   return %0#0, %0#1 : tensor<4x32xf6E3M2FN>, tensor<4x1xf8E8M0FNU>
 }
@@ -621,7 +621,7 @@ func.func @test_conv2d_block_scaled(%arg0: tensor<*xf4E2M1FN>, %arg1: tensor<*xf
   %0 = tosa.const_shape {values = dense<[0, 0, 0, 0]> : tensor<4xindex>} : () -> !tosa.shape<4>
   %1 = tosa.const_shape {values = dense<[1, 1]> : tensor<2xindex>} : () -> !tosa.shape<2>
   %2 = tosa.const_shape {values = dense<[1, 1]> : tensor<2xindex>} : () -> !tosa.shape<2>
-  // expected-error at +1 {{'tosa.conv2d_block_scaled' op illegal: requires [mxfp_conv] but not enabled in target}}
+  // expected-error at +1 {{'tosa.conv2d_block_scaled' op illegal: requires specification version compatible with 1.1 (got 1.0) and requires any of [mxfp_conv] profiles/extensions to be specified in the target environment}}
   %3 = tosa.conv2d_block_scaled %arg0, %arg1, %arg2, %arg3, %arg4, %0, %1, %2 {block_size = BLOCK_SIZE_32} : (tensor<*xf4E2M1FN>, tensor<*xf8E8M0FNU>, tensor<*xf4E2M1FN>, tensor<*xf8E8M0FNU>, tensor<*xf32>, !tosa.shape<4>, !tosa.shape<2>, !tosa.shape<2>) -> tensor<*xf32>
   return %3 : tensor<*xf32>
 }
diff --git a/mlir/test/Dialect/Tosa/profile_all_unsupported.mlir b/mlir/test/Dialect/Tosa/profile_all_unsupported.mlir
index 8e56c9c54446b..f9011766c885d 100644
--- a/mlir/test/Dialect/Tosa/profile_all_unsupported.mlir
+++ b/mlir/test/Dialect/Tosa/profile_all_unsupported.mlir
@@ -6,181 +6,181 @@
 
 // -----
 func.func @test_add_i32(%arg0: tensor<13x21x1xi32>, %arg1: tensor<13x21x3xi32>) -> tensor<13x21x3xi32> {
-  // expected-error at +1 {{'tosa.add' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.add' op illegal: requires any of [pro_int, pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.add %arg0, %arg1 : (tensor<13x21x1xi32>, tensor<13x21x3xi32>) -> tensor<13x21x3xi32>
   return %0 : tensor<13x21x3xi32>
 }
 
 // -----
 func.func @test_intdiv(%arg0: tensor<13x21x1xi32>, %arg1: tensor<13x21x3xi32>) -> tensor<13x21x3xi32> {
-  // expected-error at +1 {{'tosa.intdiv' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.intdiv' op illegal: requires any of [pro_int, pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.intdiv %arg0, %arg1 : (tensor<13x21x1xi32>, tensor<13x21x3xi32>) -> tensor<13x21x3xi32>
   return %0 : tensor<13x21x3xi32>
 }
 
 // -----
 func.func @test_logical_and(%arg0: tensor<13x21x3xi1>, %arg1: tensor<13x21x1xi1>) -> tensor<13x21x3xi1> {
-  // expected-error at +1 {{'tosa.logical_and' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.logical_and' op illegal: requires any of [pro_int, pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.logical_and %arg0, %arg1 : (tensor<13x21x3xi1>, tensor<13x21x1xi1>) -> tensor<13x21x3xi1>
   return %0 : tensor<13x21x3xi1>
 }
 
 // -----
 func.func @test_logical_left_shift(%arg0: tensor<13x21x3xi32>, %arg1: tensor<13x21x1xi32>) -> tensor<13x21x3xi32> {
-  // expected-error at +1 {{'tosa.logical_left_shift' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.logical_left_shift' op illegal: requires any of [pro_int, pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.logical_left_shift %arg0, %arg1 : (tensor<13x21x3xi32>, tensor<13x21x1xi32>) -> tensor<13x21x3xi32>
   return %0 : tensor<13x21x3xi32>
 }
 
 // -----
 func.func @test_mul(%arg0: tensor<13x21x3xi32>, %arg1: tensor<13x1x3xi32>, %shift: tensor<1xi8>) -> tensor<13x21x3xi32> {
-  // expected-error at +1 {{'tosa.mul' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.mul' op illegal: requires any of [pro_int, pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.mul %arg0, %arg1, %shift : (tensor<13x21x3xi32>, tensor<13x1x3xi32>, tensor<1xi8>) -> tensor<13x21x3xi32>
   return %0 : tensor<13x21x3xi32>
 }
 
 // -----
 func.func @test_sub(%arg0: tensor<1x21x3xi32>, %arg1: tensor<13x21x3xi32>) -> tensor<13x21x3xi32> {
-  // expected-error at +1 {{'tosa.sub' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.sub' op illegal: requires any of [pro_int, pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.sub %arg0, %arg1 : (tensor<1x21x3xi32>, tensor<13x21x3xi32>) -> tensor<13x21x3xi32>
   return %0 : tensor<13x21x3xi32>
 }
 
 // -----
 func.func @test_logical_not(%arg0: tensor<1x21x3xi1>) -> tensor<1x21x3xi1> {
-  // expected-error at +1 {{'tosa.logical_not' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.logical_not' op illegal: requires any of [pro_int, pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.logical_not %arg0 : (tensor<1x21x3xi1>) -> tensor<1x21x3xi1>
   return %0 : tensor<1x21x3xi1>
 }
 
 // -----
 func.func @test_select(%arg0: tensor<1x1x1xi1>, %arg1: tensor<13x21x3xi1>, %arg2: tensor<13x21x3xi1>) -> tensor<13x21x3xi1> {
-  // expected-error at +1 {{'tosa.select' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.select' op illegal: requires any of [pro_int, pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.select %arg0, %arg1, %arg2 : (tensor<1x1x1xi1>, tensor<13x21x3xi1>, tensor<13x21x3xi1>) -> tensor<13x21x3xi1>
   return %0 : tensor<13x21x3xi1>
 }
 
 // -----
 func.func @test_table(%arg0 : tensor<4x5xi8>, %arg1 : tensor<513xi8>) -> () {
-  // expected-error at +1 {{'tosa.table' op illegal: requires [pro_int] but not enabled in target}}
+  // expected-error at +1 {{'tosa.table' op illegal: requires any of [pro_int] profiles/extensions to be specified in the target environment}}
   %0 = tosa.table %arg0, %arg1 : (tensor<4x5xi8>, tensor<513xi8>) -> tensor<?x?xi8>
   return
 }
 
 // -----
 func.func @test_conv2d(%arg0: tensor<1x4x4x4xf32>, %arg1: tensor<8x1x1x4xf32>, %arg2: tensor<8xf32>, %arg3: tensor<1xf32>) -> tensor<1x4x4x8xf32> {
-  // expected-error at +1 {{'tosa.conv2d' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.conv2d' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.conv2d %arg0, %arg1, %arg2, %arg3, %arg3 {acc_type = f32, dilation = array<i64: 1, 1>, pad = array<i64: 0, 0, 0, 0>, stride = array<i64: 1, 1>, local_bound = true} : (tensor<1x4x4x4xf32>, tensor<8x1x1x4xf32>, tensor<8xf32>, tensor<1xf32>, tensor<1xf32>) -> tensor<1x4x4x8xf32>
   return %0 : tensor<1x4x4x8xf32>
 }
 
 // -----
 func.func @test_avg_pool2d(%arg0: tensor<1x7x7x9xf32>, %arg1: tensor<1xf32>, %arg2: tensor<1xf32>) -> tensor<1x7x7x9xf32> {
-  // expected-error at +1 {{'tosa.avg_pool2d' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.avg_pool2d' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.avg_pool2d %arg0, %arg1, %arg2 {acc_type = f32, kernel = array<i64: 2, 2>, pad = array<i64: 0, 1, 0, 1>, stride = array<i64: 1, 1>} : (tensor<1x7x7x9xf32>, tensor<1xf32>, tensor<1xf32>) -> tensor<1x7x7x9xf32>
   return %0 : tensor<1x7x7x9xf32>
 }
 
 // -----
 func.func @test_matmul(%arg0: tensor<1x14x19xf32>, %arg1: tensor<1x19x28xf32>, %arg2: tensor<1xf32>) -> tensor<1x14x28xf32> {
-  // expected-error at +1 {{'tosa.matmul' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.matmul' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.matmul %arg0, %arg1, %arg2, %arg2: (tensor<1x14x19xf32>, tensor<1x19x28xf32>, tensor<1xf32>, tensor<1xf32>) -> tensor<1x14x28xf32>
   return %0 : tensor<1x14x28xf32>
 }
 
 // -----
 func.func @test_sigmoid(%arg0: tensor<13x21x3xf32>) -> tensor<13x21x3xf32> {
-  // expected-error at +1 {{'tosa.sigmoid' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.sigmoid' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.sigmoid %arg0 : (tensor<13x21x3xf32>) -> tensor<13x21x3xf32>
   return %0 : tensor<13x21x3xf32>
 }
 
 // -----
 func.func @test_transpose_conv2d(%arg0: tensor<1x32x32x8xf32>, %arg1: tensor<16x1x1x8xf32>, %arg2: tensor<16xf32>, %arg3: tensor<1xf32>, %arg4: tensor<1xf32>) -> tensor<1x32x32x16xf32> {
-  // expected-error at +1 {{'tosa.transpose_conv2d' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.transpose_conv2d' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.transpose_conv2d %arg0, %arg1, %arg2, %arg3, %arg4 {acc_type = f32, out_pad = array<i64: 0, 0, 0, 0>, out_shape = array<i64: 1, 32, 32, 16>, stride = array<i64: 1, 1>} : (tensor<1x32x32x8xf32>, tensor<16x1x1x8xf32>, tensor<16xf32>, tensor<1xf32>, tensor<1xf32>) -> tensor<1x32x32x16xf32>
   return %0 : tensor<1x32x32x16xf32>
 }
 
 // -----
 func.func @test_add(%arg0: tensor<13x21x1xf32>, %arg1: tensor<13x21x3xf32>) -> tensor<13x21x3xf32> {
-  // expected-error at +1 {{'tosa.add' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.add' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.add %arg0, %arg1 : (tensor<13x21x1xf32>, tensor<13x21x3xf32>) -> tensor<13x21x3xf32>
   return %0 : tensor<13x21x3xf32>
 }
 
 // -----
 func.func @test_add_i32(%arg0: tensor<13x21x1xi32>, %arg1: tensor<13x21x3xi32>) -> tensor<13x21x3xi32> {
-  // expected-error at +1 {{'tosa.add' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.add' op illegal: requires any of [pro_int, pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.add %arg0, %arg1 : (tensor<13x21x1xi32>, tensor<13x21x3xi32>) -> tensor<13x21x3xi32>
   return %0 : tensor<13x21x3xi32>
 }
 
 // -----
 func.func @test_intdiv(%arg0: tensor<13x21x1xi32>, %arg1: tensor<13x21x3xi32>) -> tensor<13x21x3xi32> {
-  // expected-error at +1 {{'tosa.intdiv' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.intdiv' op illegal: requires any of [pro_int, pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.intdiv %arg0, %arg1 : (tensor<13x21x1xi32>, tensor<13x21x3xi32>) -> tensor<13x21x3xi32>
   return %0 : tensor<13x21x3xi32>
 }
 
 // -----
 func.func @test_logical_and(%arg0: tensor<13x21x3xi1>, %arg1: tensor<13x21x1xi1>) -> tensor<13x21x3xi1> {
-  // expected-error at +1 {{'tosa.logical_and' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.logical_and' op illegal: requires any of [pro_int, pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.logical_and %arg0, %arg1 : (tensor<13x21x3xi1>, tensor<13x21x1xi1>) -> tensor<13x21x3xi1>
   return %0 : tensor<13x21x3xi1>
 }
 
 // -----
 func.func @test_logical_left_shift(%arg0: tensor<13x21x3xi32>, %arg1: tensor<13x21x1xi32>) -> tensor<13x21x3xi32> {
-  // expected-error at +1 {{'tosa.logical_left_shift' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.logical_left_shift' op illegal: requires any of [pro_int, pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.logical_left_shift %arg0, %arg1 : (tensor<13x21x3xi32>, tensor<13x21x1xi32>) -> tensor<13x21x3xi32>
   return %0 : tensor<13x21x3xi32>
 }
 
 // -----
 func.func @test_mul(%arg0: tensor<13x21x3xi32>, %arg1: tensor<13x1x3xi32>, %shift: tensor<1xi8>) -> tensor<13x21x3xi32> {
-  // expected-error at +1 {{'tosa.mul' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.mul' op illegal: requires any of [pro_int, pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.mul %arg0, %arg1, %shift : (tensor<13x21x3xi32>, tensor<13x1x3xi32>, tensor<1xi8>) -> tensor<13x21x3xi32>
   return %0 : tensor<13x21x3xi32>
 }
 
 // -----
 func.func @test_sub(%arg0: tensor<1x21x3xi32>, %arg1: tensor<13x21x3xi32>) -> tensor<13x21x3xi32> {
-  // expected-error at +1 {{'tosa.sub' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.sub' op illegal: requires any of [pro_int, pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.sub %arg0, %arg1 : (tensor<1x21x3xi32>, tensor<13x21x3xi32>) -> tensor<13x21x3xi32>
   return %0 : tensor<13x21x3xi32>
 }
 
 // -----
 func.func @test_logical_not(%arg0: tensor<1x21x3xi1>) -> tensor<1x21x3xi1> {
-  // expected-error at +1 {{'tosa.logical_not' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.logical_not' op illegal: requires any of [pro_int, pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.logical_not %arg0 : (tensor<1x21x3xi1>) -> tensor<1x21x3xi1>
   return %0 : tensor<1x21x3xi1>
 }
 
 // -----
 func.func @test_select(%arg0: tensor<1x1x1xi1>, %arg1: tensor<13x21x3xi1>, %arg2: tensor<13x21x3xi1>) -> tensor<13x21x3xi1> {
-  // expected-error at +1 {{'tosa.select' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.select' op illegal: requires any of [pro_int, pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.select %arg0, %arg1, %arg2 : (tensor<1x1x1xi1>, tensor<13x21x3xi1>, tensor<13x21x3xi1>) -> tensor<13x21x3xi1>
   return %0 : tensor<13x21x3xi1>
 }
 // -----
 func.func @test_reduce_all(%arg0: tensor<13x21x3xi1>) -> tensor<1x21x3xi1> {
-  // expected-error at +1 {{'tosa.reduce_all' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.reduce_all' op illegal: requires any of [pro_int, pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.reduce_all %arg0 {axis = 0 : i32} : (tensor<13x21x3xi1>) -> tensor<1x21x3xi1>
   return %0 : tensor<1x21x3xi1>
 }
 
 // -----
 func.func @test_reduce_any(%arg0: tensor<13x21x3xi1>) -> tensor<1x21x3xi1> {
-  // expected-error at +1 {{'tosa.reduce_any' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.reduce_any' op illegal: requires any of [pro_int, pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.reduce_any %arg0 {axis = 0 : i32} : (tensor<13x21x3xi1>) -> tensor<1x21x3xi1>
   return %0 : tensor<1x21x3xi1>
 }
 
 // -----
 func.func @test_concat(%arg0: tensor<13x21x3xi1>, %arg1: tensor<13x21x3xi1>) -> tensor<26x21x3xi1> {
-  // expected-error at +1 {{'tosa.concat' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.concat' op illegal: requires any of [pro_int, pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.concat %arg0, %arg1 {axis = 0 : i32} : (tensor<13x21x3xi1>, tensor<13x21x3xi1>) -> tensor<26x21x3xi1>
   return %0 : tensor<26x21x3xi1>
 }
@@ -189,9 +189,9 @@ func.func @test_concat(%arg0: tensor<13x21x3xi1>, %arg1: tensor<13x21x3xi1>) ->
 func.func @test_pad(%arg0: tensor<13x21x3xi1>) -> tensor<13x21x3xi1> {
   // expected-error at +1 {{'tosa.const_shape' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
   %padding = tosa.const_shape {values = dense<0> : tensor<6xindex>} : () -> !tosa.shape<6>
-  // expected-error at +1 {{'tosa.const' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.const' op illegal: requires any of [pro_int, pro_fp] profiles/extensions to be specified in the target environment}}
   %pad_const = "tosa.const"() {values = dense<1> : tensor<1xi1>} : () -> tensor<1xi1>
-  // expected-error at +1 {{'tosa.pad' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.pad' op illegal: requires any of [pro_int, pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.pad %arg0, %padding, %pad_const : (tensor<13x21x3xi1>, !tosa.shape<6>, tensor<1xi1>) -> tensor<13x21x3xi1>
   return %0 : tensor<13x21x3xi1>
 }
@@ -200,14 +200,14 @@ func.func @test_pad(%arg0: tensor<13x21x3xi1>) -> tensor<13x21x3xi1> {
 func.func @test_reshape(%arg0: tensor<13x21x3xi1>) -> tensor<1x819xi1> {
   // expected-error at +1 {{'tosa.const_shape' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
   %1 = tosa.const_shape {values = dense<[1, 819]> : tensor<2xindex>} : () -> !tosa.shape<2>
-  // expected-error at +1 {{'tosa.reshape' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.reshape' op illegal: requires any of [pro_int, pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.reshape %arg0, %1 : (tensor<13x21x3xi1>, !tosa.shape<2>) -> tensor<1x819xi1>
   return %0 : tensor<1x819xi1>
 }
 
 // -----
 func.func @test_reverse(%arg0: tensor<13x21x3xi1>) -> tensor<13x21x3xi1> {
-  // expected-error at +1 {{'tosa.reverse' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.reverse' op illegal: requires any of [pro_int, pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.reverse %arg0 {axis = 0 : i32} : (tensor<13x21x3xi1>) -> tensor<13x21x3xi1>
   return %0 : tensor<13x21x3xi1>
 }
@@ -218,7 +218,7 @@ func.func @test_slice(%arg0: tensor<13x21x3xi1>) -> tensor<4x11x1xi1> {
   %size = tosa.const_shape {values = dense<[4, 11, 1]> : tensor<3xindex>} : () -> !tosa.shape<3>
   // expected-error at +1 {{'tosa.const_shape' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
   %start = tosa.const_shape {values = dense<[6, 8, 0]> : tensor<3xindex>} : () -> !tosa.shape<3>
-  // expected-error at +1 {{'tosa.slice' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.slice' op illegal: requires any of [pro_int, pro_fp] profiles/extensions to be specified in the target environment}}
   %2 = tosa.slice %arg0, %start, %size : (tensor<13x21x3xi1>, !tosa.shape<3>, !tosa.shape<3>) -> tensor<4x11x1xi1>
   return %2 : tensor<4x11x1xi1>
 }
@@ -227,28 +227,28 @@ func.func @test_slice(%arg0: tensor<13x21x3xi1>) -> tensor<4x11x1xi1> {
 func.func @test_tile(%arg0: tensor<13x21x3xi1>) -> tensor<39x21x6xi1> {
   // expected-error at +1 {{'tosa.const_shape' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
   %cst = tosa.const_shape { values = dense<[3, 1, 2]> : tensor<3xindex> } : () -> !tosa.shape<3>
-  // expected-error at +1 {{'tosa.tile' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.tile' op illegal: requires any of [pro_int, pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.tile %arg0, %cst: (tensor<13x21x3xi1>, !tosa.shape<3>) -> tensor<39x21x6xi1>
   return %0 : tensor<39x21x6xi1>
 }
 
 // -----
 func.func @test_transpose(%arg0: tensor<13x21x3xi1>) -> tensor<3x13x21xi1> {
-  // expected-error at +1 {{'tosa.transpose' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.transpose' op illegal: requires any of [pro_int, pro_fp] profiles/extensions to be specified in the target environment}}
   %1 = tosa.transpose %arg0 {perms = array<i32: 2, 0, 1>} : (tensor<13x21x3xi1>) -> tensor<3x13x21xi1>
   return %1 : tensor<3x13x21xi1>
 }
 
 // -----
 func.func @test_concat(%arg0: tensor<13x21x3xf32>, %arg1: tensor<13x21x3xf32>) -> tensor<26x21x3xf32> {
-  // expected-error at +1 {{'tosa.concat' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.concat' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.concat %arg0, %arg1 {axis = 0 : i32} : (tensor<13x21x3xf32>, tensor<13x21x3xf32>) -> tensor<26x21x3xf32>
   return %0 : tensor<26x21x3xf32>
 }
 
 // -----
 func.func @test_concat(%arg0: tensor<13x21x3xi1>, %arg1: tensor<13x21x3xi1>) -> tensor<26x21x3xi1> {
-  // expected-error at +1 {{'tosa.concat' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.concat' op illegal: requires any of [pro_int, pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.concat %arg0, %arg1 {axis = 0 : i32} : (tensor<13x21x3xi1>, tensor<13x21x3xi1>) -> tensor<26x21x3xi1>
   return %0 : tensor<26x21x3xi1>
 }
@@ -257,9 +257,9 @@ func.func @test_concat(%arg0: tensor<13x21x3xi1>, %arg1: tensor<13x21x3xi1>) ->
 func.func @test_pad(%arg0: tensor<13x21x3xi1>) -> tensor<13x21x3xi1> {
   // expected-error at +1 {{'tosa.const_shape' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
   %padding = tosa.const_shape {values = dense<0> : tensor<6xindex>} : () -> !tosa.shape<6>
-  // expected-error at +1 {{'tosa.const' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.const' op illegal: requires any of [pro_int, pro_fp] profiles/extensions to be specified in the target environment}}
   %pad_const = "tosa.const"() {values = dense<1> : tensor<1xi1>} : () -> tensor<1xi1>
-  // expected-error at +1 {{'tosa.pad' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.pad' op illegal: requires any of [pro_int, pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.pad %arg0, %padding, %pad_const : (tensor<13x21x3xi1>, !tosa.shape<6>, tensor<1xi1>) -> tensor<13x21x3xi1>
   return %0 : tensor<13x21x3xi1>
 }
@@ -268,14 +268,14 @@ func.func @test_pad(%arg0: tensor<13x21x3xi1>) -> tensor<13x21x3xi1> {
 func.func @test_reshape(%arg0: tensor<13x21x3xi1>) -> tensor<1x819xi1> {
   // expected-error at +1 {{'tosa.const_shape' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
   %1 = tosa.const_shape {values = dense<[1, 819]> : tensor<2xindex>} : () -> !tosa.shape<2>
-  // expected-error at +1 {{'tosa.reshape' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.reshape' op illegal: requires any of [pro_int, pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.reshape %arg0, %1 : (tensor<13x21x3xi1>, !tosa.shape<2>) -> tensor<1x819xi1>
   return %0 : tensor<1x819xi1>
 }
 
 // -----
 func.func @test_reverse(%arg0: tensor<13x21x3xi1>) -> tensor<13x21x3xi1> {
-  // expected-error at +1 {{'tosa.reverse' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.reverse' op illegal: requires any of [pro_int, pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.reverse %arg0 {axis = 0 : i32} : (tensor<13x21x3xi1>) -> tensor<13x21x3xi1>
   return %0 : tensor<13x21x3xi1>
 }
@@ -286,7 +286,7 @@ func.func @test_slice(%arg0: tensor<13x21x3xi1>) -> tensor<4x11x1xi1> {
   %size = tosa.const_shape {values = dense<[4, 11, 1]> : tensor<3xindex>} : () -> !tosa.shape<3>
   // expected-error at +1 {{'tosa.const_shape' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
   %start = tosa.const_shape {values = dense<[6, 8, 0]> : tensor<3xindex>} : () -> !tosa.shape<3>
-  // expected-error at +1 {{'tosa.slice' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.slice' op illegal: requires any of [pro_int, pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.slice %arg0, %start, %size : (tensor<13x21x3xi1>, !tosa.shape<3>, !tosa.shape<3>) -> tensor<4x11x1xi1>
   return %0 : tensor<4x11x1xi1>
 }
@@ -295,20 +295,20 @@ func.func @test_slice(%arg0: tensor<13x21x3xi1>) -> tensor<4x11x1xi1> {
 func.func @test_tile(%arg0: tensor<13x21x3xi1>) -> tensor<39x21x6xi1> {
   // expected-error at +1 {{'tosa.const_shape' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
   %cst = tosa.const_shape { values = dense<[3, 1, 2]> : tensor<3xindex> } : () -> !tosa.shape<3>
-  // expected-error at +1 {{'tosa.tile' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.tile' op illegal: requires any of [pro_int, pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.tile %arg0, %cst: (tensor<13x21x3xi1>, !tosa.shape<3>) -> tensor<39x21x6xi1>
   return %0 : tensor<39x21x6xi1>
 }
 
 // -----
 func.func @test_transpose(%arg0: tensor<13x21x3xi1>) -> tensor<3x13x21xi1> {
-  // expected-error at +1 {{'tosa.transpose' op illegal: requires any of [pro_int, pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.transpose' op illegal: requires any of [pro_int, pro_fp] profiles/extensions to be specified in the target environment}}
   %1 = tosa.transpose %arg0 {perms = array<i32: 2, 0, 1>} : (tensor<13x21x3xi1>) -> tensor<3x13x21xi1>
   return %1 : tensor<3x13x21xi1>
 }
 // -----
 func.func @test_cast_i32_f32(%arg0: tensor<13x21x3xi32>) -> tensor<13x21x3xf32> {
-  // expected-error at +1 {{'tosa.cast' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.cast' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.cast %arg0 : (tensor<13x21x3xi32>) -> tensor<13x21x3xf32>
   return %0 : tensor<13x21x3xf32>
 }
@@ -319,4 +319,3 @@ func.func @test_custom(%arg0: tensor<10xi32>) -> tensor<10xi32> {
   %0 = tosa.custom %arg0 {operator_name="custom_test", domain_name="tosa.mlir_test", implementation_attrs="" } : (tensor<10xi32>) -> (tensor<10xi32>)
   return %0 : tensor<10xi32>
 }
-
diff --git a/mlir/test/Dialect/Tosa/profile_pro_fp_unsupported.mlir b/mlir/test/Dialect/Tosa/profile_pro_fp_unsupported.mlir
index fb0ce19dfc5b0..17095a309bb66 100644
--- a/mlir/test/Dialect/Tosa/profile_pro_fp_unsupported.mlir
+++ b/mlir/test/Dialect/Tosa/profile_pro_fp_unsupported.mlir
@@ -6,249 +6,249 @@
 
 // -----
 func.func @test_const_f16() -> tensor<3x11x11x3xf16> {
-  // expected-error at +1 {{'tosa.const' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.const' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = "tosa.const"() {values = dense<2.0> : tensor<3x11x11x3xf16>} : () -> tensor<3x11x11x3xf16>
   return %0 : tensor<3x11x11x3xf16>
 }
 
 // -----
 func.func @test_const_f32() -> tensor<3x11x11x3xf32> {
-  // expected-error at +1 {{'tosa.const' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.const' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = "tosa.const"() {values = dense<3.0> : tensor<3x11x11x3xf32>} : () -> tensor<3x11x11x3xf32>
   return %0 : tensor<3x11x11x3xf32>
 }
 
 // -----
 func.func @test_avg_pool2d(%arg0: tensor<1x7x7x9xf32>, %arg1: tensor<1xf32>, %arg2: tensor<1xf32>) -> tensor<1x7x7x9xf32> {
-  // expected-error at +1 {{'tosa.avg_pool2d' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.avg_pool2d' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.avg_pool2d %arg0, %arg1, %arg2 {acc_type = f32, kernel = array<i64: 2, 2>, pad = array<i64: 0, 1, 0, 1>, stride = array<i64: 1, 1>} : (tensor<1x7x7x9xf32>, tensor<1xf32>, tensor<1xf32>) -> tensor<1x7x7x9xf32>
   return %0 : tensor<1x7x7x9xf32>
 }
 
 // -----
 func.func @test_conv2d(%arg0: tensor<1x4x4x4xf32>, %arg1: tensor<8x1x1x4xf32>, %arg2: tensor<8xf32>, %arg3: tensor<1xf32>, %arg4: tensor<1xf32>) -> tensor<1x4x4x8xf32> {
-  // expected-error at +1 {{'tosa.conv2d' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.conv2d' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.conv2d %arg0, %arg1, %arg2, %arg3, %arg4 {acc_type = f32, dilation = array<i64: 1, 1>, pad = array<i64: 0, 0, 0, 0>, stride = array<i64: 1, 1>, local_bound = true} : (tensor<1x4x4x4xf32>, tensor<8x1x1x4xf32>, tensor<8xf32>, tensor<1xf32>, tensor<1xf32>) -> tensor<1x4x4x8xf32>
   return %0 : tensor<1x4x4x8xf32>
 }
 
 // -----
 func.func @test_conv3d(%arg0: tensor<1x4x8x21x17xf16>, %arg1: tensor<34x1x1x1x17xf16>, %arg2: tensor<34xf16>, %arg3: tensor<1xf16>, %arg4: tensor<1xf16>) -> tensor<1x4x8x21x34xf16> {
-  // expected-error at +1 {{'tosa.conv3d' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.conv3d' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.conv3d %arg0, %arg1, %arg2, %arg3, %arg4 {acc_type = f32, dilation = array<i64: 1, 1, 1>, pad = array<i64: 0, 0, 0, 0, 0, 0>, stride = array<i64: 1, 1, 1>} : (tensor<1x4x8x21x17xf16>, tensor<34x1x1x1x17xf16>, tensor<34xf16>, tensor<1xf16>, tensor<1xf16>) -> tensor<1x4x8x21x34xf16>
   return %0 : tensor<1x4x8x21x34xf16>
 }
 
 // -----
 func.func @test_depthwise_conv2d(%arg0: tensor<1x4x4x4xf16>, %arg1: tensor<1x1x4x2xf16>, %arg2: tensor<8xf16>, %arg3: tensor<1xf16>, %arg4: tensor<1xf16>) -> tensor<1x4x4x8xf16> {
-  // expected-error at +1 {{'tosa.depthwise_conv2d' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.depthwise_conv2d' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.depthwise_conv2d %arg0, %arg1, %arg2, %arg3, %arg4 {acc_type = f16, dilation = array<i64: 1, 1>, pad = array<i64: 0, 0, 0, 0>, stride = array<i64: 1, 1>} : (tensor<1x4x4x4xf16>, tensor<1x1x4x2xf16>, tensor<8xf16>, tensor<1xf16>, tensor<1xf16>) -> tensor<1x4x4x8xf16>
   return %0 : tensor<1x4x4x8xf16>
 }
 
 // -----
 func.func @test_matmul(%arg0: tensor<1x14x19xf32>, %arg1: tensor<1x19x28xf32>) -> tensor<1x14x28xf32> {
-  // expected-error at +1 {{'tosa.const' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.const' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %azp0 = "tosa.const"() <{values = dense<0.0> : tensor<1xf32>}> : () -> tensor<1xf32>
-  // expected-error at +1 {{'tosa.const' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.const' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %bzp0 = "tosa.const"() <{values = dense<0.0> : tensor<1xf32>}> : () -> tensor<1xf32>
-  // expected-error at +1 {{'tosa.matmul' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.matmul' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.matmul %arg0, %arg1, %azp0, %bzp0 : (tensor<1x14x19xf32>, tensor<1x19x28xf32>, tensor<1xf32>, tensor<1xf32>)  -> tensor<1x14x28xf32>
   return %0 : tensor<1x14x28xf32>
 }
 
 // -----
 func.func @test_sigmoid(%arg0: tensor<13x21x3xf32>) -> tensor<13x21x3xf32> {
-  // expected-error at +1 {{'tosa.sigmoid' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.sigmoid' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.sigmoid %arg0 : (tensor<13x21x3xf32>) -> tensor<13x21x3xf32>
   return %0 : tensor<13x21x3xf32>
 }
 
 // -----
 func.func @test_transpose_conv2d(%arg0: tensor<1x32x32x8xf32>, %arg1: tensor<16x1x1x8xf32>, %arg2: tensor<16xf32>, %arg3: tensor<1xf32>, %arg4: tensor<1xf32>) -> tensor<1x32x32x16xf32> {
-  // expected-error at +1 {{'tosa.transpose_conv2d' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.transpose_conv2d' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.transpose_conv2d %arg0, %arg1, %arg2, %arg3, %arg4 {acc_type = f32, out_pad = array<i64: 0, 0, 0, 0>, out_shape = array<i64: 1, 32, 32, 16>, stride = array<i64: 1, 1>} : (tensor<1x32x32x8xf32>, tensor<16x1x1x8xf32>, tensor<16xf32>, tensor<1xf32>, tensor<1xf32>) -> tensor<1x32x32x16xf32>
   return %0 : tensor<1x32x32x16xf32>
 }
 
 // -----
 func.func @test_max_pool2d(%arg0: tensor<1x32x32x8xf32>) -> tensor<1x32x32x8xf32> {
-  // expected-error at +1 {{'tosa.max_pool2d' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.max_pool2d' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.max_pool2d %arg0 {kernel = array<i64: 1, 1>, pad = array<i64: 0, 0, 0, 0>, stride = array<i64: 1, 1>} : (tensor<1x32x32x8xf32>) -> tensor<1x32x32x8xf32>
   return %0 : tensor<1x32x32x8xf32>
 }
 
 // -----
 func.func @test_transpose_conv2d(%arg0: tensor<1x32x32x8xf16>, %arg1: tensor<16x1x1x8xf16>, %arg2: tensor<16xf16>, %arg3: tensor<1xf16>, %arg4: tensor<1xf16>) -> tensor<1x32x32x16xf16> {
-  // expected-error at +1 {{'tosa.transpose_conv2d' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.transpose_conv2d' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.transpose_conv2d %arg0, %arg1, %arg2, %arg3, %arg4 {acc_type = f16, out_pad = array<i64: 0, 0, 0, 0>, stride = array<i64: 1, 1>} : (tensor<1x32x32x8xf16>, tensor<16x1x1x8xf16>, tensor<16xf16>, tensor<1xf16>, tensor<1xf16>) -> tensor<1x32x32x16xf16>
   return %0 : tensor<1x32x32x16xf16>
 }
 
 // -----
 func.func @test_clamp(%arg0: tensor<13x21x3xf32>) -> tensor<13x21x3xf32> {
-  // expected-error at +1 {{'tosa.clamp' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.clamp' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.clamp %arg0 {min_val = 0.0 : f32, max_val = 1.0 : f32} : (tensor<13x21x3xf32>) -> tensor<13x21x3xf32>
   return %0 : tensor<13x21x3xf32>
 }
 
 // -----
 func.func @test_add(%arg0: tensor<13x21x1xf32>, %arg1: tensor<13x21x3xf32>) -> tensor<13x21x3xf32> {
-  // expected-error at +1 {{'tosa.add' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.add' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.add %arg0, %arg1 : (tensor<13x21x1xf32>, tensor<13x21x3xf32>) -> tensor<13x21x3xf32>
   return %0 : tensor<13x21x3xf32>
 }
 
 // -----
 func.func @test_concat(%arg0: tensor<13x21x3xf32>, %arg1: tensor<13x21x3xf32>) -> tensor<26x21x3xf32> {
-  // expected-error at +1 {{'tosa.concat' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.concat' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.concat %arg0, %arg1 {axis = 0 : i32} : (tensor<13x21x3xf32>, tensor<13x21x3xf32>) -> tensor<26x21x3xf32>
   return %0 : tensor<26x21x3xf32>
 }
 
 // -----
 func.func @test_cast_i32_f32(%arg0: tensor<13x21x3xi32>) -> tensor<13x21x3xf32> {
-  // expected-error at +1 {{'tosa.cast' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.cast' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.cast %arg0 : (tensor<13x21x3xi32>) -> tensor<13x21x3xf32>
   return %0 : tensor<13x21x3xf32>
 }
 
 // -----
 func.func @test_max(%arg0: tensor<13x21x3xf32>, %arg1: tensor<13x21x1xf32>) -> tensor<13x21x3xf32> {
-  // expected-error at +1 {{'tosa.maximum' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.maximum' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.maximum %arg0, %arg1 : (tensor<13x21x3xf32>, tensor<13x21x1xf32>) -> tensor<13x21x3xf32>
   return %0 : tensor<13x21x3xf32>
 }
 
 // -----
 func.func @test_mul(%arg0: tensor<13x21x3xf32>, %arg1: tensor<13x1x3xf32>, %shift: tensor<1xi8>) -> tensor<13x21x3xf32> {
-  // expected-error at +1 {{'tosa.mul' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.mul' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.mul %arg0, %arg1, %shift : (tensor<13x21x3xf32>, tensor<13x1x3xf32>, tensor<1xi8>) -> tensor<13x21x3xf32>
   return %0 : tensor<13x21x3xf32>
 }
 
 // -----
 func.func @test_pow(%arg0: tensor<13x21x3xf32>, %arg1: tensor<13x21x1xf32>) -> tensor<13x21x3xf32> {
-  // expected-error at +1 {{'tosa.pow' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.pow' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.pow %arg0, %arg1 : (tensor<13x21x3xf32>, tensor<13x21x1xf32>) -> tensor<13x21x3xf32>
   return %0 : tensor<13x21x3xf32>
 }
 
 // -----
 func.func @test_sub(%arg0: tensor<1x21x3xf32>, %arg1: tensor<13x21x3xf32>) -> tensor<13x21x3xf32> {
-  // expected-error at +1 {{'tosa.sub' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.sub' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.sub %arg0, %arg1 : (tensor<1x21x3xf32>, tensor<13x21x3xf32>) -> tensor<13x21x3xf32>
   return %0 : tensor<13x21x3xf32>
 }
 
 // -----
 func.func @test_abs(%arg0: tensor<13x21x3xf32>) -> tensor<13x21x3xf32> {
-  // expected-error at +1 {{'tosa.abs' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.abs' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.abs %arg0 : (tensor<13x21x3xf32>) -> tensor<13x21x3xf32>
   return %0 : tensor<13x21x3xf32>
 }
 
 // -----
 func.func @test_ceil(%arg0: tensor<13x21x3xf32>) -> tensor<13x21x3xf32> {
-  // expected-error at +1 {{'tosa.ceil' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.ceil' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.ceil %arg0 : (tensor<13x21x3xf32>) -> tensor<13x21x3xf32>
   return %0 : tensor<13x21x3xf32>
 }
 
 // -----
 func.func @test_cos(%arg0: tensor<13x21x3xf32>) -> tensor<13x21x3xf32> {
-  // expected-error at +1 {{'tosa.cos' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.cos' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.cos %arg0 : (tensor<13x21x3xf32>) -> tensor<13x21x3xf32>
   return %0 : tensor<13x21x3xf32>
 }
 
 // -----
 func.func @test_exp(%arg0: tensor<13x21x3xf32>) -> tensor<13x21x3xf32> {
-  // expected-error at +1 {{'tosa.exp' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.exp' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.exp %arg0 : (tensor<13x21x3xf32>) -> tensor<13x21x3xf32>
   return %0 : tensor<13x21x3xf32>
 }
 
 // -----
 func.func @test_floor(%arg0: tensor<13x21x3xf32>) -> tensor<13x21x3xf32> {
-  // expected-error at +1 {{'tosa.floor' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.floor' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.floor %arg0 : (tensor<13x21x3xf32>) -> tensor<13x21x3xf32>
   return %0 : tensor<13x21x3xf32>
 }
 
 // -----
 func.func @test_log(%arg0: tensor<13x21x3xf32>) -> tensor<13x21x3xf32> {
-  // expected-error at +1 {{'tosa.log' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.log' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.log %arg0 : (tensor<13x21x3xf32>) -> tensor<13x21x3xf32>
   return %0 : tensor<13x21x3xf32>
 }
 
 // -----
 func.func @test_negate(%arg0: tensor<13x21x3xf32>, %arg1: tensor<1xf32>, %arg2: tensor<1xf32>) -> tensor<13x21x3xf32> {
-  // expected-error at +1 {{'tosa.negate' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.negate' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.negate %arg0, %arg1, %arg2 : (tensor<13x21x3xf32>, tensor<1xf32>, tensor<1xf32>) -> tensor<13x21x3xf32>
   return %0 : tensor<13x21x3xf32>
 }
 
 // -----
 func.func @test_reciprocal(%arg0: tensor<13x21x3xf32>) -> tensor<13x21x3xf32> {
-  // expected-error at +1 {{'tosa.reciprocal' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.reciprocal' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.reciprocal %arg0 : (tensor<13x21x3xf32>) -> tensor<13x21x3xf32>
   return %0 : tensor<13x21x3xf32>
 }
 
 // -----
 func.func @test_rsqrt(%arg0: tensor<13x21x3xf32>) -> tensor<13x21x3xf32> {
-  // expected-error at +1 {{'tosa.rsqrt' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.rsqrt' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.rsqrt %arg0 : (tensor<13x21x3xf32>) -> tensor<13x21x3xf32>
   return %0 : tensor<13x21x3xf32>
 }
 
 // -----
 func.func @test_select(%arg0: tensor<1x1x1xi1>, %arg1: tensor<13x21x3xf32>, %arg2: tensor<13x21x3xf32>) -> tensor<13x21x3xf32> {
-  // expected-error at +1 {{'tosa.select' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.select' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.select %arg0, %arg1, %arg2 : (tensor<1x1x1xi1>, tensor<13x21x3xf32>, tensor<13x21x3xf32>) -> tensor<13x21x3xf32>
   return %0 : tensor<13x21x3xf32>
 }
 
 // -----
 func.func @test_sin(%arg0: tensor<13x21x3xf32>) -> tensor<13x21x3xf32> {
-  // expected-error at +1 {{'tosa.sin' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.sin' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.sin %arg0 : (tensor<13x21x3xf32>) -> tensor<13x21x3xf32>
   return %0 : tensor<13x21x3xf32>
 }
 
 // -----
 func.func @test_equal(%arg0: tensor<13x21x3xf32>, %arg1: tensor<13x1x3xf32>) -> tensor<13x21x3xi1> {
-  // expected-error at +1 {{'tosa.equal' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.equal' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.equal %arg0, %arg1 : (tensor<13x21x3xf32>, tensor<13x1x3xf32>) -> tensor<13x21x3xi1>
   return %0 : tensor<13x21x3xi1>
 }
 
 // -----
 func.func @test_greater(%arg0: tensor<13x21x3xf32>, %arg1: tensor<13x1x3xf32>) -> tensor<13x21x3xi1> {
-  // expected-error at +1 {{'tosa.greater' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.greater' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.greater %arg0, %arg1 : (tensor<13x21x3xf32>, tensor<13x1x3xf32>) -> tensor<13x21x3xi1>
   return %0 : tensor<13x21x3xi1>
 }
 
 // -----
 func.func @test_reduce_max(%arg0: tensor<13x21x3xf16>) -> tensor<1x21x3xf16> {
-  // expected-error at +1 {{'tosa.reduce_max' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.reduce_max' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.reduce_max %arg0 {axis = 0 : i32} : (tensor<13x21x3xf16>) -> tensor<1x21x3xf16>
   return %0 : tensor<1x21x3xf16>
 }
 
 // -----
 func.func @test_reduce_sum(%arg0: tensor<13x21x3xf32>) -> tensor<1x21x3xf32> {
-  // expected-error at +1 {{'tosa.reduce_sum' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.reduce_sum' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.reduce_sum %arg0 {axis = 0 : i32} : (tensor<13x21x3xf32>) -> tensor<1x21x3xf32>
   return %0 : tensor<1x21x3xf32>
 }
 
 // -----
 func.func @test_concat(%arg0: tensor<13x21x3xf32>, %arg1: tensor<13x21x3xf32>) -> tensor<26x21x3xf32> {
-  // expected-error at +1 {{'tosa.concat' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.concat' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.concat %arg0, %arg1 {axis = 0 : i32} : (tensor<13x21x3xf32>, tensor<13x21x3xf32>) -> tensor<26x21x3xf32>
   return %0 : tensor<26x21x3xf32>
 }
@@ -256,9 +256,9 @@ func.func @test_concat(%arg0: tensor<13x21x3xf32>, %arg1: tensor<13x21x3xf32>) -
 // -----
 func.func @test_pad(%arg0: tensor<13x21x3xf32>) -> tensor<13x21x3xf32> {
   %padding = tosa.const_shape {values = dense<0> : tensor<6xindex>} : () -> !tosa.shape<6>
-  // expected-error at +1 {{'tosa.const' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.const' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %pad_const = "tosa.const"() {values = dense<3.14> : tensor<1xf32>} : () -> tensor<1xf32>
-  // expected-error at +1 {{'tosa.pad' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.pad' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.pad %arg0, %padding, %pad_const : (tensor<13x21x3xf32>, !tosa.shape<6>, tensor<1xf32>) -> tensor<13x21x3xf32>
   return %0 : tensor<13x21x3xf32>
 }
@@ -266,14 +266,14 @@ func.func @test_pad(%arg0: tensor<13x21x3xf32>) -> tensor<13x21x3xf32> {
 // -----
 func.func @test_reshape(%arg0: tensor<13x21x3xf32>) -> tensor<1x819xf32> {
   %1 = tosa.const_shape {values = dense<[1, 819]> : tensor<2xindex>} : () -> !tosa.shape<2>
-  // expected-error at +1 {{'tosa.reshape' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.reshape' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.reshape %arg0, %1 : (tensor<13x21x3xf32>, !tosa.shape<2>) -> tensor<1x819xf32>
   return %0 : tensor<1x819xf32>
 }
 
 // -----
 func.func @test_reverse(%arg0: tensor<13x21x3xf32>) -> tensor<13x21x3xf32> {
-  // expected-error at +1 {{'tosa.reverse' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.reverse' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.reverse %arg0 {axis = 0 : i32} : (tensor<13x21x3xf32>) -> tensor<13x21x3xf32>
   return %0 : tensor<13x21x3xf32>
 }
@@ -282,7 +282,7 @@ func.func @test_reverse(%arg0: tensor<13x21x3xf32>) -> tensor<13x21x3xf32> {
 func.func @test_slice(%arg0: tensor<13x21x3xf32>) -> tensor<4x11x1xf32> {
   %size = tosa.const_shape {values = dense<[4, 11, 1]> : tensor<3xindex>} : () -> !tosa.shape<3>
   %start = tosa.const_shape {values = dense<[6, 8, 0]> : tensor<3xindex>} : () -> !tosa.shape<3>
-  // expected-error at +1 {{'tosa.slice' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.slice' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %2 = tosa.slice %arg0, %start, %size : (tensor<13x21x3xf32>, !tosa.shape<3>, !tosa.shape<3>) -> tensor<4x11x1xf32>
   return %2 : tensor<4x11x1xf32>
 }
@@ -290,28 +290,28 @@ func.func @test_slice(%arg0: tensor<13x21x3xf32>) -> tensor<4x11x1xf32> {
 // -----
 func.func @test_tile(%arg0: tensor<13x21x3xf32>) -> tensor<39x21x6xf32> {
   %cst = tosa.const_shape { values = dense<[3, 1, 2]> : tensor<3xindex> } : () -> !tosa.shape<3>
-  // expected-error at +1 {{'tosa.tile' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.tile' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.tile %arg0, %cst: (tensor<13x21x3xf32>, !tosa.shape<3>) -> tensor<39x21x6xf32>
   return %0 : tensor<39x21x6xf32>
 }
 
 // -----
 func.func @test_transpose(%arg0: tensor<13x21x3xf32>, %arg1: tensor<3xi32>) -> tensor<3x13x21xf32> {
-  // expected-error at +1 {{'tosa.transpose' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.transpose' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %1 = tosa.transpose %arg0 {perms = array<i32: 2, 0, 1>}: (tensor<13x21x3xf32>) -> tensor<3x13x21xf32>
   return %1 : tensor<3x13x21xf32>
 }
 
 // -----
 func.func @test_gather(%arg0: tensor<13x21x3xf32>, %arg1: tensor<13x26xi32>) -> tensor<13x26x3xf32> {
-  // expected-error at +1 {{'tosa.gather' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.gather' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.gather %arg0, %arg1 : (tensor<13x21x3xf32>, tensor<13x26xi32>) -> tensor<13x26x3xf32>
   return %0 : tensor<13x26x3xf32>
 }
 
 // -----
 func.func @test_scatter(%arg0: tensor<13x28x3xf32>, %arg1: tensor<13x26xi32>, %arg2: tensor<13x26x3xf32>) -> tensor<13x28x3xf32> {
-  // expected-error at +1 {{'tosa.scatter' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.scatter' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %0 = tosa.scatter %arg0, %arg1, %arg2 : (tensor<13x28x3xf32>, tensor<13x26xi32>, tensor<13x26x3xf32>) -> tensor<13x28x3xf32>
   return %0 : tensor<13x28x3xf32>
 }
@@ -321,7 +321,7 @@ func.func @test_resize(%arg0: tensor<1x32x32x8xf32>) -> tensor<1x64x64x8xf32> {
   %scale = tosa.const_shape { values = dense<[4, 2, 4, 2]> : tensor<4xindex> } : () -> !tosa.shape<4>
   %offset = tosa.const_shape { values = dense<[-1, -1]> : tensor<2xindex> } : () -> !tosa.shape<2>
   %border = tosa.const_shape { values = dense<[1, 1]> : tensor<2xindex> } : () -> !tosa.shape<2>
-  // expected-error at +1 {{'tosa.resize' op illegal: requires [pro_fp] but not enabled in target}}
+  // expected-error at +1 {{'tosa.resize' op illegal: requires any of [pro_fp] profiles/extensions to be specified in the target environment}}
   %1 = tosa.resize %arg0, %scale, %offset, %border { mode = BILINEAR } : (tensor<1x32x32x8xf32>, !tosa.shape<4>, !tosa.shape<2>, !tosa.shape<2>) -> tensor<1x64x64x8xf32>
   return %1 : tensor<1x64x64x8xf32>
 }
diff --git a/mlir/test/Dialect/Tosa/profile_pro_int_unsupported.mlir b/mlir/test/Dialect/Tosa/profile_pro_int_unsupported.mlir
index 99b602e48febb..f646be6d4a43b 100644
--- a/mlir/test/Dialect/Tosa/profile_pro_int_unsupported.mlir
+++ b/mlir/test/Dialect/Tosa/profile_pro_int_unsupported.mlir
@@ -18,35 +18,35 @@ func.func @test_const_i32() -> tensor<3x11x11x3xi32> {
 
 // -----
 func.func @test_argmax(%arg0: tensor<14x19xi8>) -> tensor<14xi32> {
-  // expected-error at +1 {{'tosa.argmax' op illegal: requires [pro_int] but not enabled in target}}
+  // expected-error at +1 {{'tosa.argmax' op illegal: requires any of [pro_int] profiles/extensions to be specified in the target environment}}
   %0 = tosa.argmax %arg0 {axis = 1 : i32} : (tensor<14x19xi8>) -> tensor<14xi32>
   return %0 : tensor<14xi32>
 }
 
 // -----
 func.func @test_avg_pool2d(%arg0: tensor<1x7x7x9xi8>, %arg1: tensor<1xi8>, %arg2: tensor<1xi8>) -> tensor<1x7x7x9xi8> {
-  // expected-error at +1 {{'tosa.avg_pool2d' op illegal: requires [pro_int] but not enabled in target}}
+  // expected-error at +1 {{'tosa.avg_pool2d' op illegal: requires any of [pro_int] profiles/extensions to be specified in the target environment}}
   %0 = tosa.avg_pool2d %arg0, %arg1, %arg2 {acc_type = i32, kernel = array<i64: 2, 2>, pad = array<i64: 0, 1, 0, 1>, stride = array<i64: 1, 1>} : (tensor<1x7x7x9xi8>, tensor<1xi8>, tensor<1xi8>) -> tensor<1x7x7x9xi8>
   return %0 : tensor<1x7x7x9xi8>
 }
 
 // -----
 func.func @test_conv2d(%arg0: tensor<1x4x4x4xi8>, %arg1: tensor<8x1x1x4xi8>, %arg2: tensor<8xi32>, %arg3: tensor<1xi8>) -> tensor<1x4x4x8xi32> {
-  // expected-error at +1 {{'tosa.conv2d' op illegal: requires [pro_int] but not enabled in target}}
+  // expected-error at +1 {{'tosa.conv2d' op illegal: requires any of [pro_int] profiles/extensions to be specified in the target environment}}
   %0 = tosa.conv2d %arg0, %arg1, %arg2, %arg3, %arg3 {acc_type = i32, dilation = array<i64: 1, 1>, pad = array<i64: 0, 0, 0, 0>, stride = array<i64: 1, 1>, local_bound = true} : (tensor<1x4x4x4xi8>, tensor<8x1x1x4xi8>, tensor<8xi32>, tensor<1xi8>, tensor<1xi8>) -> tensor<1x4x4x8xi32>
   return %0 : tensor<1x4x4x8xi32>
 }
 
 // -----
 func.func @test_conv3d(%arg0: tensor<1x4x8x21x17xi8>, %arg1: tensor<34x1x1x1x17xi8>, %arg2: tensor<34xi32>, %arg3: tensor<1xi8>, %arg4: tensor<1xi8>) -> tensor<1x4x8x21x34xi32> {
-  // expected-error at +1 {{'tosa.conv3d' op illegal: requires [pro_int] but not enabled in target}}
+  // expected-error at +1 {{'tosa.conv3d' op illegal: requires any of [pro_int] profiles/extensions to be specified in the target environment}}
   %0 = tosa.conv3d %arg0, %arg1, %arg2, %arg3, %arg4 {acc_type = i32, dilation = array<i64: 1, 1, 1>, pad = array<i64: 0, 0, 0, 0, 0, 0>, stride = array<i64: 1, 1, 1>} : (tensor<1x4x8x21x17xi8>, tensor<34x1x1x1x17xi8>, tensor<34xi32>, tensor<1xi8>, tensor<1xi8>) -> tensor<1x4x8x21x34xi32>
   return %0 : tensor<1x4x8x21x34xi32>
 }
 
 // -----
 func.func @test_depthwise_conv2d(%arg0: tensor<1x4x4x4xi8>, %arg1: tensor<1x1x4x2xi8>, %arg2: tensor<8xi32>, %arg3: tensor<1xi8>, %arg4: tensor<1xi8>) -> tensor<1x4x4x8xi32> {
-  // expected-error at +1 {{'tosa.depthwise_conv2d' op illegal: requires [pro_int] but not enabled in target}}
+  // expected-error at +1 {{'tosa.depthwise_conv2d' op illegal: requires any of [pro_int] profiles/extensions to be specified in the target environment}}
   %0 = tosa.depthwise_conv2d %arg0, %arg1, %arg2, %arg3, %arg4 {acc_type = i32, dilation = array<i64: 1, 1>, pad = array<i64: 0, 0, 0, 0>, stride = array<i64: 1, 1>} : (tensor<1x4x4x4xi8>, tensor<1x1x4x2xi8>, tensor<8xi32>, tensor<1xi8>, tensor<1xi8>) -> tensor<1x4x4x8xi32>
   return %0 : tensor<1x4x4x8xi32>
 }
@@ -55,126 +55,126 @@ func.func @test_depthwise_conv2d(%arg0: tensor<1x4x4x4xi8>, %arg1: tensor<1x1x4x
 func.func @test_matmul(%arg0: tensor<1x14x19xi8>, %arg1: tensor<1x19x28xi8>) -> tensor<1x14x28xi32> {
   %azp0 = "tosa.const"() <{values = dense<0> : tensor<1xi8>}> : () -> tensor<1xi8>
   %bzp0 = "tosa.const"() <{values = dense<0> : tensor<1xi8>}> : () -> tensor<1xi8>
-  // expected-error at +1 {{'tosa.matmul' op illegal: requires [pro_int] but not enabled in target}}
+  // expected-error at +1 {{'tosa.matmul' op illegal: requires any of [pro_int] profiles/extensions to be specified in the target environment}}
   %0 = tosa.matmul %arg0, %arg1, %azp0, %bzp0 : (tensor<1x14x19xi8>, tensor<1x19x28xi8>, tensor<1xi8>, tensor<1xi8>)  -> tensor<1x14x28xi32>
   return %0 : tensor<1x14x28xi32>
 }
 
 // -----
 func.func @test_max_pool2d(%arg0: tensor<1x32x32x8xi8>) -> tensor<1x32x32x8xi8> {
-  // expected-error at +1 {{'tosa.max_pool2d' op illegal: requires [pro_int] but not enabled in target}}
+  // expected-error at +1 {{'tosa.max_pool2d' op illegal: requires any of [pro_int] profiles/extensions to be specified in the target environment}}
   %0 = tosa.max_pool2d %arg0 {kernel = array<i64: 1, 1>, pad = array<i64: 0, 0, 0, 0>, stride = array<i64: 1, 1>} : (tensor<1x32x32x8xi8>) -> tensor<1x32x32x8xi8>
   return %0 : tensor<1x32x32x8xi8>
 }
 
 // -----
 func.func @test_transpose_conv2d(%arg0: tensor<1x32x32x8xi8>, %arg1: tensor<16x1x1x8xi8>, %arg2: tensor<16xi32>, %arg3: tensor<1xi8>, %arg4: tensor<1xi8>) -> tensor<1x32x32x16xi32> {
-  // expected-error at +1 {{'tosa.transpose_conv2d' op illegal: requires [pro_int] but not enabled in target}}
+  // expected-error at +1 {{'tosa.transpose_conv2d' op illegal: requires any of [pro_int] profiles/extensions to be specified in the target environment}}
   %0 = tosa.transpose_conv2d %arg0, %arg1, %arg2, %arg3, %arg4 {acc_type = i32, out_pad = array<i64: 0, 0, 0, 0>, stride = array<i64: 1, 1>} : (tensor<1x32x32x8xi8>, tensor<16x1x1x8xi8>, tensor<16xi32>, tensor<1xi8>, tensor<1xi8>) -> tensor<1x32x32x16xi32>
   return %0 : tensor<1x32x32x16xi32>
 }
 
 // -----
 func.func @test_clamp(%arg0: tensor<13x21x3xi8>) -> tensor<13x21x3xi8> {
-  // expected-error at +1 {{'tosa.clamp' op illegal: requires [pro_int] but not enabled in target}}
+  // expected-error at +1 {{'tosa.clamp' op illegal: requires any of [pro_int] profiles/extensions to be specified in the target environment}}
   %0 = tosa.clamp %arg0 {min_val = 0 : i8, max_val = 1: i8} : (tensor<13x21x3xi8>) -> tensor<13x21x3xi8>
   return %0 : tensor<13x21x3xi8>
 }
 
 // -----
 func.func @test_arithmetic_right_shift(%arg0: tensor<13x21x1xi32>, %arg1: tensor<13x21x3xi32>) -> tensor<13x21x3xi32> {
-  // expected-error at +1 {{'tosa.arithmetic_right_shift' op illegal: requires [pro_int] but not enabled in target}}
+  // expected-error at +1 {{'tosa.arithmetic_right_shift' op illegal: requires any of [pro_int] profiles/extensions to be specified in the target environment}}
   %0 = tosa.arithmetic_right_shift %arg0, %arg1 {round = false} : (tensor<13x21x1xi32>, tensor<13x21x3xi32>) -> tensor<13x21x3xi32>
   return %0 : tensor<13x21x3xi32>
 }
 
 // -----
 func.func @test_bitwise_and(%arg0: tensor<13x21x3xi32>, %arg1: tensor<13x21x1xi32>) -> tensor<13x21x3xi32> {
-  // expected-error at +1 {{'tosa.bitwise_and' op illegal: requires [pro_int] but not enabled in target}}
+  // expected-error at +1 {{'tosa.bitwise_and' op illegal: requires any of [pro_int] profiles/extensions to be specified in the target environment}}
   %0 = tosa.bitwise_and %arg0, %arg1 : (tensor<13x21x3xi32>, tensor<13x21x1xi32>) -> tensor<13x21x3xi32>
   return %0 : tensor<13x21x3xi32>
 }
 
 // -----
 func.func @test_max(%arg0: tensor<13x21x3xi32>, %arg1: tensor<13x21x1xi32>) -> tensor<13x21x3xi32> {
-  // expected-error at +1 {{'tosa.maximum' op illegal: requires [pro_int] but not enabled in target}}
+  // expected-error at +1 {{'tosa.maximum' op illegal: requires any of [pro_int] profiles/extensions to be specified in the target environment}}
   %0 = tosa.maximum %arg0, %arg1 : (tensor<13x21x3xi32>, tensor<13x21x1xi32>) -> tensor<13x21x3xi32>
   return %0 : tensor<13x21x3xi32>
 }
 
 // -----
 func.func @test_mul(%arg0: tensor<13x21x3xi16>, %arg1: tensor<13x1x3xi16>, %shift: tensor<1xi8>) -> tensor<13x21x3xi32> {
-  // expected-error at +1 {{'tosa.mul' op illegal: requires [pro_int] but not enabled in target}}
+  // expected-error at +1 {{'tosa.mul' op illegal: requires any of [pro_int] profiles/extensions to be specified in the target environment}}
   %0 = tosa.mul %arg0, %arg1, %shift : (tensor<13x21x3xi16>, tensor<13x1x3xi16>, tensor<1xi8>) -> tensor<13x21x3xi32>
   return %0 : tensor<13x21x3xi32>
 }
 
 // -----
 func.func @test_table(%arg0 : tensor<4x5xi8>, %arg1 : tensor<513xi8>) -> () {
-  // expected-error at +1 {{'tosa.table' op illegal: requires [pro_int] but not enabled in target}}
+  // expected-error at +1 {{'tosa.table' op illegal: requires any of [pro_int] profiles/extensions to be specified in the target environment}}
   %0 = tosa.table %arg0, %arg1 : (tensor<4x5xi8>, tensor<513xi8>) -> tensor<?x?xi8>
   return
 }
 
 // -----
 func.func @test_abs(%arg0: tensor<13x21x3xi32>) -> tensor<13x21x3xi32> {
-  // expected-error at +1 {{'tosa.abs' op illegal: requires [pro_int] but not enabled in target}}
+  // expected-error at +1 {{'tosa.abs' op illegal: requires any of [pro_int] profiles/extensions to be specified in the target environment}}
   %0 = tosa.abs %arg0 : (tensor<13x21x3xi32>) -> tensor<13x21x3xi32>
   return %0 : tensor<13x21x3xi32>
 }
 
 // -----
 func.func @test_bitwise_not(%arg0: tensor<13x21x1xi32>) -> tensor<13x21x1xi32> {
-  // expected-error at +1 {{'tosa.bitwise_not' op illegal: requires [pro_int] but not enabled in target}}
+  // expected-error at +1 {{'tosa.bitwise_not' op illegal: requires any of [pro_int] profiles/extensions to be specified in the target environment}}
   %0 = tosa.bitwise_not %arg0 : (tensor<13x21x1xi32>) -> tensor<13x21x1xi32>
   return %0 : tensor<13x21x1xi32>
 }
 
 // -----
 func.func @test_clz(%arg0: tensor<13x21x3xi32>) -> tensor<13x21x3xi32> {
-  // expected-error at +1 {{'tosa.clz' op illegal: requires [pro_int] but not enabled in target}}
+  // expected-error at +1 {{'tosa.clz' op illegal: requires any of [pro_int] profiles/extensions to be specified in the target environment}}
   %0 = tosa.clz %arg0 : (tensor<13x21x3xi32>) -> tensor<13x21x3xi32>
   return %0 : tensor<13x21x3xi32>
 }
 
 // -----
 func.func @test_negate(%arg0: tensor<13x21x3xi16>, %arg1: tensor<1xi16>, %arg2: tensor<1xi16>) -> tensor<13x21x3xi16> {
-  // expected-error at +1 {{'tosa.negate' op illegal: requires [pro_int] but not enabled in target}}
+  // expected-error at +1 {{'tosa.negate' op illegal: requires any of [pro_int] profiles/extensions to be specified in the target environment}}
   %0 = tosa.negate %arg0, %arg1, %arg2 : (tensor<13x21x3xi16>, tensor<1xi16>, tensor<1xi16>) -> tensor<13x21x3xi16>
   return %0 : tensor<13x21x3xi16>
 }
 
 // -----
 func.func @test_select(%arg0: tensor<1x1x1xi1>, %arg1: tensor<13x21x3xi8>, %arg2: tensor<13x21x3xi8>) -> tensor<13x21x3xi8> {
-  // expected-error at +1 {{'tosa.select' op illegal: requires [pro_int] but not enabled in target}}
+  // expected-error at +1 {{'tosa.select' op illegal: requires any of [pro_int] profiles/extensions to be specified in the target environment}}
   %0 = tosa.select %arg0, %arg1, %arg2 : (tensor<1x1x1xi1>, tensor<13x21x3xi8>, tensor<13x21x3xi8>) -> tensor<13x21x3xi8>
   return %0 : tensor<13x21x3xi8>
 }
 
 // -----
 func.func @test_equal(%arg0: tensor<13x21x3xi32>, %arg1: tensor<13x1x3xi32>) -> tensor<13x21x3xi1> {
-  // expected-error at +1 {{'tosa.equal' op illegal: requires [pro_int] but not enabled in target}}
+  // expected-error at +1 {{'tosa.equal' op illegal: requires any of [pro_int] profiles/extensions to be specified in the target environment}}
   %0 = tosa.equal %arg0, %arg1 : (tensor<13x21x3xi32>, tensor<13x1x3xi32>) -> tensor<13x21x3xi1>
   return %0 : tensor<13x21x3xi1>
 }
 
 // -----
 func.func @test_greater(%arg0: tensor<13x21x3xi32>, %arg1: tensor<13x1x3xi32>) -> tensor<13x21x3xi1> {
-  // expected-error at +1 {{'tosa.greater' op illegal: requires [pro_int] but not enabled in target}}
+  // expected-error at +1 {{'tosa.greater' op illegal: requires any of [pro_int] profiles/extensions to be specified in the target environment}}
   %0 = tosa.greater %arg0, %arg1 : (tensor<13x21x3xi32>, tensor<13x1x3xi32>) -> tensor<13x21x3xi1>
   return %0 : tensor<13x21x3xi1>
 }
 
 // -----
 func.func @test_reduce_max(%arg0: tensor<13x21x3xi8>) -> tensor<1x21x3xi8> {
-  // expected-error at +1 {{'tosa.reduce_max' op illegal: requires [pro_int] but not enabled in target}}
+  // expected-error at +1 {{'tosa.reduce_max' op illegal: requires any of [pro_int] profiles/extensions to be specified in the target environment}}
   %0 = tosa.reduce_max %arg0 {axis = 0 : i32} : (tensor<13x21x3xi8>) -> tensor<1x21x3xi8>
   return %0 : tensor<1x21x3xi8>
 }
 
 // -----
 func.func @test_reduce_sum(%arg0: tensor<13x21x3xi32>) -> tensor<1x21x3xi32> {
-  // expected-error at +1 {{'tosa.reduce_sum' op illegal: requires [pro_int] but not enabled in target}}
+  // expected-error at +1 {{'tosa.reduce_sum' op illegal: requires any of [pro_int] profiles/extensions to be specified in the target environment}}
   %0 = tosa.reduce_sum %arg0 {axis = 0 : i32} : (tensor<13x21x3xi32>) -> tensor<1x21x3xi32>
   return %0 : tensor<1x21x3xi32>
 }
@@ -183,7 +183,7 @@ func.func @test_reduce_sum(%arg0: tensor<13x21x3xi32>) -> tensor<1x21x3xi32> {
 func.func @test_pad(%arg0: tensor<13x21x3xi8>) -> tensor<13x21x3xi8> {
   %padding = tosa.const_shape {values = dense<0> : tensor<6xindex>} : () -> !tosa.shape<6>
   %pad_const = "tosa.const"() {values = dense<1> : tensor<1xi8>} : () -> tensor<1xi8>
-  // expected-error at +1 {{'tosa.pad' op illegal: requires [pro_int] but not enabled in target}}
+  // expected-error at +1 {{'tosa.pad' op illegal: requires any of [pro_int] profiles/extensions to be specified in the target environment}}
   %0 = tosa.pad %arg0, %padding, %pad_const : (tensor<13x21x3xi8>, !tosa.shape<6>, tensor<1xi8>) -> tensor<13x21x3xi8>
   return %0 : tensor<13x21x3xi8>
 }
@@ -191,14 +191,14 @@ func.func @test_pad(%arg0: tensor<13x21x3xi8>) -> tensor<13x21x3xi8> {
 // -----
 func.func @test_reshape(%arg0: tensor<13x21x3xi8>) -> tensor<1x819xi8> {
   %1 = tosa.const_shape {values = dense<[1, 819]> : tensor<2xindex>} : () -> !tosa.shape<2>
-  // expected-error at +1 {{'tosa.reshape' op illegal: requires [pro_int] but not enabled in target}}
+  // expected-error at +1 {{'tosa.reshape' op illegal: requires any of [pro_int] profiles/extensions to be specified in the target environment}}
   %0 = tosa.reshape %arg0, %1 : (tensor<13x21x3xi8>, !tosa.shape<2>) -> tensor<1x819xi8>
   return %0 : tensor<1x819xi8>
 }
 
 // -----
 func.func @test_reverse(%arg0: tensor<13x21x3xi8>) -> tensor<13x21x3xi8> {
-  // expected-error at +1 {{'tosa.reverse' op illegal: requires [pro_int] but not enabled in target}}
+  // expected-error at +1 {{'tosa.reverse' op illegal: requires any of [pro_int] profiles/extensions to be specified in the target environment}}
   %0 = tosa.reverse %arg0 {axis = 0 : i32} : (tensor<13x21x3xi8>) -> tensor<13x21x3xi8>
   return %0 : tensor<13x21x3xi8>
 }
@@ -207,7 +207,7 @@ func.func @test_reverse(%arg0: tensor<13x21x3xi8>) -> tensor<13x21x3xi8> {
 func.func @test_slice(%arg0: tensor<13x21x3xi8>) -> tensor<4x11x1xi8> {
   %size = tosa.const_shape {values = dense<[4, 11, 1]> : tensor<3xindex>} : () -> !tosa.shape<3>
   %start = tosa.const_shape {values = dense<[6, 8, 0]> : tensor<3xindex>} : () -> !tosa.shape<3>
-  // expected-error at +1 {{'tosa.slice' op illegal: requires [pro_int] but not enabled in target}}
+  // expected-error at +1 {{'tosa.slice' op illegal: requires any of [pro_int] profiles/extensions to be specified in the target environment}}
   %2 = tosa.slice %arg0, %start, %size : (tensor<13x21x3xi8>, !tosa.shape<3>, !tosa.shape<3>) -> tensor<4x11x1xi8>
   return %2 : tensor<4x11x1xi8>
 }
@@ -215,28 +215,28 @@ func.func @test_slice(%arg0: tensor<13x21x3xi8>) -> tensor<4x11x1xi8> {
 // -----
 func.func @test_tile(%arg0: tensor<13x21x3xi8>) -> tensor<39x21x6xi8> {
   %cst = tosa.const_shape { values = dense<[3, 1, 2]> : tensor<3xindex> } : () -> !tosa.shape<3>
-  // expected-error at +1 {{'tosa.tile' op illegal: requires [pro_int] but not enabled in target}}
+  // expected-error at +1 {{'tosa.tile' op illegal: requires any of [pro_int] profiles/extensions to be specified in the target environment}}
   %0 = tosa.tile %arg0, %cst: (tensor<13x21x3xi8>, !tosa.shape<3>) -> tensor<39x21x6xi8>
   return %0 : tensor<39x21x6xi8>
 }
 
 // -----
 func.func @test_transpose(%arg0: tensor<13x21x3xi8>, %arg1: tensor<3xi32>) -> tensor<3x13x21xi8> {
-  // expected-error at +1 {{'tosa.transpose' op illegal: requires [pro_int] but not enabled in target}}
+  // expected-error at +1 {{'tosa.transpose' op illegal: requires any of [pro_int] profiles/extensions to be specified in the target environment}}
   %1 = tosa.transpose %arg0 {perms = array<i32: 2, 0, 1>}: (tensor<13x21x3xi8>) -> tensor<3x13x21xi8>
   return %1 : tensor<3x13x21xi8>
 }
 
 // -----
 func.func @test_gather(%arg0: tensor<13x21x3xi32>, %arg1: tensor<13x26xi32>) -> tensor<13x26x3xi32> {
-  // expected-error at +1 {{'tosa.gather' op illegal: requires [pro_int] but not enabled in target}}
+  // expected-error at +1 {{'tosa.gather' op illegal: requires any of [pro_int] profiles/extensions OR requires specification version compatible with 1.1 (got 1.0) to be specified in the target environment}}
   %0 = tosa.gather %arg0, %arg1 : (tensor<13x21x3xi32>, tensor<13x26xi32>) -> tensor<13x26x3xi32>
   return %0 : tensor<13x26x3xi32>
 }
 
 // -----
 func.func @test_scatter(%arg0: tensor<13x27x3xi32>, %arg1: tensor<13x26xi32>, %arg2: tensor<13x26x3xi32>) -> tensor<13x27x3xi32> {
-  // expected-error at +1 {{'tosa.scatter' op illegal: requires [pro_int] but not enabled in target}}
+  // expected-error at +1 {{'tosa.scatter' op illegal: requires any of [pro_int] profiles/extensions OR requires specification version compatible with 1.1 (got 1.0) to be specified in the target environment}}
   %0 = tosa.scatter %arg0, %arg1, %arg2 : (tensor<13x27x3xi32>, tensor<13x26xi32>, tensor<13x26x3xi32>) -> tensor<13x27x3xi32>
   return %0 : tensor<13x27x3xi32>
 }
@@ -246,35 +246,35 @@ func.func @test_resize(%arg0: tensor<1x32x32x8xi8>) -> tensor<1x64x64x8xi32> {
   %scale = tosa.const_shape { values = dense<[4, 2, 4, 2]> : tensor<4xindex> } : () -> !tosa.shape<4>
   %offset = tosa.const_shape { values = dense<[-1, -1]> : tensor<2xindex> } : () -> !tosa.shape<2>
   %border = tosa.const_shape { values = dense<[1, 1]> : tensor<2xindex> } : () -> !tosa.shape<2>
-  // expected-error at +1 {{'tosa.resize' op illegal: requires [pro_int] but not enabled in target}}
+  // expected-error at +1 {{'tosa.resize' op illegal: requires any of [pro_int] profiles/extensions to be specified in the target environment}}
   %1 = tosa.resize %arg0, %scale, %offset, %border { mode = BILINEAR } : (tensor<1x32x32x8xi8>, !tosa.shape<4>, !tosa.shape<2>, !tosa.shape<2>) -> tensor<1x64x64x8xi32>
   return %1 : tensor<1x64x64x8xi32>
 }
 
 // -----
 func.func @test_cast_i1_i8(%arg0: tensor<13x21x3xi1>) -> tensor<13x21x3xi8> {
-  // expected-error at +1 {{'tosa.cast' op illegal: requires [pro_int] but not enabled in target}}
+  // expected-error at +1 {{'tosa.cast' op illegal: requires any of [pro_int] profiles/extensions to be specified in the target environment}}
   %0 = tosa.cast %arg0 : (tensor<13x21x3xi1>) -> tensor<13x21x3xi8>
   return %0 : tensor<13x21x3xi8>
 }
 
 // -----
 func.func @test_cast_i8_i32(%arg0: tensor<13x21x3xi8>) -> tensor<13x21x3xi32> {
-  // expected-error at +1 {{'tosa.cast' op illegal: requires [pro_int] but not enabled in target}}
+  // expected-error at +1 {{'tosa.cast' op illegal: requires any of [pro_int] profiles/extensions to be specified in the target environment}}
   %0 = tosa.cast %arg0 : (tensor<13x21x3xi8>) -> tensor<13x21x3xi32>
   return %0 : tensor<13x21x3xi32>
 }
 
 // -----
 func.func @test_cast_i16_i8(%arg0: tensor<13x21x3xi16>) -> tensor<13x21x3xi8> {
-  // expected-error at +1 {{'tosa.cast' op illegal: requires [pro_int] but not enabled in target}}
+  // expected-error at +1 {{'tosa.cast' op illegal: requires any of [pro_int] profiles/extensions to be specified in the target environment}}
   %0 = tosa.cast %arg0 : (tensor<13x21x3xi16>) -> tensor<13x21x3xi8>
   return %0 : tensor<13x21x3xi8>
 }
 
 // -----
 func.func @test_cast_i32_i16(%arg0: tensor<13x21x3xi32>) -> tensor<13x21x3xi16> {
-  // expected-error at +1 {{'tosa.cast' op illegal: requires [pro_int] but not enabled in target}}
+  // expected-error at +1 {{'tosa.cast' op illegal: requires any of [pro_int] profiles/extensions to be specified in the target environment}}
   %0 = tosa.cast %arg0 : (tensor<13x21x3xi32>) -> tensor<13x21x3xi16>
   return %0 : tensor<13x21x3xi16>
 }
@@ -285,7 +285,7 @@ func.func @test_rescale(%arg0: tensor<13x21x3xi8>) -> tensor<13x21x3xi32> {
   %shift = "tosa.const"() {values = dense<30> : tensor<1xi8>} : () -> tensor<1xi8>
   %input_zp = "tosa.const"() {values = dense<127> : tensor<1xi8>} : () -> tensor<1xi8>
   %output_zp = "tosa.const"() {values = dense<0> : tensor<1xi32>} : () -> tensor<1xi32>
-  // expected-error at +1 {{'tosa.rescale' op illegal: requires [pro_int] but not enabled in target}}
+  // expected-error at +1 {{'tosa.rescale' op illegal: requires any of [pro_int] profiles/extensions to be specified in the target environment}}
   %0 = tosa.rescale %arg0, %multiplier, %shift, %input_zp, %output_zp {rounding_mode = SINGLE_ROUND, scale32 = true, per_channel = false, input_unsigned = false, output_unsigned = false} : (tensor<13x21x3xi8>, tensor<1xi32>, tensor<1xi8>, tensor<1xi8>, tensor<1xi32>) -> tensor<13x21x3xi32>
   return %0 : tensor<13x21x3xi32>
 }
diff --git a/mlir/test/Dialect/Tosa/tosa-validation-version-1p0-invalid.mlir b/mlir/test/Dialect/Tosa/tosa-validation-version-1p0-invalid.mlir
index fbd935d56fcc6..7ad45f53135cf 100644
--- a/mlir/test/Dialect/Tosa/tosa-validation-version-1p0-invalid.mlir
+++ b/mlir/test/Dialect/Tosa/tosa-validation-version-1p0-invalid.mlir
@@ -5,7 +5,7 @@
 func.func @test_matmul_fp8_mixed_precision_operands(%arg0: tensor<1x14x19xf8E4M3FN>, %arg1: tensor<1x19x28xf8E5M2>) -> tensor<1x14x28xf16> {
   %azp0 = "tosa.const"() <{values = dense<0.0> : tensor<1xf8E4M3FN>}> : () -> tensor<1xf8E4M3FN>
   %bzp0 = "tosa.const"() <{values = dense<0.0> : tensor<1xf8E5M2>}> : () -> tensor<1xf8E5M2>
-  // expected-error at +1 {{'tosa.matmul' op illegal: the target specification version (1.0) is not backwards compatible with the op compliance specification version (1.1)}}
+  // expected-error at +1 {{'tosa.matmul' op illegal: requires specification version compatible with 1.1 (got 1.0) to be specified in the target environment}}
   %0 = tosa.matmul %arg0, %arg1, %azp0, %bzp0 : (tensor<1x14x19xf8E4M3FN>, tensor<1x19x28xf8E5M2>, tensor<1xf8E4M3FN>, tensor<1xf8E5M2>)  -> tensor<1x14x28xf16>
   return %0 : tensor<1x14x28xf16>
 }
@@ -15,7 +15,7 @@ func.func @test_matmul_fp8_mixed_precision_operands(%arg0: tensor<1x14x19xf8E4M3
 func.func @test_matmul_fp8_input_fp32_acc_type(%arg0: tensor<1x14x19xf8E4M3FN>, %arg1: tensor<1x19x28xf8E4M3FN>) -> tensor<1x14x28xf32> {
   %azp0 = "tosa.const"() <{values = dense<0.0> : tensor<1xf8E4M3FN>}> : () -> tensor<1xf8E4M3FN>
   %bzp0 = "tosa.const"() <{values = dense<0.0> : tensor<1xf8E4M3FN>}> : () -> tensor<1xf8E4M3FN>
-  // expected-error at +1 {{'tosa.matmul' op illegal: the target specification version (1.0) is not backwards compatible with the op compliance specification version (1.1)}}
+  // expected-error at +1 {{'tosa.matmul' op illegal: requires specification version compatible with 1.1 (got 1.0) to be specified in the target environment}}
   %0 = tosa.matmul %arg0, %arg1, %azp0, %bzp0 : (tensor<1x14x19xf8E4M3FN>, tensor<1x19x28xf8E4M3FN>, tensor<1xf8E4M3FN>, tensor<1xf8E4M3FN>)  -> tensor<1x14x28xf32>
   return %0 : tensor<1x14x28xf32>
 }
@@ -25,7 +25,7 @@ func.func @test_matmul_fp8_input_fp32_acc_type(%arg0: tensor<1x14x19xf8E4M3FN>,
 func.func @test_conv2d_fp8_acc32(%arg0: tensor<1x4x4x4xf8E5M2>, %arg1: tensor<8x1x1x4xf8E5M2>, %arg2: tensor<8xf32>) -> tensor<1x4x4x8xf32> {
   %input_zp = "tosa.const"() <{values = dense<0.0> : tensor<1xf8E5M2>}> : () -> tensor<1xf8E5M2>
   %weight_zp = "tosa.const"() <{values = dense<0.0> : tensor<1xf8E5M2>}> : () -> tensor<1xf8E5M2>
-  // expected-error at +1 {{'tosa.conv2d' op illegal: the target specification version (1.0) is not backwards compatible with the op compliance specification version (1.1)}}
+  // expected-error at +1 {{'tosa.conv2d' op illegal: requires specification version compatible with 1.1 (got 1.0) to be specified in the target environment}}
   %0 = tosa.conv2d %arg0, %arg1, %arg2, %input_zp, %weight_zp {acc_type = f32, dilation = array<i64: 1, 1>, pad = array<i64: 0, 0, 0, 0>, stride = array<i64: 1, 1>} : (tensor<1x4x4x4xf8E5M2>, tensor<8x1x1x4xf8E5M2>, tensor<8xf32>, tensor<1xf8E5M2>, tensor<1xf8E5M2>) -> tensor<1x4x4x8xf32>
   return %0 : tensor<1x4x4x8xf32>
 }
@@ -35,7 +35,7 @@ func.func @test_conv2d_fp8_acc32(%arg0: tensor<1x4x4x4xf8E5M2>, %arg1: tensor<8x
 func.func @test_conv3d_fp8_acc32(%arg0: tensor<1x4x8x21x17xf8E5M2>, %arg1: tensor<34x1x1x1x17xf8E5M2>, %arg2: tensor<34xf32>) -> tensor<1x4x8x21x34xf32> {
   %input_zp = "tosa.const"() <{values = dense<0.0> : tensor<1xf8E5M2>}> : () -> tensor<1xf8E5M2>
   %weight_zp = "tosa.const"() <{values = dense<0.0> : tensor<1xf8E5M2>}> : () -> tensor<1xf8E5M2>
-  // expected-error at +1 {{'tosa.conv3d' op illegal: the target specification version (1.0) is not backwards compatible with the op compliance specification version (1.1)}}
+  // expected-error at +1 {{'tosa.conv3d' op illegal: requires specification version compatible with 1.1 (got 1.0) to be specified in the target environment}}
   %0 = tosa.conv3d %arg0, %arg1, %arg2, %input_zp, %weight_zp {acc_type = f32, dilation = array<i64: 1, 1, 1>, pad = array<i64: 0, 0, 0, 0, 0, 0>, stride = array<i64: 1, 1, 1>} : (tensor<1x4x8x21x17xf8E5M2>, tensor<34x1x1x1x17xf8E5M2>, tensor<34xf32>, tensor<1xf8E5M2>, tensor<1xf8E5M2>) -> tensor<1x4x8x21x34xf32>
   return %0 : tensor<1x4x8x21x34xf32>
 }
@@ -45,7 +45,7 @@ func.func @test_conv3d_fp8_acc32(%arg0: tensor<1x4x8x21x17xf8E5M2>, %arg1: tenso
 func.func @test_depthwise_conv2d_fp8_acc32(%arg0: tensor<1x4x4x4xf8E5M2>, %arg1: tensor<1x1x4x2xf8E5M2>, %arg2: tensor<8xf32>) -> tensor<1x4x4x8xf32> {
   %input_zp = "tosa.const"() <{values = dense<0.0> : tensor<1xf8E5M2>}> : () -> tensor<1xf8E5M2>
   %weight_zp = "tosa.const"() <{values = dense<0.0> : tensor<1xf8E5M2>}> : () -> tensor<1xf8E5M2>
-  // expected-error at +1 {{'tosa.depthwise_conv2d' op illegal: the target specification version (1.0) is not backwards compatible with the op compliance specification version (1.1)}}
+  // expected-error at +1 {{'tosa.depthwise_conv2d' op illegal: requires specification version compatible with 1.1 (got 1.0) to be specified in the target environment}}
   %0 = tosa.depthwise_conv2d %arg0, %arg1, %arg2, %input_zp, %weight_zp {acc_type = f32, dilation = array<i64: 1, 1>, pad = array<i64: 0, 0, 0, 0>, stride = array<i64: 1, 1>} : (tensor<1x4x4x4xf8E5M2>, tensor<1x1x4x2xf8E5M2>, tensor<8xf32>, tensor<1xf8E5M2>, tensor<1xf8E5M2>) -> tensor<1x4x4x8xf32>
   return %0 : tensor<1x4x4x8xf32>
 }
@@ -55,7 +55,7 @@ func.func @test_depthwise_conv2d_fp8_acc32(%arg0: tensor<1x4x4x4xf8E5M2>, %arg1:
 func.func @test_transpose_conv2d_fp8_acc32(%arg0: tensor<1x32x32x8xf8E5M2>, %arg1: tensor<16x1x1x8xf8E5M2>, %arg2: tensor<16xf32>) -> tensor<1x32x32x16xf32> {
   %input_zp = "tosa.const"() <{values = dense<0.0> : tensor<1xf8E5M2>}> : () -> tensor<1xf8E5M2>
   %weight_zp = "tosa.const"() <{values = dense<0.0> : tensor<1xf8E5M2>}> : () -> tensor<1xf8E5M2>
-  // expected-error at +1 {{'tosa.transpose_conv2d' op illegal: the target specification version (1.0) is not backwards compatible with the op compliance specification version (1.1)}}
+  // expected-error at +1 {{'tosa.transpose_conv2d' op illegal: requires specification version compatible with 1.1 (got 1.0) to be specified in the target environment}}
   %0 = tosa.transpose_conv2d %arg0, %arg1, %arg2, %input_zp, %weight_zp {acc_type = f32, out_pad = array<i64: 0, 0, 0, 0>, stride = array<i64: 1, 1>} : (tensor<1x32x32x8xf8E5M2>, tensor<16x1x1x8xf8E5M2>, tensor<16xf32>, tensor<1xf8E5M2>, tensor<1xf8E5M2>) -> tensor<1x32x32x16xf32>
   return %0 : tensor<1x32x32x16xf32>
 }
@@ -63,7 +63,7 @@ func.func @test_transpose_conv2d_fp8_acc32(%arg0: tensor<1x32x32x8xf8E5M2>, %arg
 // -----
 
 func.func @test_gather_bool_i64(%arg0: tensor<13x21x3xi1>, %arg1: tensor<13x26xi64>) -> tensor<13x26x3xi1> {
-  // expected-error at +1 {{'tosa.gather' op illegal: requires [int64] but not enabled in target}}
+  // expected-error at +1 {{'tosa.gather' op illegal: requires specification version compatible with 1.1 (got 1.0) and requires any of [int64] profiles/extensions to be specified in the target environment}}
   %0 = tosa.gather %arg0, %arg1 : (tensor<13x21x3xi1>, tensor<13x26xi64>) -> tensor<13x26x3xi1>
   return %0 : tensor<13x26x3xi1>
 }
@@ -71,7 +71,7 @@ func.func @test_gather_bool_i64(%arg0: tensor<13x21x3xi1>, %arg1: tensor<13x26xi
 // -----
 
 func.func @test_gather_bool_i32(%arg0: tensor<13x21x3xi1>, %arg1: tensor<13x26xi32>) -> tensor<13x26x3xi1> {
-  // expected-error at +1 {{'tosa.gather' op illegal: the target specification version (1.0) is not backwards compatible with the op compliance specification version (1.1)}}
+  // expected-error at +1 {{'tosa.gather' op illegal: requires specification version compatible with 1.1 (got 1.0) to be specified in the target environment}}
   %0 = tosa.gather %arg0, %arg1 : (tensor<13x21x3xi1>, tensor<13x26xi32>) -> tensor<13x26x3xi1>
   return %0 : tensor<13x26x3xi1>
 }
@@ -79,7 +79,7 @@ func.func @test_gather_bool_i32(%arg0: tensor<13x21x3xi1>, %arg1: tensor<13x26xi
 // -----
 
 func.func @test_scatter_bool_i64(%arg0: tensor<13x52x3xi1>, %arg1: tensor<13x26xi64>, %arg2: tensor<13x26x3xi1>) -> tensor<13x52x3xi1> {
-  // expected-error at +1 {{'tosa.scatter' op illegal: requires [int64] but not enabled in target}}
+  // expected-error at +1 {{'tosa.scatter' op illegal: requires specification version compatible with 1.1 (got 1.0) and requires any of [int64] profiles/extensions to be specified in the target environment}}
   %0 = tosa.scatter %arg0, %arg1, %arg2 : (tensor<13x52x3xi1>, tensor<13x26xi64>, tensor<13x26x3xi1>) -> tensor<13x52x3xi1>
   return %0 : tensor<13x52x3xi1>
 }
@@ -87,7 +87,7 @@ func.func @test_scatter_bool_i64(%arg0: tensor<13x52x3xi1>, %arg1: tensor<13x26x
 // -----
 
 func.func @test_scatter_bool_i32(%arg0: tensor<13x52x3xi1>, %arg1: tensor<13x26xi32>, %arg2: tensor<13x26x3xi1>) -> tensor<13x52x3xi1> {
-  // expected-error at +1 {{'tosa.scatter' op illegal: the target specification version (1.0) is not backwards compatible with the op compliance specification version (1.1)}}
+  // expected-error at +1 {{'tosa.scatter' op illegal: requires specification version compatible with 1.1 (got 1.0) to be specified in the target environment}}
   %0 = tosa.scatter %arg0, %arg1, %arg2 : (tensor<13x52x3xi1>, tensor<13x26xi32>, tensor<13x26x3xi1>) -> tensor<13x52x3xi1>
   return %0 : tensor<13x52x3xi1>
 }
@@ -95,7 +95,7 @@ func.func @test_scatter_bool_i32(%arg0: tensor<13x52x3xi1>, %arg1: tensor<13x26x
 // -----
 
 func.func @test_cast_bool_fp32(%arg0: tensor<13x21x3xi1>) -> tensor<13x21x3xf32> {
-  // expected-error at +1 {{'tosa.cast' op illegal: the target specification version (1.0) is not backwards compatible with the op compliance specification version (1.1)}}
+  // expected-error at +1 {{'tosa.cast' op illegal: requires specification version compatible with 1.1 (got 1.0) to be specified in the target environment}}
   %0 = tosa.cast %arg0 : (tensor<13x21x3xi1>) -> tensor<13x21x3xf32>
   return %0 : tensor<13x21x3xf32>
 }
@@ -103,7 +103,7 @@ func.func @test_cast_bool_fp32(%arg0: tensor<13x21x3xi1>) -> tensor<13x21x3xf32>
 // -----
 
 func.func @test_cast_bool_i64(%arg0: tensor<13x21x3xi1>) -> tensor<13x21x3xi64> {
-  // expected-error at +1 {{'tosa.cast' op illegal: requires [int64] but not enabled in target}}
+  // expected-error at +1 {{'tosa.cast' op illegal: requires specification version compatible with 1.1 (got 1.0) and requires any of [int64] profiles/extensions to be specified in the target environment}}
   %0 = tosa.cast %arg0 : (tensor<13x21x3xi1>) -> tensor<13x21x3xi64>
   return %0 : tensor<13x21x3xi64>
 }
@@ -111,7 +111,7 @@ func.func @test_cast_bool_i64(%arg0: tensor<13x21x3xi1>) -> tensor<13x21x3xi64>
 // -----
 
 func.func @test_cast_fp32_bool(%arg0: tensor<13x21x3xf32>) -> tensor<13x21x3xi1> {
-  // expected-error at +1 {{'tosa.cast' op illegal: the target specification version (1.0) is not backwards compatible with the op compliance specification version (1.1)}}
+  // expected-error at +1 {{'tosa.cast' op illegal: requires specification version compatible with 1.1 (got 1.0) to be specified in the target environment}}
   %0 = tosa.cast %arg0 : (tensor<13x21x3xf32>) -> tensor<13x21x3xi1>
   return %0 : tensor<13x21x3xi1>
 }
@@ -119,7 +119,7 @@ func.func @test_cast_fp32_bool(%arg0: tensor<13x21x3xf32>) -> tensor<13x21x3xi1>
 // -----
 
 func.func @test_cast_i64_bool(%arg0: tensor<13x21x3xi64>) -> tensor<13x21x3xi1> {
-  // expected-error at +1 {{'tosa.cast' op illegal: requires [int64] but not enabled in target}}
+  // expected-error at +1 {{'tosa.cast' op illegal: requires specification version compatible with 1.1 (got 1.0) and requires any of [int64] profiles/extensions to be specified in the target environment}}
   %0 = tosa.cast %arg0 : (tensor<13x21x3xi64>) -> tensor<13x21x3xi1>
   return %0 : tensor<13x21x3xi1>
 }
diff --git a/mlir/test/Dialect/Tosa/tosa-validation-version-1p0-pro-fp-invalid.mlir b/mlir/test/Dialect/Tosa/tosa-validation-version-1p0-pro-fp-invalid.mlir
new file mode 100644
index 0000000000000..df2760a16e4b9
--- /dev/null
+++ b/mlir/test/Dialect/Tosa/tosa-validation-version-1p0-pro-fp-invalid.mlir
@@ -0,0 +1,15 @@
+// RUN: mlir-opt %s -verify-diagnostics -tosa-attach-target="specification_version=1.0 profiles=pro_fp" -tosa-validate="strict-op-spec-alignment"
+
+func.func @test_gather_i8_i32(%input: tensor<13x27x3xi8>, %indices: tensor<13x26xi32>) -> tensor<13x26x3xi8> {
+  // expected-error at +1 {{'tosa.gather' op illegal: requires any of [pro_int] profiles/extensions OR requires specification version compatible with 1.1 (got 1.0) to be specified in the target environment}}
+  %gather = tosa.gather %input, %indices : (tensor<13x27x3xi8>, tensor<13x26xi32>) -> tensor<13x26x3xi8>
+  return %gather : tensor<13x26x3xi8>
+}
+
+// -----
+
+func.func @test_scatter_i8_i32(%input: tensor<13x27x3xi8>, %indices: tensor<13x26xi32>, %updates: tensor<13x26x3xi8>) -> tensor<13x27x3xi8> {
+  // expected-error at +1 {{'tosa.scatter' op illegal: requires any of [pro_int] profiles/extensions OR requires specification version compatible with 1.1 (got 1.0) to be specified in the target environment}}
+  %scatter = tosa.scatter %input, %indices, %updates : (tensor<13x27x3xi8>, tensor<13x26xi32>, tensor<13x26x3xi8>) -> tensor<13x27x3xi8>
+  return %scatter : tensor<13x27x3xi8>
+}
diff --git a/mlir/test/Dialect/Tosa/tosa-validation-version-1p0-valid.mlir b/mlir/test/Dialect/Tosa/tosa-validation-version-1p0-valid.mlir
new file mode 100644
index 0000000000000..6e88558782316
--- /dev/null
+++ b/mlir/test/Dialect/Tosa/tosa-validation-version-1p0-valid.mlir
@@ -0,0 +1,15 @@
+// RUN: mlir-opt %s -split-input-file -verify-diagnostics -tosa-attach-target="specification_version=1.0 profiles=pro_int,pro_fp" -tosa-validate="strict-op-spec-alignment" | FileCheck %s
+
+// CHECK-LABEL: test_gather_i8_i32
+func.func @test_gather_i8_i32(%input: tensor<13x27x3xi8>, %indices: tensor<13x26xi32>) -> tensor<13x26x3xi8> {
+  %gather = tosa.gather %input, %indices : (tensor<13x27x3xi8>, tensor<13x26xi32>) -> tensor<13x26x3xi8>
+  return %gather : tensor<13x26x3xi8>
+}
+
+// -----
+
+// CHECK-LABEL: test_scatter_i8_i32
+func.func @test_scatter_i8_i32(%input: tensor<13x27x3xi8>, %indices: tensor<13x26xi32>, %updates: tensor<13x26x3xi8>) -> tensor<13x27x3xi8> {
+  %scatter = tosa.scatter %input, %indices, %updates : (tensor<13x27x3xi8>, tensor<13x26xi32>, tensor<13x26x3xi8>) -> tensor<13x27x3xi8>
+  return %scatter : tensor<13x27x3xi8>
+}
diff --git a/mlir/test/Dialect/Tosa/tosa-validation-version-1p1-pro-fp-valid.mlir b/mlir/test/Dialect/Tosa/tosa-validation-version-1p1-pro-fp-valid.mlir
new file mode 100644
index 0000000000000..0f2bbb71ee4b7
--- /dev/null
+++ b/mlir/test/Dialect/Tosa/tosa-validation-version-1p1-pro-fp-valid.mlir
@@ -0,0 +1,15 @@
+// RUN: mlir-opt %s -split-input-file -verify-diagnostics -tosa-attach-target="specification_version=1.1.draft profiles=pro_fp" -tosa-validate="strict-op-spec-alignment" | FileCheck %s
+
+// CHECK-LABEL: test_gather_i8_i32
+func.func @test_gather_i8_i32(%input: tensor<13x27x3xi8>, %indices: tensor<13x26xi32>) -> tensor<13x26x3xi8> {
+  %gather = tosa.gather %input, %indices : (tensor<13x27x3xi8>, tensor<13x26xi32>) -> tensor<13x26x3xi8>
+  return %gather : tensor<13x26x3xi8>
+}
+
+// -----
+
+// CHECK-LABEL: test_scatter_i8_i32
+func.func @test_scatter_i8_i32(%input: tensor<13x27x3xi8>, %indices: tensor<13x26xi32>, %updates: tensor<13x26x3xi8>) -> tensor<13x27x3xi8> {
+  %scatter = tosa.scatter %input, %indices, %updates : (tensor<13x27x3xi8>, tensor<13x26xi32>, tensor<13x26x3xi8>) -> tensor<13x27x3xi8>
+  return %scatter : tensor<13x27x3xi8>
+}



More information about the Mlir-commits mailing list