[llvm] [llvm-ir2vec] Automating ir2vec python bindings testing in llvm CI (PR #194593)

Nishant Sachdeva via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 28 03:55:23 PDT 2026


https://github.com/nishant-sachdeva created https://github.com/llvm/llvm-project/pull/194593

- We are enabling IR2Vec Python binding tests in the LLVM monolithic Linux CI by adding -D LLVM_IR2VEC_ENABLE_PYTHON_BINDINGS=ON to monolithic-linux.sh. 
- The bindings require nanobind at build time. Currently nanobind is available on the CI runner because MLIR declares it in `mlir/python/requirements.txt`. However, this is an implicit dependency. If MLIR ever drops nanobind, IR2Vec bindings would silently break. 
- To make this dependency explicit, we are adding `llvm/tools/llvm-ir2vec/python/requirements.txt` declaring nanobind>=2.9. 


At the moment, looking for some guidance to ensure that nanobind appears in the `.ci/all_requirements.txt` with IR2Vec listed as an explicit consumer alongside MLIR, explicitly marking the dependency. 

>From b552e8be9da2a98849a0e589c527aad796600a9e Mon Sep 17 00:00:00 2001
From: nishant_sachdeva <nishant.sachdeva at research.iiit.ac.in>
Date: Mon, 27 Apr 2026 12:53:34 +0530
Subject: [PATCH 1/5] Place IR2Vec Python bindings in the
 tools/llvm-ir2vec/Bindings build directory

---
 llvm/tools/llvm-ir2vec/Bindings/CMakeLists.txt | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/llvm/tools/llvm-ir2vec/Bindings/CMakeLists.txt b/llvm/tools/llvm-ir2vec/Bindings/CMakeLists.txt
index 582dfb3058385..5cf142cb3b599 100644
--- a/llvm/tools/llvm-ir2vec/Bindings/CMakeLists.txt
+++ b/llvm/tools/llvm-ir2vec/Bindings/CMakeLists.txt
@@ -30,6 +30,10 @@ find_package(nanobind CONFIG REQUIRED)
 
 nanobind_add_module(ir2vec MODULE PyIR2Vec.cpp)
 
+set_target_properties(ir2vec PROPERTIES
+  LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
+)
+
 # Python bindings require exception handling and RTTI to convert C++ exceptions
 # to Python exceptions. LLVM core is compiled with -fno-exceptions -fno-rtti,
 # but Python bindings are compiled separately with these features enabled.

>From fe7c5cb211d53e9852daba81d0002b8da3e0d9c3 Mon Sep 17 00:00:00 2001
From: nishant_sachdeva <nishant.sachdeva at research.iiit.ac.in>
Date: Tue, 28 Apr 2026 15:29:58 +0530
Subject: [PATCH 2/5] Work Commit - ir2vec python bindings test were using
 incorrect executable

---
 llvm/test/tools/llvm-ir2vec/bindings/ir2vec-getBBEmbMap.py   | 2 +-
 llvm/test/tools/llvm-ir2vec/bindings/ir2vec-getFuncEmb.py    | 2 +-
 llvm/test/tools/llvm-ir2vec/bindings/ir2vec-getFuncEmbMap.py | 2 +-
 llvm/test/tools/llvm-ir2vec/bindings/ir2vec-getFuncNames.py  | 2 +-
 llvm/test/tools/llvm-ir2vec/bindings/ir2vec-getInstEmbMap.py | 2 +-
 llvm/test/tools/llvm-ir2vec/bindings/ir2vec-initEmbedding.py | 2 +-
 llvm/test/tools/llvm-ir2vec/bindings/lit.local.cfg           | 5 ++++-
 7 files changed, 10 insertions(+), 7 deletions(-)

diff --git a/llvm/test/tools/llvm-ir2vec/bindings/ir2vec-getBBEmbMap.py b/llvm/test/tools/llvm-ir2vec/bindings/ir2vec-getBBEmbMap.py
index 963e0d0adeca5..984ed25fae76c 100644
--- a/llvm/test/tools/llvm-ir2vec/bindings/ir2vec-getBBEmbMap.py
+++ b/llvm/test/tools/llvm-ir2vec/bindings/ir2vec-getBBEmbMap.py
@@ -1,4 +1,4 @@
-# RUN: env PYTHONPATH=%llvm_lib_dir %python %s %S/../Inputs/input.ll %ir2vec_test_vocab_dir/dummy_3D_nonzero_opc_vocab.json | FileCheck %s
+# RUN: env PYTHONPATH=%ir2vec_python_dir %python %s %S/../Inputs/input.ll %ir2vec_test_vocab_dir/dummy_3D_nonzero_opc_vocab.json | FileCheck %s
 
 import sys
 import ir2vec
diff --git a/llvm/test/tools/llvm-ir2vec/bindings/ir2vec-getFuncEmb.py b/llvm/test/tools/llvm-ir2vec/bindings/ir2vec-getFuncEmb.py
index b7ac30f689da6..f566e4e6556cf 100644
--- a/llvm/test/tools/llvm-ir2vec/bindings/ir2vec-getFuncEmb.py
+++ b/llvm/test/tools/llvm-ir2vec/bindings/ir2vec-getFuncEmb.py
@@ -1,4 +1,4 @@
-# RUN: env PYTHONPATH=%llvm_lib_dir %python %s %S/../Inputs/input.ll %ir2vec_test_vocab_dir/dummy_3D_nonzero_opc_vocab.json | FileCheck %s
+# RUN: env PYTHONPATH=%ir2vec_python_dir %python %s %S/../Inputs/input.ll %ir2vec_test_vocab_dir/dummy_3D_nonzero_opc_vocab.json | FileCheck %s
 
 import sys
 import ir2vec
diff --git a/llvm/test/tools/llvm-ir2vec/bindings/ir2vec-getFuncEmbMap.py b/llvm/test/tools/llvm-ir2vec/bindings/ir2vec-getFuncEmbMap.py
index 6bc3adbca80ac..780baf515e07f 100644
--- a/llvm/test/tools/llvm-ir2vec/bindings/ir2vec-getFuncEmbMap.py
+++ b/llvm/test/tools/llvm-ir2vec/bindings/ir2vec-getFuncEmbMap.py
@@ -1,4 +1,4 @@
-# RUN: env PYTHONPATH=%llvm_lib_dir %python %s %S/../Inputs/input.ll %ir2vec_test_vocab_dir/dummy_3D_nonzero_opc_vocab.json | FileCheck %s
+# RUN: env PYTHONPATH=%ir2vec_python_dir %python %s %S/../Inputs/input.ll %ir2vec_test_vocab_dir/dummy_3D_nonzero_opc_vocab.json | FileCheck %s
 
 import sys
 import ir2vec
diff --git a/llvm/test/tools/llvm-ir2vec/bindings/ir2vec-getFuncNames.py b/llvm/test/tools/llvm-ir2vec/bindings/ir2vec-getFuncNames.py
index f4420bae6caac..70b611798d548 100644
--- a/llvm/test/tools/llvm-ir2vec/bindings/ir2vec-getFuncNames.py
+++ b/llvm/test/tools/llvm-ir2vec/bindings/ir2vec-getFuncNames.py
@@ -1,4 +1,4 @@
-# RUN: env PYTHONPATH=%llvm_lib_dir %python %s %S/../Inputs/input.ll %ir2vec_test_vocab_dir/dummy_3D_nonzero_opc_vocab.json | FileCheck %s
+# RUN: env PYTHONPATH=%ir2vec_python_dir %python %s %S/../Inputs/input.ll %ir2vec_test_vocab_dir/dummy_3D_nonzero_opc_vocab.json | FileCheck %s
 
 import sys
 import ir2vec
diff --git a/llvm/test/tools/llvm-ir2vec/bindings/ir2vec-getInstEmbMap.py b/llvm/test/tools/llvm-ir2vec/bindings/ir2vec-getInstEmbMap.py
index a76d23ed84146..5bd233e1a61a8 100644
--- a/llvm/test/tools/llvm-ir2vec/bindings/ir2vec-getInstEmbMap.py
+++ b/llvm/test/tools/llvm-ir2vec/bindings/ir2vec-getInstEmbMap.py
@@ -1,4 +1,4 @@
-# RUN: env PYTHONPATH=%llvm_lib_dir %python %s %S/../Inputs/input.ll %ir2vec_test_vocab_dir/dummy_3D_nonzero_opc_vocab.json | FileCheck %s
+# RUN: env PYTHONPATH=%ir2vec_python_dir %python %s %S/../Inputs/input.ll %ir2vec_test_vocab_dir/dummy_3D_nonzero_opc_vocab.json | FileCheck %s
 
 import sys
 import ir2vec
diff --git a/llvm/test/tools/llvm-ir2vec/bindings/ir2vec-initEmbedding.py b/llvm/test/tools/llvm-ir2vec/bindings/ir2vec-initEmbedding.py
index 071a9dc202dd0..e93e1b9ef18fe 100644
--- a/llvm/test/tools/llvm-ir2vec/bindings/ir2vec-initEmbedding.py
+++ b/llvm/test/tools/llvm-ir2vec/bindings/ir2vec-initEmbedding.py
@@ -1,4 +1,4 @@
-# RUN: env PYTHONPATH=%llvm_lib_dir %python %s %S/../Inputs/input.ll %ir2vec_test_vocab_dir/dummy_3D_nonzero_opc_vocab.json | FileCheck %s
+# RUN: env PYTHONPATH=%ir2vec_python_dir %python %s %S/../Inputs/input.ll %ir2vec_test_vocab_dir/dummy_3D_nonzero_opc_vocab.json | FileCheck %s
 
 import sys
 import ir2vec
diff --git a/llvm/test/tools/llvm-ir2vec/bindings/lit.local.cfg b/llvm/test/tools/llvm-ir2vec/bindings/lit.local.cfg
index af02c9e434923..78679869d7e1b 100644
--- a/llvm/test/tools/llvm-ir2vec/bindings/lit.local.cfg
+++ b/llvm/test/tools/llvm-ir2vec/bindings/lit.local.cfg
@@ -1,9 +1,12 @@
 import sys
+import os
 
 # Only run if user explicitly enabled bindings
 if not config.llvm_ir2vec_test_python_bindings:
     config.unsupported = True
 else:
+    bindings_dir = os.path.join(os.path.dirname(config.llvm_lib_dir),
+                                "tools", "llvm-ir2vec", "Bindings")
     config.substitutions.append(('%python', sys.executable))
-    config.substitutions.append(('%llvm_lib_dir', config.llvm_lib_dir))
+    config.substitutions.append(('%ir2vec_python_dir', bindings_dir))
     config.suffixes = ['.py']

>From 580d9c2479f75813e8d0e0e6a49d1156dd4d3466 Mon Sep 17 00:00:00 2001
From: nishant_sachdeva <nishant.sachdeva at research.iiit.ac.in>
Date: Tue, 28 Apr 2026 16:06:12 +0530
Subject: [PATCH 3/5] Work commit - removing the hardcoded path from the
 bindings tests and replacing it with cmake supported variable

---
 llvm/test/lit.site.cfg.py.in                       | 1 +
 llvm/test/tools/llvm-ir2vec/bindings/lit.local.cfg | 6 +-----
 llvm/tools/llvm-ir2vec/Bindings/CMakeLists.txt     | 1 +
 llvm/utils/gn/secondary/llvm/test/BUILD.gn         | 1 +
 4 files changed, 4 insertions(+), 5 deletions(-)

diff --git a/llvm/test/lit.site.cfg.py.in b/llvm/test/lit.site.cfg.py.in
index 6fe48f21cc685..cee5d04962199 100644
--- a/llvm/test/lit.site.cfg.py.in
+++ b/llvm/test/lit.site.cfg.py.in
@@ -8,6 +8,7 @@ config.llvm_src_root = path(r"@LLVM_SOURCE_DIR@")
 config.llvm_obj_root = path(r"@LLVM_BINARY_DIR@")
 config.llvm_tools_dir = lit_config.substitute(path(r"@LLVM_TOOLS_DIR@"))
 config.llvm_ir2vec_test_python_bindings = @LLVM_IR2VEC_TEST_PYTHON_BINDINGS@
+config.llvm_ir2vec_bindings_dir = "@LLVM_IR2VEC_BINDINGS_DIR@"
 config.llvm_lib_dir = lit_config.substitute(path(r"@LLVM_LIBS_DIR@"))
 config.llvm_shlib_dir = lit_config.substitute(path(r"@SHLIBDIR@"))
 config.llvm_shlib_ext = "@SHLIBEXT@"
diff --git a/llvm/test/tools/llvm-ir2vec/bindings/lit.local.cfg b/llvm/test/tools/llvm-ir2vec/bindings/lit.local.cfg
index 78679869d7e1b..b3c8eaea57439 100644
--- a/llvm/test/tools/llvm-ir2vec/bindings/lit.local.cfg
+++ b/llvm/test/tools/llvm-ir2vec/bindings/lit.local.cfg
@@ -1,12 +1,8 @@
 import sys
-import os
 
-# Only run if user explicitly enabled bindings
 if not config.llvm_ir2vec_test_python_bindings:
     config.unsupported = True
 else:
-    bindings_dir = os.path.join(os.path.dirname(config.llvm_lib_dir),
-                                "tools", "llvm-ir2vec", "Bindings")
     config.substitutions.append(('%python', sys.executable))
-    config.substitutions.append(('%ir2vec_python_dir', bindings_dir))
+    config.substitutions.append(('%ir2vec_python_dir', config.llvm_ir2vec_bindings_dir))
     config.suffixes = ['.py']
diff --git a/llvm/tools/llvm-ir2vec/Bindings/CMakeLists.txt b/llvm/tools/llvm-ir2vec/Bindings/CMakeLists.txt
index 5cf142cb3b599..7b66077b29b0c 100644
--- a/llvm/tools/llvm-ir2vec/Bindings/CMakeLists.txt
+++ b/llvm/tools/llvm-ir2vec/Bindings/CMakeLists.txt
@@ -30,6 +30,7 @@ find_package(nanobind CONFIG REQUIRED)
 
 nanobind_add_module(ir2vec MODULE PyIR2Vec.cpp)
 
+set(LLVM_IR2VEC_BINDINGS_DIR "${CMAKE_CURRENT_BINARY_DIR}" CACHE INTERNAL "")
 set_target_properties(ir2vec PROPERTIES
   LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
 )
diff --git a/llvm/utils/gn/secondary/llvm/test/BUILD.gn b/llvm/utils/gn/secondary/llvm/test/BUILD.gn
index e41bcbadd1299..19b2bdefb390e 100644
--- a/llvm/utils/gn/secondary/llvm/test/BUILD.gn
+++ b/llvm/utils/gn/secondary/llvm/test/BUILD.gn
@@ -75,6 +75,7 @@ write_lit_config("lit_site_cfg") {
     "LLVM_LINK_LLVM_DYLIB=0",
     "LLVM_LIT_TOOLS_DIR=",  # Intentionally empty, matches cmake build.
     "LLVM_IR2VEC_TEST_PYTHON_BINDINGS=0",
+    "LLVM_IR2VEC_BINDINGS_DIR=",  # GN doesn't build bindings, leave empty
     "LLVM_NATIVE_ARCH=$native_target",
     "LLVM_TOOL_LLVM_DRIVER_BUILD=0",  # FIXME: Add actual support for this.
     "LLVM_USE_INTEL_JITEVENTS=0",

>From 099717615ffa0f74d2b58fabcd22afa0db94cbc5 Mon Sep 17 00:00:00 2001
From: nishant_sachdeva <nishant.sachdeva at research.iiit.ac.in>
Date: Tue, 28 Apr 2026 16:18:33 +0530
Subject: [PATCH 4/5] Automating ir2vec python bindings testing in llvm CI

---
 .ci/monolithic-linux.sh | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.ci/monolithic-linux.sh b/.ci/monolithic-linux.sh
index 29b0bdbd0e37b..7134973ca10b5 100755
--- a/.ci/monolithic-linux.sh
+++ b/.ci/monolithic-linux.sh
@@ -65,6 +65,7 @@ cmake -S "${MONOREPO_ROOT}"/llvm -B "${BUILD_DIR}" \
       -D CMAKE_DISABLE_PRECOMPILE_HEADERS=ON \
       -D LIBCXX_CXX_ABI=libcxxabi \
       -D MLIR_ENABLE_BINDINGS_PYTHON=ON \
+      -D LLVM_IR2VEC_ENABLE_PYTHON_BINDINGS=ON \
       -D LLDB_ENABLE_PYTHON=ON \
       -D LLDB_ENFORCE_STRICT_TEST_REQUIREMENTS=ON \
       -D CMAKE_INSTALL_PREFIX="${INSTALL_DIR}" \

>From 48b55313662f2db85c72738f81c9e1b59ae2a908 Mon Sep 17 00:00:00 2001
From: nishant_sachdeva <nishant.sachdeva at research.iiit.ac.in>
Date: Tue, 28 Apr 2026 16:24:26 +0530
Subject: [PATCH 5/5] Adding requirements.txt file with nanobind for ir2vec
 python bindings

---
 llvm/tools/llvm-ir2vec/Bindings/requirements.txt | 2 ++
 1 file changed, 2 insertions(+)
 create mode 100644 llvm/tools/llvm-ir2vec/Bindings/requirements.txt

diff --git a/llvm/tools/llvm-ir2vec/Bindings/requirements.txt b/llvm/tools/llvm-ir2vec/Bindings/requirements.txt
new file mode 100644
index 0000000000000..f9f555954f326
--- /dev/null
+++ b/llvm/tools/llvm-ir2vec/Bindings/requirements.txt
@@ -0,0 +1,2 @@
+# BUILD dependencies
+nanobind>=2.9, <3.0
\ No newline at end of file



More information about the llvm-commits mailing list