[clang] [CIR] Add support for the IdiomRecognizer pass (PR #208854)

Rithik Sharma via cfe-commits cfe-commits at lists.llvm.org
Mon Jul 13 21:01:48 PDT 2026


================
@@ -39,58 +30,94 @@ namespace mlir {
 
 namespace {
 
+// The raised operation requires matching operand types. The searched value
+// arrives by reference and must share the iterator type.
+template <typename TargetOp> bool operandTypesMatch(CallOp call);
+
+template <> bool operandTypesMatch<StdFindOp>(CallOp call) {
+  mlir::Type iterTy = call.getOperand(0).getType();
+  return iterTy == call.getOperand(1).getType() &&
+         iterTy == call.getOperand(2).getType() &&
+         iterTy == call->getResult(0).getType();
+}
+
+// Raises a direct cir.call to `TargetOp` when the callee carries the
+// matching identity tag.
+template <typename TargetOp> class StdRecognizer {
+  template <size_t... Indices>
+  static TargetOp buildCall(cir::CIRBaseBuilderTy &builder, CallOp call,
+                            std::index_sequence<Indices...>) {
+    return TargetOp::create(builder, call.getLoc(),
+                            call->getResult(0).getType(),
+                            call.getOperand(Indices)..., call.getCalleeAttr());
+  }
+
+public:
+  static bool raise(CallOp call, mlir::MLIRContext &context,
+                    mlir::SymbolTableCollection &symbolTables) {
+    // A musttail call must stay a call, so it is never raised.
+    constexpr unsigned numArgs = TargetOp::getNumArgs();
+    if (!call.getCallee() || call.getNumOperands() != numArgs ||
+        call->getNumResults() != 1 || call.getMusttail() ||
+        !operandTypesMatch<TargetOp>(call))
----------------
SharmaRithik wrote:

Done, moved the count checks.

https://github.com/llvm/llvm-project/pull/208854


More information about the cfe-commits mailing list