[Codegen][Tuner] Expose the python bindings for LinalgExt::inferScaledContractionDims and LinalgExt::isaScaledContractionOpInterface (#22763)

Exposes bindings that enable tuner support for scaled contractions.

---------

Signed-off-by: Muzammiluddin Syed <muzasyed@amd.com>
diff --git a/compiler/bindings/c/iree/compiler/dialects/iree_codegen.h b/compiler/bindings/c/iree/compiler/dialects/iree_codegen.h
index c5e6255..abad5ba 100644
--- a/compiler/bindings/c/iree/compiler/dialects/iree_codegen.h
+++ b/compiler/bindings/c/iree/compiler/dialects/iree_codegen.h
@@ -119,6 +119,25 @@
 MLIR_CAPI_EXPORTED ireeCodegenIGEMMGenericConvDetails
 ireeCodegenGetIGEMMGenericConvDetails(MlirOperation op);
 
+struct ireeCodegenScaledContractionDimensions {
+  // Batch dimension for scaled contraction (ArrayAttr).
+  MlirAttribute batch;
+  // M dimension for scaled contraction (ArrayAttr).
+  MlirAttribute m;
+  // N dimension for scaled contraction (ArrayAttr).
+  MlirAttribute n;
+  // K outer reduction dimension for scaled contraction (ArrayAttr).
+  MlirAttribute k;
+  // K blocking dimension for scaled contraction (ArrayAttr).
+  MlirAttribute kB;
+};
+
+MLIR_CAPI_EXPORTED bool
+ireeCodegenMlirOperationIsAScaledContractionOp(MlirOperation op);
+
+MLIR_CAPI_EXPORTED ireeCodegenScaledContractionDimensions
+ireeCodegenInferScaledContractionDimensions(MlirOperation op);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/compiler/bindings/python/IREECompilerDialectsModule.cpp b/compiler/bindings/python/IREECompilerDialectsModule.cpp
index beb0e18..3e69fbf 100644
--- a/compiler/bindings/python/IREECompilerDialectsModule.cpp
+++ b/compiler/bindings/python/IREECompilerDialectsModule.cpp
@@ -770,4 +770,45 @@
       "Gets IGEMM details for a linalg operation. "
       "Returns None if failed to infer IGEMM convolution details.",
       py::arg("linalg_op"));
+
+  //===-------------------------------------------------------------------===//
+  // Binding to utility function ireeCodegenGetScaledContractionDetails
+  //===-------------------------------------------------------------------===//
+  iree_codegen_module.def("isa_scaled_contraction_op",
+                          &ireeCodegenMlirOperationIsAScaledContractionOp,
+                          "Checks if the given operation is an IREE LinalgExt "
+                          "scaled contraction op.",
+                          py::arg("op"));
+
+  //===-------------------------------------------------------------------===//
+  // Binding to struct ireeCodegenScaledContractionDimensions
+  //===-------------------------------------------------------------------===//
+  py::class_<ireeCodegenScaledContractionDimensions>(
+      iree_codegen_module, "ScaledContractionDimensions")
+      .def_prop_ro("batch",
+                   [](const ireeCodegenScaledContractionDimensions &self) {
+                     return getIntArrayAttrValues(self.batch);
+                   })
+      .def_prop_ro("m",
+                   [](const ireeCodegenScaledContractionDimensions &self) {
+                     return getIntArrayAttrValues(self.m);
+                   })
+      .def_prop_ro("n",
+                   [](const ireeCodegenScaledContractionDimensions &self) {
+                     return getIntArrayAttrValues(self.n);
+                   })
+      .def_prop_ro("k",
+                   [](const ireeCodegenScaledContractionDimensions &self) {
+                     return getIntArrayAttrValues(self.k);
+                   })
+      .def_prop_ro("kB",
+                   [](const ireeCodegenScaledContractionDimensions &self) {
+                     return getIntArrayAttrValues(self.kB);
+                   });
+
+  iree_codegen_module.def(
+      "infer_scaled_contraction_dimensions",
+      &ireeCodegenInferScaledContractionDimensions,
+      "Infers the scaled contraction dimensions for a given operation.",
+      py::arg("op"));
 }
