[Mlir-commits] [mlir] [mlir] Fix UB in comparator lambdas in getRegisteredOperationsByDialect (PR #186428)

Mehdi Amini llvmlistbot at llvm.org
Fri Mar 13 09:09:44 PDT 2026


https://github.com/joker-eph updated https://github.com/llvm/llvm-project/pull/186428

>From 587b97c6f6dd988925db2505d034eb23ebb46d9a Mon Sep 17 00:00:00 2001
From: Mehdi Amini <joker.eph at gmail.com>
Date: Fri, 13 Mar 2026 08:03:57 -0700
Subject: [PATCH] [mlir] Fix comparator lambdas in
 getRegisteredOperationsByDialect

Fix `getRegisteredOperationsByDialect` comparators to return `bool` instead of incorrectly using `StringRef::compare()` return values as booleans, which violated strict weak ordering.

Fixes #146940

Assisted-by: Claude Code
---
 mlir/lib/IR/MLIRContext.cpp | 17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)

diff --git a/mlir/lib/IR/MLIRContext.cpp b/mlir/lib/IR/MLIRContext.cpp
index 73219c6917061..caf877cc89a57 100644
--- a/mlir/lib/IR/MLIRContext.cpp
+++ b/mlir/lib/IR/MLIRContext.cpp
@@ -710,19 +710,20 @@ ArrayRef<RegisteredOperationName> MLIRContext::getRegisteredOperations() {
 ArrayRef<RegisteredOperationName>
 MLIRContext::getRegisteredOperationsByDialect(StringRef dialectName) {
   auto *lowerBound = llvm::lower_bound(
-      impl->sortedRegisteredOperations, dialectName, [](auto &lhs, auto &rhs) {
-        return lhs.getDialect().getNamespace().compare(rhs);
+      impl->sortedRegisteredOperations, dialectName,
+      [](const RegisteredOperationName &lhs, StringRef rhs) {
+        return lhs.getDialect().getNamespace() < rhs;
       });
 
   if (lowerBound == impl->sortedRegisteredOperations.end() ||
       lowerBound->getDialect().getNamespace() != dialectName)
     return ArrayRef<RegisteredOperationName>();
 
-  auto *upperBound =
-      std::upper_bound(lowerBound, impl->sortedRegisteredOperations.end(),
-                       dialectName, [](auto &lhs, auto &rhs) {
-                         return lhs.compare(rhs.getDialect().getNamespace());
-                       });
+  auto *upperBound = std::upper_bound(
+      lowerBound, impl->sortedRegisteredOperations.end(), dialectName,
+      [](StringRef lhs, const RegisteredOperationName &rhs) {
+        return lhs < rhs.getDialect().getNamespace();
+      });
 
   size_t count = std::distance(lowerBound, upperBound);
   return ArrayRef(&*lowerBound, count);
@@ -999,7 +1000,7 @@ void RegisteredOperationName::insert(
       llvm::upper_bound(ctxImpl.sortedRegisteredOperations, value,
                         [](auto &lhs, auto &rhs) {
                           return lhs.getIdentifier().compare(
-                              rhs.getIdentifier());
+                                     rhs.getIdentifier()) < 0;
                         }),
       value);
 }



More information about the Mlir-commits mailing list