[Mlir-commits] [mlir] [mlir][rocdl] Add `InferIntRangeInterface` to readlane operations. (PR #183610)

Erick Ochoa Lopez llvmlistbot at llvm.org
Thu Feb 26 11:52:20 PST 2026


https://github.com/amd-eochoalo created https://github.com/llvm/llvm-project/pull/183610

Will allow integer range analysis to work for these operations.

>From b2ddf8d20566466c850e1ea9275ca381338c17ba Mon Sep 17 00:00:00 2001
From: Erick Ochoa <erick.ochoalopez at amd.com>
Date: Thu, 26 Feb 2026 14:43:42 -0500
Subject: [PATCH 1/2] [mlir][rocdl] Add InferIntRangeInterface to readlane
 operations.

---
 .../mlir/Dialect/LLVMIR/ROCDLDialect.h        |  1 +
 mlir/include/mlir/Dialect/LLVMIR/ROCDLOps.td  | 27 +++++++++++++++++--
 mlir/lib/Dialect/LLVMIR/CMakeLists.txt        |  1 +
 3 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/mlir/include/mlir/Dialect/LLVMIR/ROCDLDialect.h b/mlir/include/mlir/Dialect/LLVMIR/ROCDLDialect.h
index ce1fe5a03c494..1474b612afd3a 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/ROCDLDialect.h
+++ b/mlir/include/mlir/Dialect/LLVMIR/ROCDLDialect.h
@@ -26,6 +26,7 @@
 #include "mlir/Dialect/LLVMIR/LLVMDialect.h"
 #include "mlir/IR/Dialect.h"
 #include "mlir/IR/OpDefinition.h"
+#include "mlir/Interfaces/InferIntRangeInterface.h"
 #include "mlir/Interfaces/SideEffectInterfaces.h"
 
 ///// Ops /////
diff --git a/mlir/include/mlir/Dialect/LLVMIR/ROCDLOps.td b/mlir/include/mlir/Dialect/LLVMIR/ROCDLOps.td
index 1f2d472611120..a46118f30ae97 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/ROCDLOps.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/ROCDLOps.td
@@ -15,6 +15,7 @@
 
 include "mlir/Dialect/GPU/IR/CompilationAttrInterfaces.td"
 include "mlir/Dialect/LLVMIR/LLVMOpBase.td"
+include "mlir/Interfaces/InferIntRangeInterface.td"
 include "mlir/Interfaces/SideEffectInterfaces.td"
 
 //===----------------------------------------------------------------------===//
@@ -381,7 +382,10 @@ def ROCDL_BallotOp :
   let assemblyFormat = "$pred attr-dict `:` type($res)";
 }
 