diff --git a/compiler/bindings/python/test/api/tuner_api_test.py b/compiler/bindings/python/test/api/tuner_api_test.py
index e59813f..7387a4e 100644
--- a/compiler/bindings/python/test/api/tuner_api_test.py
+++ b/compiler/bindings/python/test/api/tuner_api_test.py
@@ -77,18 +77,10 @@
 def attention_op_detail():
     dim_exprs = [affine.AffineDimExpr.get(i) for i in range(5)]
 
-    q_map = affine.AffineMap.get(
-        5, 0, [dim_exprs[0], dim_exprs[1], dim_exprs[2]]
-    )  # (d0, d1, d2).
-    k_map = affine.AffineMap.get(
-        5, 0, [dim_exprs[0], dim_exprs[3], dim_exprs[2]]
-    )  # (d0, d3, d2).
-    v_map = affine.AffineMap.get(
-        5, 0, [dim_exprs[0], dim_exprs[3], dim_exprs[4]]
-    )  # (d0, d3, d4).                                      # ()
-    o_map = affine.AffineMap.get(
-        5, 0, [dim_exprs[0], dim_exprs[1], dim_exprs[4]]
-    )  # (d0, d1, d4).
+    q_map = affine.AffineMap.get(5, 0, [dim_exprs[0], dim_exprs[1], dim_exprs[2]])
+    k_map = affine.AffineMap.get(5, 0, [dim_exprs[0], dim_exprs[3], dim_exprs[2]])
+    v_map = affine.AffineMap.get(5, 0, [dim_exprs[0], dim_exprs[3], dim_exprs[4]])
+    o_map = affine.AffineMap.get(5, 0, [dim_exprs[0], dim_exprs[1], dim_exprs[4]])
 
     result = iree_codegen.get_attention_op_detail(q_map, k_map, v_map, o_map)
 
@@ -102,10 +94,10 @@
     dim_exprs = [affine.AffineDimExpr.get(i) for i in range(4)]
 
     # Input affine maps that do not follow the expected pattern for an attention operation.
-    q_map = affine.AffineMap.get(4, 0, [dim_exprs[0], dim_exprs[1]])  # (d0, d1).
-    k_map = affine.AffineMap.get(4, 0, [dim_exprs[0], dim_exprs[2]])  # (d0, d2).
-    v_map = affine.AffineMap.get(4, 0, [dim_exprs[0], dim_exprs[3]])  # (d0, d3).
-    o_map = affine.AffineMap.get(4, 0, [dim_exprs[0], dim_exprs[1]])  # (d0, d1).
+    q_map = affine.AffineMap.get(4, 0, [dim_exprs[0], dim_exprs[1]])
+    k_map = affine.AffineMap.get(4, 0, [dim_exprs[0], dim_exprs[2]])
+    v_map = affine.AffineMap.get(4, 0, [dim_exprs[0], dim_exprs[3]])
+    o_map = affine.AffineMap.get(4, 0, [dim_exprs[0], dim_exprs[1]])
 
     result = iree_codegen.get_attention_op_detail(q_map, k_map, v_map, o_map)
     assert result.domain_rank == 4
@@ -336,3 +328,220 @@
 
     details = iree_codegen.get_igemm_generic_conv_details(matmul_op)
     assert details is None, "IGEMM details should be None for non-conv operation"
