https://github.com/HendrikHuebner updated 
https://github.com/llvm/llvm-project/pull/172486

From f07734bfb75b4615a302d2697782af16f970aea9 Mon Sep 17 00:00:00 2001
From: hhuebner <[email protected]>
Date: Tue, 16 Dec 2025 15:02:32 +0100
Subject: [PATCH 1/2] Add idiom recognizer pass

---
 clang/include/clang/CIR/Dialect/Passes.h      |  2 +
 clang/include/clang/CIR/Dialect/Passes.td     | 11 +++
 .../lib/CIR/Dialect/Transforms/CMakeLists.txt |  1 +
 .../Dialect/Transforms/IdiomRecognizer.cpp    | 69 +++++++++++++++++++
 clang/lib/CIR/Lowering/CIRPasses.cpp          |  1 +
 .../test/CIR/Transforms/idiom-recognizer.cpp  |  2 +
 6 files changed, 86 insertions(+)
 create mode 100644 clang/lib/CIR/Dialect/Transforms/IdiomRecognizer.cpp
 create mode 100644 clang/test/CIR/Transforms/idiom-recognizer.cpp

diff --git a/clang/include/clang/CIR/Dialect/Passes.h 
b/clang/include/clang/CIR/Dialect/Passes.h
index 32c3e27d07dfb..d4d6f5e9ea853 100644
--- a/clang/include/clang/CIR/Dialect/Passes.h
+++ b/clang/include/clang/CIR/Dialect/Passes.h
@@ -27,6 +27,8 @@ std::unique_ptr<Pass> createHoistAllocasPass();
 std::unique_ptr<Pass> createLoweringPreparePass();
 std::unique_ptr<Pass> createLoweringPreparePass(clang::ASTContext *astCtx);
 std::unique_ptr<Pass> createGotoSolverPass();
+std::unique_ptr<Pass> createIdiomRecognizerPass();
+std::unique_ptr<Pass> createIdiomRecognizerPass(clang::ASTContext *astCtx);
 
 void populateCIRPreLoweringPasses(mlir::OpPassManager &pm);
 
diff --git a/clang/include/clang/CIR/Dialect/Passes.td 
b/clang/include/clang/CIR/Dialect/Passes.td
index 0f5783945f8ae..3531ff2c93751 100644
--- a/clang/include/clang/CIR/Dialect/Passes.td
+++ b/clang/include/clang/CIR/Dialect/Passes.td
@@ -93,4 +93,15 @@ def LoweringPrepare : Pass<"cir-lowering-prepare"> {
   let dependentDialects = ["cir::CIRDialect"];
 }
 
+def IdiomRecognizer : Pass<"cir-idiom-recognizer"> {
+  let summary = "Raise calls to C/C++ libraries to CIR operations";
+  let description = [{
+    This pass recognize idiomatic C++ usage and incorporate C++ standard
+    containers, library functions calls, and types into CIR operation,
+    attributes and types.
+  }];
+  let constructor = "mlir::createIdiomRecognizerPass()";
+  let dependentDialects = ["cir::CIRDialect"];
+}
+
 #endif // CLANG_CIR_DIALECT_PASSES_TD