-def ROCDL_ReadfirstlaneOp : ROCDL_IntrOp<"readfirstlane", [], [0], [AllTypesMatch<["res", "src"]>], 1>,
+def ROCDL_ReadfirstlaneOp : ROCDL_IntrOp<"readfirstlane", [], [0],
+  [AllTypesMatch<["res", "src"]>,
+   DeclareOpInterfaceMethods<InferIntRangeInterface, ["inferResultRanges"]>],
+  1>,
   Arguments<(ins LLVM_Type:$src)> {
   let results = (outs LLVM_Type:$res);
   let summary = "Get the value in first active lane.";
@@ -402,9 +406,20 @@ def ROCDL_ReadfirstlaneOp : ROCDL_IntrOp<"readfirstlane", [], [0], [AllTypesMatc
   let assemblyFormat = [{
     $src attr-dict `:` type($res)
   }];
+
+  let extraClassDefinition = [{
+    void $cppClass::inferResultRanges(
+        ArrayRef<::mlir::ConstantIntRanges> argRanges,
+        SetIntRangeFn setResultRanges) {
+      setResultRanges(getResult(), argRanges[0]);
+    }
+  }];
 }
 
-def ROCDL_ReadlaneOp : ROCDL_IntrOp<"readlane", [], [0], [AllTypesMatch<["res", "src0"]>], 1>,
+def ROCDL_ReadlaneOp : ROCDL_IntrOp<"readlane", [], [0],
+  [AllTypesMatch<["res", "src0"]>,
+   DeclareOpInterfaceMethods<InferIntRangeInterface, ["inferResultRanges"]>],
+  1>,
   Arguments<(ins LLVM_Type:$src0,
                  I32:$src1)> {
   let results = (outs LLVM_Type:$res);
@@ -426,6 +441,14 @@ def ROCDL_ReadlaneOp : ROCDL_IntrOp<"readlane", [], [0], [AllTypesMatch<["res",
   let assemblyFormat = [{
     $src0 `,` $src1  attr-dict `:` `(` type($src0) `,` type($src1) `)` `->` type($res)
   }];
+
+  let extraClassDefinition = [{
+    void $cppClass::inferResultRanges(
+        ArrayRef<::mlir::ConstantIntRanges> argRanges,
+        SetIntRangeFn setResultRanges) {
+      setResultRanges(getResult(), argRanges[0]);
+    }
+  }];
 }
 
 //===----------------------------------------------------------------------===//
diff --git a/mlir/lib/Dialect/LLVMIR/CMakeLists.txt b/mlir/lib/Dialect/LLVMIR/CMakeLists.txt
index 21b60ae747a71..9aff8bbc15c76 100644
--- a/mlir/lib/Dialect/LLVMIR/CMakeLists.txt
+++ b/mlir/lib/Dialect/LLVMIR/CMakeLists.txt
@@ -86,6 +86,7 @@ add_mlir_dialect_library(MLIRROCDLDialect
   Core
 
   LINK_LIBS PUBLIC
+  MLIRInferIntRangeInterface
   MLIRIR
   MLIRLLVMDialect
   MLIRSideEffectInterfaces

>From ae4ebb2835ea6b7c268219f81c4b20cfaf7cade2 Mon Sep 17 00:00:00 2001
From: Erick Ochoa <erick.ochoalopez at amd.com>
Date: Thu, 26 Feb 2026 14:49:55 -0500
Subject: [PATCH 2/2] Add test

---
 .../LLVMIR/rocdl-int-range-interface.mlir     | 21 +++++++++++++++++++
 1 file changed, 21 insertions(+)
 create mode 100644 mlir/test/Dialect/LLVMIR/rocdl-int-range-interface.mlir

diff --git a/mlir/test/Dialect/LLVMIR/rocdl-int-range-interface.mlir b/mlir/test/Dialect/LLVMIR/rocdl-int-range-interface.mlir
new file mode 100644
index 0000000000000..366df5656ec11
--- /dev/null
+++ b/mlir/test/Dialect/LLVMIR/rocdl-int-range-interface.mlir
@@ -0,0 +1,21 @@
+// RUN: mlir-opt -int-range-optimizations -split-input-file %s | FileCheck %s
+
+// CHECK-LABEL: func @readfirstlane
+// CHECK: test.reflect_bounds {smax = 10 : si32, smin = 0 : si32, umax = 10 : ui32, umin = 0 : ui32}
+func.func @readfirstlane() -> i32 {
+  %0 = test.with_bounds { umin = 0 : ui32, umax = 10 : ui32, smin = 0 : si32, smax = 10 : si32 } : i32
+  %1 = rocdl.readfirstlane %0 : i32
+  %2 = test.reflect_bounds %1 : i32
+  return %2 : i32
+}
+
+// -----
+
+// CHECK-LABEL: func @readlane
+// CHECK: test.reflect_bounds {smax = 10 : si32, smin = 0 : si32, umax = 10 : ui32, umin = 0 : ui32}
+func.func @readlane(%idx: i32) -> i32 {
+  %0 = test.with_bounds { umin = 0 : ui32, umax = 10 : ui32, smin = 0 : si32, smax = 10 : si32 } : i32
+  %1 = rocdl.readlane %0, %idx : (i32, i32) -> i32
+  %2 = test.reflect_bounds %1 : i32
+  return %2 : i32
+}



More information about the Mlir-commits mailing list