llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang @llvm/pr-subscribers-clangir Author: Hendrik Hübner (HendrikHuebner) <details> <summary>Changes</summary> This PR Upstreams the Idiom Recognizer pass cc @<!-- -->bcardosolopes --- Full diff: https://github.com/llvm/llvm-project/pull/172486.diff 6 Files Affected: - (modified) clang/include/clang/CIR/Dialect/Passes.h (+2) - (modified) clang/include/clang/CIR/Dialect/Passes.td (+11) - (modified) clang/lib/CIR/Dialect/Transforms/CMakeLists.txt (+1) - (added) clang/lib/CIR/Dialect/Transforms/IdiomRecognizer.cpp (+69) - (modified) clang/lib/CIR/Lowering/CIRPasses.cpp (+1) - (added) clang/test/CIR/Transforms/idiom-recognizer.cpp (+2) ``````````diff 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) `````````` </details> https://github.com/llvm/llvm-project/pull/172486 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
