[clang] [CIR] Register only the LLVM IR translations CIR lowers to (PR #221797)

Fangrui Song via cfe-commits cfe-commits at lists.llvm.org
Mon Sep 7 10:57:30 PDT 2026


https://github.com/MaskRay created https://github.com/llvm/llvm-project/pull/221797

The ClangIR tests reach LLVM IR through mlir-translate, which links every
MLIR dialect and translation, so building check-clang builds most of MLIR.
Register mlir-to-llvmir in cir-translate over the same three dialects and
use it instead.

ninja check-clang drops from 6499 to 5853 build edges.

LLM-aided


>From bd01dc7f188277999b66097381578d0077a1c688 Mon Sep 17 00:00:00 2001
From: Fangrui Song <i at maskray.me>
Date: Sun, 6 Sep 2026 17:46:04 -0700
Subject: [PATCH] [CIR] Register only the LLVM IR translations CIR lowers to

The ClangIR tests reach LLVM IR through mlir-translate, which links every
MLIR dialect and translation, so building check-clang builds most of MLIR.
Register mlir-to-llvmir in cir-translate over the same three dialects and
use it instead.

ninja check-clang drops from 6499 to 5853 build edges.

LLM-aided
---
 clang/test/CIR/Lowering/lifetime.cir          |  2 +-
 .../test/CIR/Lowering/stack-save-restore.cir  |  2 +-
 .../byval-sret-arg-attr-lowering.cir          |  2 +-
 .../abi-lowering/extend-signed-arg.cir        |  2 +-
 .../Transforms/abi-lowering/x86_64-bitint.cir |  2 +-
 .../abi-lowering/x86_64-complex.cir           |  2 +-
 .../abi-lowering/x86_64-empty-class.cir       |  2 +-
 .../abi-lowering/x86_64-scalars.cir           |  2 +-
 .../abi-lowering/x86_64-struct-direct.cir     |  2 +-
 .../x86_64-union-coerce-shapes.cir            |  2 +-
 .../Transforms/abi-lowering/x86_64-union.cir  |  2 +-
 .../abi-lowering/x86_64-variadic-call.cir     |  2 +-
 .../Transforms/abi-lowering/x86_64-vector.cir |  2 +-
 .../Transforms/abi-lowering/x86_64-vptr.cir   |  2 +-
 .../abi-lowering/x86_64-wide-floats.cir       |  2 +-
 clang/test/CMakeLists.txt                     |  1 -
 clang/tools/cir-translate/CMakeLists.txt      | 14 +++----
 clang/tools/cir-translate/cir-translate.cpp   | 37 +++++++++++++++++--
 18 files changed, 56 insertions(+), 26 deletions(-)

diff --git a/clang/test/CIR/Lowering/lifetime.cir b/clang/test/CIR/Lowering/lifetime.cir
index 09a0f4b390cc8..4079fa609dcb5 100644
--- a/clang/test/CIR/Lowering/lifetime.cir
+++ b/clang/test/CIR/Lowering/lifetime.cir
@@ -1,4 +1,4 @@
-// RUN: cir-opt %s -cir-to-llvm -o - | mlir-translate -mlir-to-llvmir | FileCheck %s
+// RUN: cir-opt %s -cir-to-llvm -o - | cir-translate -mlir-to-llvmir | FileCheck %s
 
 !s32i = !cir.int<s, 32>
 
diff --git a/clang/test/CIR/Lowering/stack-save-restore.cir b/clang/test/CIR/Lowering/stack-save-restore.cir
index 9e30081e3f477..1f735abafc8af 100644
--- a/clang/test/CIR/Lowering/stack-save-restore.cir
+++ b/clang/test/CIR/Lowering/stack-save-restore.cir
@@ -1,5 +1,5 @@
 // RUN: cir-opt %s -cir-to-llvm -o - | FileCheck %s -check-prefix=MLIR
-// RUN: cir-opt %s -cir-to-llvm -o - | mlir-translate -mlir-to-llvmir | FileCheck %s -check-prefix=LLVM
+// RUN: cir-opt %s -cir-to-llvm -o - | cir-translate -mlir-to-llvmir | FileCheck %s -check-prefix=LLVM
 
 !u8i = !cir.int<u, 8>
 
diff --git a/clang/test/CIR/Transforms/abi-lowering/byval-sret-arg-attr-lowering.cir b/clang/test/CIR/Transforms/abi-lowering/byval-sret-arg-attr-lowering.cir
index 7f6a3ffb9d857..c280a85119998 100644
--- a/clang/test/CIR/Transforms/abi-lowering/byval-sret-arg-attr-lowering.cir
+++ b/clang/test/CIR/Transforms/abi-lowering/byval-sret-arg-attr-lowering.cir
@@ -2,7 +2,7 @@
 // RUN:   | FileCheck %s
 // RUN: cir-opt %s -cir-call-conv-lowering="classification-attr=test_classify" \
 // RUN:     -cir-to-llvm -o - 2>/dev/null \
-// RUN:   | mlir-translate -mlir-to-llvmir --allow-unregistered-dialect \
+// RUN:   | cir-translate -mlir-to-llvmir --allow-unregistered-dialect \
 // RUN:   | FileCheck %s --check-prefix=LLVM
 
 !s64i = !cir.int<s, 64>
diff --git a/clang/test/CIR/Transforms/abi-lowering/extend-signed-arg.cir b/clang/test/CIR/Transforms/abi-lowering/extend-signed-arg.cir
index 499db952ccf42..6798dcf88657d 100644
--- a/clang/test/CIR/Transforms/abi-lowering/extend-signed-arg.cir
+++ b/clang/test/CIR/Transforms/abi-lowering/extend-signed-arg.cir
@@ -2,7 +2,7 @@
 // RUN:   | FileCheck %s
 // RUN: cir-opt %s -cir-call-conv-lowering="classification-attr=test_classify" \
 // RUN:   -cir-to-llvm -o - 2>/dev/null \
-// RUN:   | mlir-translate -mlir-to-llvmir --allow-unregistered-dialect \
+// RUN:   | cir-translate -mlir-to-llvmir --allow-unregistered-dialect \
 // RUN:   | FileCheck %s --check-prefix=LLVM
 
 !s8i = !cir.int<s, 8>
diff --git a/clang/test/CIR/Transforms/abi-lowering/x86_64-bitint.cir b/clang/test/CIR/Transforms/abi-lowering/x86_64-bitint.cir
index 1a8f491fc9e7d..883e52f408b9e 100644
--- a/clang/test/CIR/Transforms/abi-lowering/x86_64-bitint.cir
+++ b/clang/test/CIR/Transforms/abi-lowering/x86_64-bitint.cir
@@ -1,6 +1,6 @@
 // RUN: cir-opt %s -cir-call-conv-lowering=target=x86_64 | FileCheck %s
 // RUN: cir-opt %s -cir-call-conv-lowering=target=x86_64 -cir-to-llvm -o - 2>/dev/null \
-// RUN:   | mlir-translate -mlir-to-llvmir --allow-unregistered-dialect \
+// RUN:   | cir-translate -mlir-to-llvmir --allow-unregistered-dialect \
 // RUN:   | FileCheck %s --check-prefix=LLVM
 
 !b17i = !cir.int<s, 17, bitint>
diff --git a/clang/test/CIR/Transforms/abi-lowering/x86_64-complex.cir b/clang/test/CIR/Transforms/abi-lowering/x86_64-complex.cir
index 5a148609a6bb8..6e36411c295eb 100644
--- a/clang/test/CIR/Transforms/abi-lowering/x86_64-complex.cir
+++ b/clang/test/CIR/Transforms/abi-lowering/x86_64-complex.cir
@@ -1,6 +1,6 @@
 // RUN: cir-opt %s -cir-call-conv-lowering=target=x86_64 | FileCheck %s
 // RUN: cir-opt %s -cir-call-conv-lowering=target=x86_64 -cir-to-llvm -o - 2>/dev/null \
-// RUN:   | mlir-translate -mlir-to-llvmir --allow-unregistered-dialect \
+// RUN:   | cir-translate -mlir-to-llvmir --allow-unregistered-dialect \
 // RUN:   | FileCheck %s --check-prefix=LLVM
 
 !s16i = !cir.int<s, 16>
diff --git a/clang/test/CIR/Transforms/abi-lowering/x86_64-empty-class.cir b/clang/test/CIR/Transforms/abi-lowering/x86_64-empty-class.cir
index 3de607561242f..d7f7d2566adb3 100644
--- a/clang/test/CIR/Transforms/abi-lowering/x86_64-empty-class.cir
+++ b/clang/test/CIR/Transforms/abi-lowering/x86_64-empty-class.cir
@@ -1,6 +1,6 @@
 // RUN: cir-opt %s -cir-call-conv-lowering=target=x86_64 | FileCheck %s
 // RUN: cir-opt %s -cir-call-conv-lowering=target=x86_64 -cir-to-llvm -o - 2>/dev/null \
-// RUN:   | mlir-translate -mlir-to-llvmir --allow-unregistered-dialect \
+// RUN:   | cir-translate -mlir-to-llvmir --allow-unregistered-dialect \
 // RUN:   | FileCheck %s --check-prefix=LLVM
 
 !s32i = !cir.int<s, 32>
diff --git a/clang/test/CIR/Transforms/abi-lowering/x86_64-scalars.cir b/clang/test/CIR/Transforms/abi-lowering/x86_64-scalars.cir
index e0d60fff66e32..04f11abc7b5d5 100644
--- a/clang/test/CIR/Transforms/abi-lowering/x86_64-scalars.cir
+++ b/clang/test/CIR/Transforms/abi-lowering/x86_64-scalars.cir
@@ -1,6 +1,6 @@
 // RUN: cir-opt %s -cir-call-conv-lowering=target=x86_64 | FileCheck %s
 // RUN: cir-opt %s -cir-call-conv-lowering=target=x86_64 -cir-to-llvm -o - 2>/dev/null \
-// RUN:   | mlir-translate -mlir-to-llvmir --allow-unregistered-dialect \
+// RUN:   | cir-translate -mlir-to-llvmir --allow-unregistered-dialect \
 // RUN:   | FileCheck %s --check-prefix=LLVM
 
 !s8i = !cir.int<s, 8>
diff --git a/clang/test/CIR/Transforms/abi-lowering/x86_64-struct-direct.cir b/clang/test/CIR/Transforms/abi-lowering/x86_64-struct-direct.cir
index f857529ee5d07..5a8ba5308192a 100644
--- a/clang/test/CIR/Transforms/abi-lowering/x86_64-struct-direct.cir
+++ b/clang/test/CIR/Transforms/abi-lowering/x86_64-struct-direct.cir
@@ -1,6 +1,6 @@
 // RUN: cir-opt %s -cir-call-conv-lowering=target=x86_64 | FileCheck %s
 // RUN: cir-opt %s -cir-call-conv-lowering=target=x86_64 -cir-to-llvm -o - 2>/dev/null \
-// RUN:   | mlir-translate -mlir-to-llvmir --allow-unregistered-dialect \
+// RUN:   | cir-translate -mlir-to-llvmir --allow-unregistered-dialect \
 // RUN:   | FileCheck %s --check-prefix=LLVM
 
 !s8i = !cir.int<s, 8>
diff --git a/clang/test/CIR/Transforms/abi-lowering/x86_64-union-coerce-shapes.cir b/clang/test/CIR/Transforms/abi-lowering/x86_64-union-coerce-shapes.cir
index 32ff2eec40dc5..fab8a00323fd7 100644
--- a/clang/test/CIR/Transforms/abi-lowering/x86_64-union-coerce-shapes.cir
+++ b/clang/test/CIR/Transforms/abi-lowering/x86_64-union-coerce-shapes.cir
@@ -1,6 +1,6 @@
 // RUN: cir-opt %s -cir-call-conv-lowering=target=x86_64 | FileCheck %s
 // RUN: cir-opt %s -cir-call-conv-lowering=target=x86_64 -cir-to-llvm -o - 2>/dev/null \
-// RUN:   | mlir-translate -mlir-to-llvmir --allow-unregistered-dialect \
+// RUN:   | cir-translate -mlir-to-llvmir --allow-unregistered-dialect \
 // RUN:   | FileCheck %s --check-prefix=LLVM
 
 !s8i = !cir.int<s, 8>
diff --git a/clang/test/CIR/Transforms/abi-lowering/x86_64-union.cir b/clang/test/CIR/Transforms/abi-lowering/x86_64-union.cir
index b32680bbd98ea..dd3066848c460 100644
--- a/clang/test/CIR/Transforms/abi-lowering/x86_64-union.cir
+++ b/clang/test/CIR/Transforms/abi-lowering/x86_64-union.cir
@@ -1,6 +1,6 @@
 // RUN: cir-opt %s -cir-call-conv-lowering=target=x86_64 | FileCheck %s
 // RUN: cir-opt %s -cir-call-conv-lowering=target=x86_64 -cir-to-llvm -o - 2>/dev/null \
-// RUN:   | mlir-translate -mlir-to-llvmir --allow-unregistered-dialect \
+// RUN:   | cir-translate -mlir-to-llvmir --allow-unregistered-dialect \
 // RUN:   | FileCheck %s --check-prefix=LLVM
 
 !s8i = !cir.int<s, 8>
diff --git a/clang/test/CIR/Transforms/abi-lowering/x86_64-variadic-call.cir b/clang/test/CIR/Transforms/abi-lowering/x86_64-variadic-call.cir
index 80303dbdee129..dc3130d5e5d66 100644
--- a/clang/test/CIR/Transforms/abi-lowering/x86_64-variadic-call.cir
+++ b/clang/test/CIR/Transforms/abi-lowering/x86_64-variadic-call.cir
@@ -1,6 +1,6 @@
 // RUN: cir-opt %s -cir-call-conv-lowering=target=x86_64 | FileCheck %s
 // RUN: cir-opt %s -cir-call-conv-lowering=target=x86_64 -cir-to-llvm -o - 2>/dev/null \
-// RUN:   | mlir-translate -mlir-to-llvmir --allow-unregistered-dialect \
+// RUN:   | cir-translate -mlir-to-llvmir --allow-unregistered-dialect \
 // RUN:   | FileCheck %s --check-prefix=LLVM
 
 !s8i = !cir.int<s, 8>
diff --git a/clang/test/CIR/Transforms/abi-lowering/x86_64-vector.cir b/clang/test/CIR/Transforms/abi-lowering/x86_64-vector.cir
index 0c1d41808c9de..d5d47a8491b44 100644
--- a/clang/test/CIR/Transforms/abi-lowering/x86_64-vector.cir
+++ b/clang/test/CIR/Transforms/abi-lowering/x86_64-vector.cir
@@ -4,7 +4,7 @@
 // RUN: cir-opt %s -cir-call-conv-lowering='target=x86_64 x86-avx-abi-level=avx512' \
 // RUN:   | FileCheck %s --check-prefix=AVX512
 // RUN: cir-opt %s -cir-call-conv-lowering=target=x86_64 -cir-to-llvm -o - 2>/dev/null \
-// RUN:   | mlir-translate -mlir-to-llvmir --allow-unregistered-dialect \
+// RUN:   | cir-translate -mlir-to-llvmir --allow-unregistered-dialect \
 // RUN:   | FileCheck %s --check-prefix=LLVM
 
 !s32i = !cir.int<s, 32>
diff --git a/clang/test/CIR/Transforms/abi-lowering/x86_64-vptr.cir b/clang/test/CIR/Transforms/abi-lowering/x86_64-vptr.cir
index 37d16e3f1013e..de10afb52eed8 100644
--- a/clang/test/CIR/Transforms/abi-lowering/x86_64-vptr.cir
+++ b/clang/test/CIR/Transforms/abi-lowering/x86_64-vptr.cir
@@ -1,6 +1,6 @@
 // RUN: cir-opt %s -cir-call-conv-lowering=target=x86_64 | FileCheck %s
 // RUN: cir-opt %s -cir-call-conv-lowering=target=x86_64 -cir-to-llvm -o - 2>/dev/null \
-// RUN:   | mlir-translate -mlir-to-llvmir --allow-unregistered-dialect \
+// RUN:   | cir-translate -mlir-to-llvmir --allow-unregistered-dialect \
 // RUN:   | FileCheck %s --check-prefix=LLVM
 
 !s32i = !cir.int<s, 32>
diff --git a/clang/test/CIR/Transforms/abi-lowering/x86_64-wide-floats.cir b/clang/test/CIR/Transforms/abi-lowering/x86_64-wide-floats.cir
index 61ef20c3ebbff..99b0347c220f3 100644
--- a/clang/test/CIR/Transforms/abi-lowering/x86_64-wide-floats.cir
+++ b/clang/test/CIR/Transforms/abi-lowering/x86_64-wide-floats.cir
@@ -1,6 +1,6 @@
 // RUN: cir-opt %s -cir-call-conv-lowering=target=x86_64 | FileCheck %s
 // RUN: cir-opt %s -cir-call-conv-lowering=target=x86_64 -cir-to-llvm -o - 2>/dev/null \
-// RUN:   | mlir-translate -mlir-to-llvmir --allow-unregistered-dialect \
+// RUN:   | cir-translate -mlir-to-llvmir --allow-unregistered-dialect \
 // RUN:   | FileCheck %s --check-prefix=LLVM
 
 !s32i = !cir.int<s, 32>
diff --git a/clang/test/CMakeLists.txt b/clang/test/CMakeLists.txt
index 304497490a3dc..b8adfa799bcae 100644
--- a/clang/test/CMakeLists.txt
+++ b/clang/test/CMakeLists.txt
@@ -117,7 +117,6 @@ if(CLANG_ENABLE_CIR)
   list(APPEND CLANG_TEST_DEPS
     cir-opt
     cir-translate
-    mlir-translate
     )
   add_subdirectory(CIR/lib)
 endif()
diff --git a/clang/tools/cir-translate/CMakeLists.txt b/clang/tools/cir-translate/CMakeLists.txt
index 1e85c541457d9..bdbfa3133cdcf 100644
--- a/clang/tools/cir-translate/CMakeLists.txt
+++ b/clang/tools/cir-translate/CMakeLists.txt
@@ -1,7 +1,3 @@
-get_property(dialect_libs GLOBAL PROPERTY MLIR_DIALECT_LIBS)
-get_property(conversion_libs GLOBAL PROPERTY MLIR_CONVERSION_LIBS)
-get_property(translation_libs GLOBAL PROPERTY MLIR_TRANSLATION_LIBS)
-
 include_directories(${LLVM_MAIN_SRC_DIR}/../mlir/include)
 include_directories(${CMAKE_BINARY_DIR}/tools/mlir/include)
 
@@ -20,12 +16,16 @@ clang_target_link_libraries(cir-translate
 
 target_link_libraries(cir-translate
   PRIVATE
-  ${dialect_libs}
-  ${conversion_libs}
-  ${translation_libs}
   MLIRAnalysis
+  MLIRBuiltinToLLVMIRTranslation
   MLIRDialect
+  MLIRDLTIDialect
+  MLIRFuncDialect
   MLIRIR
+  MLIRLLVMDialect
+  MLIRLLVMToLLVMIRTranslation
+  MLIROpenMPToLLVMIRTranslation
+  MLIRTargetLLVMIRExport
   MLIROptLib
   MLIRParser
   MLIRPass
diff --git a/clang/tools/cir-translate/cir-translate.cpp b/clang/tools/cir-translate/cir-translate.cpp
index a58512e3fca22..cefa7d2996f30 100644
--- a/clang/tools/cir-translate/cir-translate.cpp
+++ b/clang/tools/cir-translate/cir-translate.cpp
@@ -17,9 +17,11 @@
 #include "mlir/Dialect/OpenMP/Utils/Utils.h"
 #include "mlir/IR/BuiltinOps.h"
 #include "mlir/IR/MLIRContext.h"
-#include "mlir/InitAllTranslations.h"
 #include "mlir/Support/LogicalResult.h"
-#include "mlir/Target/LLVMIR/Dialect/All.h"
+#include "mlir/Target/LLVMIR/Dialect/Builtin/BuiltinToLLVMIRTranslation.h"
+#include "mlir/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.h"
+#include "mlir/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.h"
+#include "mlir/Target/LLVMIR/Export.h"
 #include "mlir/Tools/mlir-translate/MlirTranslateMain.h"
 #include "mlir/Tools/mlir-translate/Translation.h"
 
@@ -144,6 +146,12 @@ llvm::LogicalResult prepareCIRModuleForTranslation(mlir::ModuleOp mod) {
 } // namespace
 } // namespace cir
 
+static void registerLLVMIRTranslations(mlir::DialectRegistry &registry) {
+  mlir::registerBuiltinDialectTranslation(registry);
+  mlir::registerLLVMDialectTranslation(registry);
+  mlir::registerOpenMPDialectTranslation(registry);
+}
+
 void registerToLLVMTranslation() {
   static llvm::cl::opt<bool> disableCCLowering(
       "disable-cc-lowering",
@@ -172,12 +180,35 @@ void registerToLLVMTranslation() {
       [](mlir::DialectRegistry &registry) {
         cir::registerAllDialects(registry);
         registry.insert<mlir::func::FuncDialect>();
-        mlir::registerAllToLLVMIRTranslations(registry);
+        registerLLVMIRTranslations(registry);
         cir::direct::registerCIRDialectTranslation(registry);
       });
 }
 
+// Mirrors mlir::registerToLLVMIRTranslation, restricted to the dialects CIR
+// lowers to so that the ClangIR tests need not depend on mlir-translate, which
+// links every MLIR dialect.
+static void registerMLIRToLLVMIRTranslation() {
+  mlir::TranslateFromMLIRRegistration registration(
+      "mlir-to-llvmir", "Translate MLIR to LLVMIR",
+      [](mlir::Operation *op, mlir::raw_ostream &output) {
+        llvm::LLVMContext llvmContext;
+        std::unique_ptr<llvm::Module> llvmModule =
+            mlir::translateModuleToLLVMIR(op, llvmContext);
+        if (!llvmModule)
+          return mlir::failure();
+        llvmModule->renumberMetadataForAssembly();
+        llvmModule->print(output, nullptr);
+        return mlir::success();
+      },
+      [](mlir::DialectRegistry &registry) {
+        registry.insert<mlir::DLTIDialect, mlir::func::FuncDialect>();
+        registerLLVMIRTranslations(registry);
+      });
+}
+
 int main(int argc, char **argv) {
   registerToLLVMTranslation();
+  registerMLIRToLLVMIRTranslation();
   return failed(mlir::mlirTranslateMain(argc, argv, "CIR Translation Tool"));
 }



More information about the cfe-commits mailing list