diff --git a/clang/lib/CIR/Dialect/Transforms/CMakeLists.txt 
b/clang/lib/CIR/Dialect/Transforms/CMakeLists.txt
index 3fc5b06b74e4d..c721244707c19 100644
--- a/clang/lib/CIR/Dialect/Transforms/CMakeLists.txt
+++ b/clang/lib/CIR/Dialect/Transforms/CMakeLists.txt
@@ -6,6 +6,7 @@ add_clang_library(MLIRCIRTransforms
   LoweringPrepare.cpp
   LoweringPrepareItaniumCXXABI.cpp
   GotoSolver.cpp
+  IdiomRecognizer.cpp
 
   DEPENDS
   MLIRCIRPassIncGen
diff --git a/clang/lib/CIR/Dialect/Transforms/IdiomRecognizer.cpp 
b/clang/lib/CIR/Dialect/Transforms/IdiomRecognizer.cpp
new file mode 100644
index 0000000000000..ff1110f86ce8f
--- /dev/null
+++ b/clang/lib/CIR/Dialect/Transforms/IdiomRecognizer.cpp
@@ -0,0 +1,69 @@
+//===- IdiomRecognizer.cpp - pareparation work for LLVM lowering 
----------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This pass is responsible for recognizing idioms (such as uses of functions
+// and types to the C/C++ standard library) and replacing them with Clang IR
+// operators for later optimization.
+//
+//===----------------------------------------------------------------------===//
+
+#include "PassDetail.h"
+#include "mlir/Dialect/Func/IR/FuncOps.h"
+#include "mlir/IR/BuiltinAttributes.h"
+#include "mlir/IR/Region.h"
+#include "clang/AST/ASTContext.h"
+#include "clang/AST/Mangle.h"
+#include "clang/Basic/Module.h"
+#include "clang/CIR/Dialect/Builder/CIRBaseBuilder.h"
+#include "clang/CIR/Dialect/IR/CIRDialect.h"
+#include "clang/CIR/Dialect/Passes.h"
+#include "llvm/ADT/SmallVector.h"
+#include "llvm/ADT/StringMap.h"
+#include "llvm/ADT/StringRef.h"
+#include "llvm/ADT/Twine.h"
+#include "llvm/Support/ErrorHandling.h"
+#include "llvm/Support/Path.h"
+
+using namespace mlir;
+using namespace cir;
+
+namespace mlir {
+#define GEN_PASS_DEF_IDIOMRECOGNIZER
+#include "clang/CIR/Dialect/Passes.h.inc"
+} // namespace mlir
+
+namespace {
+
+struct IdiomRecognizerPass : public 
impl::IdiomRecognizerBase<IdiomRecognizerPass> {
+  IdiomRecognizerPass() = default;
+  void runOnOperation() override;
+
+  clang::ASTContext *astCtx;
+  void setASTContext(clang::ASTContext *c) { astCtx = c; }
+
+  /// Tracks current module.
+  ModuleOp theModule;
+};
+} // namespace
+
+void IdiomRecognizerPass::runOnOperation() {
+  auto *op = getOperation();
+  if (isa<::mlir::ModuleOp>(op))
+    theModule = cast<::mlir::ModuleOp>(op);
+}
+
+std::unique_ptr<Pass> mlir::createIdiomRecognizerPass() {
+  return std::make_unique<IdiomRecognizerPass>();
+}
+
+std::unique_ptr<Pass>
+mlir::createIdiomRecognizerPass(clang::ASTContext *astCtx) {
+  auto pass = std::make_unique<IdiomRecognizerPass>();
+  pass->setASTContext(astCtx);
+  return std::move(pass);
+}
\ No newline at end of file
diff --git a/clang/lib/CIR/Lowering/CIRPasses.cpp 
b/clang/lib/CIR/Lowering/CIRPasses.cpp
index ccc838717e421..db7a563183411 100644
--- a/clang/lib/CIR/Lowering/CIRPasses.cpp
+++ b/clang/lib/CIR/Lowering/CIRPasses.cpp
@@ -31,6 +31,7 @@ mlir::LogicalResult runCIRToCIRPasses(mlir::ModuleOp 
theModule,
   if (enableCIRSimplify)
     pm.addPass(mlir::createCIRSimplifyPass());
 
+  pm.addPass(mlir::createIdiomRecognizerPass());
   pm.addPass(mlir::createLoweringPreparePass(&astContext));
 
   pm.enableVerifier(enableVerifier);
diff --git a/clang/test/CIR/Transforms/idiom-recognizer.cpp 
b/clang/test/CIR/Transforms/idiom-recognizer.cpp
new file mode 100644
index 0000000000000..b309d813ace40
--- /dev/null
+++ b/clang/test/CIR/Transforms/idiom-recognizer.cpp
@@ -0,0 +1,2 @@
+// RUN: %clang_cc1 -fclangir -emit-cir -mmlir --mlir-print-ir-after-all %s -o 
%t.cir 2>&1 | FileCheck %s -check-prefix=CIR
+// CIR:  IR Dump After IdiomRecognizer (cir-idiom-recognizer)

From f3af243faa10e9671e3a817c76ad8477ecfb2aec Mon Sep 17 00:00:00 2001
From: hhuebner <[email protected]>
Date: Fri, 19 Dec 2025 22:05:40 +0100
Subject: [PATCH 2/2] fmt

---
 clang/include/clang/CIR/Dialect/Passes.td     |  8 +++---
 .../Dialect/Transforms/IdiomRecognizer.cpp    | 28 +++++++++++++++----
 2 files changed, 26 insertions(+), 10 deletions(-)

diff --git a/clang/include/clang/CIR/Dialect/Passes.td 
b/clang/include/clang/CIR/Dialect/Passes.td
index 3531ff2c93751..14e8e2e908947 100644
--- a/clang/include/clang/CIR/Dialect/Passes.td
+++ b/clang/include/clang/CIR/Dialect/Passes.td
@@ -93,12 +93,12 @@ def LoweringPrepare : Pass<"cir-lowering-prepare"> {
   let dependentDialects = ["cir::CIRDialect"];
 }
 
-def IdiomRecognizer : Pass<"cir-idiom-recognizer"> {
+def IdiomRecognizer : Pass<"cir-idiom-recognizer", "mlir::ModuleOp"> {
   let summary = "Raise calls to C/C++ libraries to CIR operations";
   let description = [{
-    This pass recognize idiomatic C++ usage and incorporate C++ standard
-    containers, library functions calls, and types into CIR operation,
-    attributes and types.
+    This pass recognizes idiomatic C++ usage and captures information about C++
+    standard library containers, library functions calls, and types into CIR
+    operations, attributes and types.
   }];
   let constructor = "mlir::createIdiomRecognizerPass()";
   let dependentDialects = ["cir::CIRDialect"];
diff --git a/clang/lib/CIR/Dialect/Transforms/IdiomRecognizer.cpp 
b/clang/lib/CIR/Dialect/Transforms/IdiomRecognizer.cpp
index ff1110f86ce8f..92c031a5a51e1 100644
--- a/clang/lib/CIR/Dialect/Transforms/IdiomRecognizer.cpp
+++ b/clang/lib/CIR/Dialect/Transforms/IdiomRecognizer.cpp
@@ -1,4 +1,4 @@
-//===- IdiomRecognizer.cpp - pareparation work for LLVM lowering 
----------===//
+//===- IdiomRecognizer.cpp - recognizing and raising idioms to CIR 
--------===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -39,10 +39,14 @@ namespace mlir {
 
 namespace {
 
-struct IdiomRecognizerPass : public 
impl::IdiomRecognizerBase<IdiomRecognizerPass> {
+struct IdiomRecognizerPass
+    : public impl::IdiomRecognizerBase<IdiomRecognizerPass> {
   IdiomRecognizerPass() = default;
+
   void runOnOperation() override;
 
+  void recognizeStandardLibraryCall(CallOp call);
+
   clang::ASTContext *astCtx;
   void setASTContext(clang::ASTContext *c) { astCtx = c; }
 
@@ -51,10 +55,22 @@ struct IdiomRecognizerPass : public 
impl::IdiomRecognizerBase<IdiomRecognizerPas
 };
 } // namespace
 
+void IdiomRecognizerPass::recognizeStandardLibraryCall(CallOp call) {
+  // To be implemented
+}
+
 void IdiomRecognizerPass::runOnOperation() {
-  auto *op = getOperation();
-  if (isa<::mlir::ModuleOp>(op))
-    theModule = cast<::mlir::ModuleOp>(op);
+  theModule = getOperation();
+
+  // Process call operations
+  theModule->walk([&](CallOp callOp) {
+    // Skip indirect calls.
+    std::optional<llvm::StringRef> callee = callOp.getCallee();
+    if (!callee)
+      return;
+
+    recognizeStandardLibraryCall(callOp);
+  });
 }
 
 std::unique_ptr<Pass> mlir::createIdiomRecognizerPass() {
@@ -66,4 +82,4 @@ mlir::createIdiomRecognizerPass(clang::ASTContext *astCtx) {
   auto pass = std::make_unique<IdiomRecognizerPass>();
   pass->setASTContext(astCtx);
   return std::move(pass);
-}
\ No newline at end of file
+}

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to