+
+
+@run
+def test_isa_scaled_contraction_op():
+    # Test 1: Regular matmul is not a scaled contraction.
+    module_str = """
+        module {
+            func.func @matmul(%arg0: tensor<4x4xf32>, %arg1: tensor<4x4xf32>, %arg2: tensor<4x4xf32>) -> tensor<4x4xf32> {
+                %0 = linalg.matmul { root_op } ins(%arg0, %arg1 : tensor<4x4xf32>, tensor<4x4xf32>) outs(%arg2 : tensor<4x4xf32>) -> tensor<4x4xf32>
+                return %0 : tensor<4x4xf32>
+            }
+        }
+    """
+    input_module = ir.Module.parse(module_str)
+    assert input_module is not None, "Failed to parse input MLIR module"
+    root_op_list = iree_codegen.get_tuner_root_ops(input_module)
+    assert len(root_op_list) == 1
+    matmul_op = root_op_list[0]
+
+    assert not iree_codegen.isa_scaled_contraction_op(
+        matmul_op
+    ), "Regular matmul should not be a scaled contraction"
+
+    # Test 2: Fill op is not a scaled contraction.
+    module_str = """
+        module {
+            func.func @fill(%arg0: tensor<4x4xf32>) -> tensor<4x4xf32> {
+                %cst = arith.constant 0.000000e+00 : f32
+                %0 = linalg.fill { root_op } ins(%cst : f32) outs(%arg0 : tensor<4x4xf32>) -> tensor<4x4xf32>
+                return %0 : tensor<4x4xf32>
+            }
+        }
+    """
+    input_module = ir.Module.parse(module_str)
+    root_op_list = iree_codegen.get_tuner_root_ops(input_module)
+    assert len(root_op_list) == 1
+    fill_op = root_op_list[0]
+
+    assert not iree_codegen.isa_scaled_contraction_op(
+        fill_op
+    ), "Fill op should not be a scaled contraction"
+
+    # Test 3: Scaled matmul as linalg.generic should be detected.
+    # Pattern: linalg.generic with 5 indexing maps (lhs, rhs, lhs_scale, rhs_scale, output),
+    # and 4 iterator types (2 parallel for M,N; 2 reduction for Ko,Kb).
+    # Uses f4E2M1FN for operands and f8E8M0FNU for scales (matching real scaled matmul pattern).
+    module_str = """
+        module {
+            func.func @scaled_matmul(%lhs: tensor<16x4x32xf4E2M1FN>, %rhs: tensor<16x4x32xf4E2M1FN>,
+                                     %lhs_scales: tensor<16x4xf8E8M0FNU>, %rhs_scales: tensor<16x4xf8E8M0FNU>,
+                                     %out: tensor<16x16xf32>) -> tensor<16x16xf32> {
+                %result = linalg.generic {
+                    indexing_maps = [
+                        affine_map<(d0, d1, d2, d3) -> (d0, d2, d3)>,
+                        affine_map<(d0, d1, d2, d3) -> (d1, d2, d3)>,
+                        affine_map<(d0, d1, d2, d3) -> (d0, d2)>,
+                        affine_map<(d0, d1, d2, d3) -> (d1, d2)>,
+                        affine_map<(d0, d1, d2, d3) -> (d0, d1)>
+                    ],
+                    iterator_types = ["parallel", "parallel", "reduction", "reduction"],
+                    root_op
+                } ins(%lhs, %rhs, %lhs_scales, %rhs_scales : tensor<16x4x32xf4E2M1FN>, tensor<16x4x32xf4E2M1FN>, tensor<16x4xf8E8M0FNU>, tensor<16x4xf8E8M0FNU>)
+                  outs(%out : tensor<16x16xf32>) {
+                ^bb0(%a: f4E2M1FN, %b: f4E2M1FN, %a_scale: f8E8M0FNU, %b_scale: f8E8M0FNU, %acc: f32):
+                    %a_scaled = arith.scaling_extf %a, %a_scale : f4E2M1FN, f8E8M0FNU to f32
+                    %b_scaled = arith.scaling_extf %b, %b_scale : f4E2M1FN, f8E8M0FNU to f32
+                    %prod = arith.mulf %a_scaled, %b_scaled : f32
+                    %sum = arith.addf %acc, %prod : f32
+                    linalg.yield %sum : f32
+                } -> tensor<16x16xf32>
+                return %result : tensor<16x16xf32>
+            }
+        }
+    """
+    input_module = ir.Module.parse(module_str)
+    root_op_list = iree_codegen.get_tuner_root_ops(input_module)
+    assert len(root_op_list) == 1, "Should have one root op"
+
+    scaled_generic_op = root_op_list[0]
+    is_scaled = iree_codegen.isa_scaled_contraction_op(scaled_generic_op)
+    assert (
+        is_scaled
+    ), "linalg.generic with scaled matmul pattern should be detected as scaled contraction"
+
+    dims = iree_codegen.infer_scaled_contraction_dimensions(scaled_generic_op)
+    assert dims is not None, "Should be able to infer dimensions for scaled contraction"
+
+    assert dims.m == [0], f"Got {dims.m}"
+    assert dims.n == [1], f"Got {dims.n}"
+    assert dims.k == [2], f"Got {dims.k}"
+    assert dims.kB == [3], f"Got {dims.kB}"
+    assert dims.batch == [], f"Got {dims.batch}"
+
+
+@run
+def test_infer_scaled_contraction_dimensions():
+    # Test 1: Verify dimension inference on a scaled matmul operation.
+    module_str = """
+        module {
+            func.func @scaled_matmul(%lhs: tensor<16x4x32xf4E2M1FN>, %rhs: tensor<16x4x32xf4E2M1FN>,
+                                     %lhs_scales: tensor<16x4xf8E8M0FNU>, %rhs_scales: tensor<16x4xf8E8M0FNU>,
+                                     %out: tensor<16x16xf32>) -> tensor<16x16xf32> {
+                %result = linalg.generic {
+                    indexing_maps = [
+                        affine_map<(d0, d1, d2, d3) -> (d0, d2, d3)>,
+                        affine_map<(d0, d1, d2, d3) -> (d1, d2, d3)>,
+                        affine_map<(d0, d1, d2, d3) -> (d0, d2)>,
+                        affine_map<(d0, d1, d2, d3) -> (d1, d2)>,
+                        affine_map<(d0, d1, d2, d3) -> (d0, d1)>
+                    ],
+                    iterator_types = ["parallel", "parallel", "reduction", "reduction"],
+                    root_op
+                } ins(%lhs, %rhs, %lhs_scales, %rhs_scales : tensor<16x4x32xf4E2M1FN>, tensor<16x4x32xf4E2M1FN>, tensor<16x4xf8E8M0FNU>, tensor<16x4xf8E8M0FNU>)
+                  outs(%out : tensor<16x16xf32>) {
+                ^bb0(%a: f4E2M1FN, %b: f4E2M1FN, %a_scale: f8E8M0FNU, %b_scale: f8E8M0FNU, %acc: f32):
+                    %a_scaled = arith.scaling_extf %a, %a_scale : f4E2M1FN, f8E8M0FNU to f32
+                    %b_scaled = arith.scaling_extf %b, %b_scale : f4E2M1FN, f8E8M0FNU to f32
+                    %prod = arith.mulf %a_scaled, %b_scaled : f32
+                    %sum = arith.addf %acc, %prod : f32
+                    linalg.yield %sum : f32
+                } -> tensor<16x16xf32>
+                return %result : tensor<16x16xf32>
+            }
+        }
+    """
+    input_module = ir.Module.parse(module_str)
+    root_op_list = iree_codegen.get_tuner_root_ops(input_module)
+    assert len(root_op_list) == 1, "Should have exactly one root op"
+    scaled_op = root_op_list[0]
+
+    assert iree_codegen.isa_scaled_contraction_op(
+        scaled_op
+    ), "Operation should be recognized as scaled contraction"
+
+    dims = iree_codegen.infer_scaled_contraction_dimensions(scaled_op)
+    assert dims is not None, "Should successfully infer dimensions"
+    assert dims.m == [0], f"Got {dims.m}"
+    assert dims.n == [1], f"Got {dims.n}"
+    assert dims.k == [2], f"Got {dims.k}"
+    assert dims.kB == [3], f"Got {dims.kB}"
+    assert dims.batch == [], f"Got {dims.batch}"
+
+    # Test 2: Non-scaled contraction should return None.
+    module_str_regular = """
+        module {
+            func.func @regular_matmul(%arg0: tensor<4x4xf32>, %arg1: tensor<4x4xf32>, %arg2: tensor<4x4xf32>) -> tensor<4x4xf32> {
+                %0 = linalg.matmul { root_op } ins(%arg0, %arg1 : tensor<4x4xf32>, tensor<4x4xf32>) outs(%arg2 : tensor<4x4xf32>) -> tensor<4x4xf32>
+                return %0 : tensor<4x4xf32>
+            }
+        }
+    """
+    input_module_regular = ir.Module.parse(module_str_regular)
+    regular_ops = iree_codegen.get_tuner_root_ops(input_module_regular)
+    assert len(regular_ops) == 1
+    regular_matmul = regular_ops[0]
+
+    # Regular matmul should not have scaled contraction dimensions.
+    # Check if all dimensions are empty (indicating it's not a scaled contraction).
+    dims_regular = iree_codegen.infer_scaled_contraction_dimensions(regular_matmul)
+    if dims_regular is not None:
+        all_empty = (
+            len(dims_regular.m) == 0
+            and len(dims_regular.n) == 0
+            and len(dims_regular.k) == 0
+            and len(dims_regular.kB) == 0
+            and len(dims_regular.batch) == 0
+        )
+        assert (
+            all_empty or dims_regular is None
+        ), "Regular matmul should not have valid scaled contraction dimensions"
+
+    # Test 3: Batched scaled matmul.
+    module_str_batched = """
+        module {
+            func.func @batched_scaled_matmul(%lhs: tensor<8x16x4x32xf4E2M1FN>, %rhs: tensor<8x16x4x32xf4E2M1FN>,
+                                             %lhs_scales: tensor<8x16x4xf8E8M0FNU>, %rhs_scales: tensor<8x16x4xf8E8M0FNU>,
+                                             %out: tensor<8x16x16xf32>) -> tensor<8x16x16xf32> {
+                %result = linalg.generic {
+                    indexing_maps = [
+                        affine_map<(d0, d1, d2, d3, d4) -> (d0, d1, d3, d4)>,
+                        affine_map<(d0, d1, d2, d3, d4) -> (d0, d2, d3, d4)>,
+                        affine_map<(d0, d1, d2, d3, d4) -> (d0, d1, d3)>,
+                        affine_map<(d0, d1, d2, d3, d4) -> (d0, d2, d3)>,
+                        affine_map<(d0, d1, d2, d3, d4) -> (d0, d1, d2)>
+                    ],
+                    iterator_types = ["parallel", "parallel", "parallel", "reduction", "reduction"],
+                    root_op
+                } ins(%lhs, %rhs, %lhs_scales, %rhs_scales : tensor<8x16x4x32xf4E2M1FN>, tensor<8x16x4x32xf4E2M1FN>, tensor<8x16x4xf8E8M0FNU>, tensor<8x16x4xf8E8M0FNU>)
+                  outs(%out : tensor<8x16x16xf32>) {
+                ^bb0(%a: f4E2M1FN, %b: f4E2M1FN, %a_scale: f8E8M0FNU, %b_scale: f8E8M0FNU, %acc: f32):
+                    %a_scaled = arith.scaling_extf %a, %a_scale : f4E2M1FN, f8E8M0FNU to f32
+                    %b_scaled = arith.scaling_extf %b, %b_scale : f4E2M1FN, f8E8M0FNU to f32
+                    %prod = arith.mulf %a_scaled, %b_scaled : f32
+                    %sum = arith.addf %acc, %prod : f32
+                    linalg.yield %sum : f32
+                } -> tensor<8x16x16xf32>
+                return %result : tensor<8x16x16xf32>
+            }
+        }
+    """
+    input_module_batched = ir.Module.parse(module_str_batched)
+    batched_ops = iree_codegen.get_tuner_root_ops(input_module_batched)
+    assert len(batched_ops) == 1, "Batched op should be found"
+    batched_op = batched_ops[0]
+    assert iree_codegen.isa_scaled_contraction_op(
+        batched_op
+    ), "Batched scaled matmul should be recognized"
+
+    dims_batched = iree_codegen.infer_scaled_contraction_dimensions(batched_op)
+    assert (
+        dims_batched is not None
+    ), "Batch dimension must be present in batched scaled matmul"
+    assert dims_batched.batch == [0], f"Got {dims_batched.batch}"
+    assert dims_batched.m == [1], f"Got {dims_batched.m}"
+    assert dims_batched.n == [2], f"Got {dims_batched.n}"
+    assert dims_batched.k == [3], f"Got {dims_batched.k}"
+    assert dims_batched.kB == [4], f"Got {dims_batched.kB}"
diff --git a/compiler/src/iree/compiler/API/Internal/IREECodegenDialectCAPI.cpp b/compiler/src/iree/compiler/API/Internal/IREECodegenDialectCAPI.cpp
index 619f40d..271fb33 100644
--- a/compiler/src/iree/compiler/API/Internal/IREECodegenDialectCAPI.cpp
+++ b/compiler/src/iree/compiler/API/Internal/IREECodegenDialectCAPI.cpp
@@ -13,6 +13,7 @@
 #include "iree/compiler/Codegen/Utils/GPUUtils.h"
 #include "iree/compiler/Dialect/LinalgExt/IR/LinalgExtOps.h"
 #include "iree/compiler/Dialect/LinalgExt/Utils/IndexingUtils.h"
+#include "iree/compiler/Dialect/LinalgExt/Utils/MatchUtils.h"
 #include "iree/compiler/Dialect/LinalgExt/Utils/Utils.h"
 #include "iree/compiler/dialects/iree_codegen.h"
 #include "mlir-c/BuiltinAttributes.h"
@@ -320,3 +321,46 @@
 
   return result;
 }
+
+bool ireeCodegenMlirOperationIsAScaledContractionOp(MlirOperation op) {
+  auto linalgOp = llvm::cast<mlir::linalg::LinalgOp>(unwrap(op));
+  return mlir::iree_compiler::IREE::LinalgExt::isaScaledContractionOpInterface(
+      linalgOp);
+}
+
+ireeCodegenScaledContractionDimensions
+ireeCodegenInferScaledContractionDimensions(MlirOperation op) {
+  ireeCodegenScaledContractionDimensions result{};
+  auto linalgOp = llvm::dyn_cast<mlir::linalg::LinalgOp>(unwrap(op));
+  if (!linalgOp) {
+    return result;
+  }
+
+  llvm::FailureOr<
+      mlir::iree_compiler::IREE::LinalgExt::ScaledContractionDimensions>
+      maybeDims =
+          mlir::iree_compiler::IREE::LinalgExt::inferScaledContractionDims(
+              linalgOp);
+  if (failed(maybeDims)) {
+    return result;
+  }
+
+  const mlir::iree_compiler::IREE::LinalgExt::ScaledContractionDimensions
+      &scaledContractionDims = *maybeDims;
+  mlir::MLIRContext *ctx = linalgOp.getContext();
+  mlir::Builder b(ctx);
+  auto toAttr = [&b](llvm::ArrayRef<unsigned> vals) -> MlirAttribute {
+    llvm::SmallVector<mlir::Attribute, 2> attrs =
+        llvm::map_to_vector(vals, [&b](unsigned val) -> mlir::Attribute {
+          return b.getI32IntegerAttr(val);
+        });
+    return wrap(b.getArrayAttr(attrs));
+  };
+
+  result.batch = toAttr(scaledContractionDims.batch);
+  result.m = toAttr(scaledContractionDims.m);
+  result.n = toAttr(scaledContractionDims.n);
+  result.k = toAttr(scaledContractionDims.k);
+  result.kB = toAttr(scaledContractionDims.kB);
+  return result;
+}
diff --git a/compiler/src/iree/compiler/API/api_exports.c b/compiler/src/iree/compiler/API/api_exports.c
index 10f86ca..edd1225 100644
--- a/compiler/src/iree/compiler/API/api_exports.c
+++ b/compiler/src/iree/compiler/API/api_exports.c
@@ -30,7 +30,9 @@
 extern void ireeGPUGetSingleSubgroupLayout();
 extern void ireeCodegenGetTunerRootOps();
 extern void ireeCodegenGetAttentionOpDetail();
+extern void ireeCodegenInferScaledContractionDimensions();
 extern void ireeCodegenMlirOperationIsACodegenAttentionOp();
+extern void ireeCodegenMlirOperationIsAScaledContractionOp();
 extern void ireeCodegenHasIGEMMGenericConvDetails();
 extern void ireeCodegenGetIGEMMGenericConvDetails();
 extern void ireeCodegenTranslationInfoAttrGet();
@@ -949,7 +951,9 @@
   x += (uintptr_t)&ireeGPUGetSingleSubgroupLayout;
   x += (uintptr_t)&ireeCodegenGetTunerRootOps;
   x += (uintptr_t)&ireeCodegenGetAttentionOpDetail;
+  x += (uintptr_t)&ireeCodegenInferScaledContractionDimensions;
   x += (uintptr_t)&ireeCodegenMlirOperationIsACodegenAttentionOp;
+  x += (uintptr_t)&ireeCodegenMlirOperationIsAScaledContractionOp;
   x += (uintptr_t)&ireeCodegenHasIGEMMGenericConvDetails;
   x += (uintptr_t)&ireeCodegenGetIGEMMGenericConvDetails;
   x += (uintptr_t)&ireeCodegenTranslationInfoAttrGet;
diff --git a/compiler/src/iree/compiler/API/api_exports.def b/compiler/src/iree/compiler/API/api_exports.def
index 110fbbf..4472e8a 100644
--- a/compiler/src/iree/compiler/API/api_exports.def
+++ b/compiler/src/iree/compiler/API/api_exports.def
@@ -20,7 +20,9 @@
   ireeGPUGetSingleSubgroupLayout
   ireeCodegenGetTunerRootOps
   ireeCodegenGetAttentionOpDetail
+  ireeCodegenInferScaledContractionDimensions
   ireeCodegenMlirOperationIsACodegenAttentionOp
+  ireeCodegenMlirOperationIsAScaledContractionOp
   ireeCodegenHasIGEMMGenericConvDetails
   ireeCodegenGetIGEMMGenericConvDetails
   ireeCodegenTranslationInfoAttrGet
diff --git a/compiler/src/iree/compiler/API/api_exports.ld b/compiler/src/iree/compiler/API/api_exports.ld
index 92ff2ba..2bb3132 100644
--- a/compiler/src/iree/compiler/API/api_exports.ld
+++ b/compiler/src/iree/compiler/API/api_exports.ld
@@ -21,7 +21,9 @@
     ireeGPUGetSingleSubgroupLayout;
     ireeCodegenGetTunerRootOps;
     ireeCodegenGetAttentionOpDetail;
+    ireeCodegenInferScaledContractionDimensions;
     ireeCodegenMlirOperationIsACodegenAttentionOp;
+    ireeCodegenMlirOperationIsAScaledContractionOp;
     ireeCodegenHasIGEMMGenericConvDetails;
     ireeCodegenGetIGEMMGenericConvDetails;
     ireeCodegenTranslationInfoAttrGet;
diff --git a/compiler/src/iree/compiler/API/api_exports.macos.lst b/compiler/src/iree/compiler/API/api_exports.macos.lst
index bf8ad1a..564b434 100644
--- a/compiler/src/iree/compiler/API/api_exports.macos.lst
+++ b/compiler/src/iree/compiler/API/api_exports.macos.lst
@@ -19,7 +19,9 @@
 _ireeGPUGetSingleSubgroupLayout
 _ireeCodegenGetTunerRootOps
 _ireeCodegenGetAttentionOpDetail
+_ireeCodegenInferScaledContractionDimensions
 _ireeCodegenMlirOperationIsACodegenAttentionOp
+_ireeCodegenMlirOperationIsAScaledContractionOp
 _ireeCodegenHasIGEMMGenericConvDetails
 _ireeCodegenGetIGEMMGenericConvDetails
 _ireeCodegenTranslationInfoAttrGet