Skip to content

[BugFix][LLVM] Fix insertDeclare API mismatch for ROCm-bundled LLVM 20#19390

Draft
swjng wants to merge 1 commit intoapache:mainfrom
swjng:fix/llvm20-insertdeclare-api
Draft

[BugFix][LLVM] Fix insertDeclare API mismatch for ROCm-bundled LLVM 20#19390
swjng wants to merge 1 commit intoapache:mainfrom
swjng:fix/llvm20-insertdeclare-api

Conversation

@swjng
Copy link
Copy Markdown
Contributor

@swjng swjng commented Apr 11, 2026

Problem

Closes #18709.

ROCm ships its own LLVM 20 build that still uses the pre-LLVM-20 Instruction* overload of DIBuilder::insertDeclare, while upstream LLVM 20 switched to BasicBlock::iterator. The previous guard #if TVM_LLVM_VERSION >= 200 in codegen_llvm.cc broke ROCm users because their LLVM reports version 20 but lacks the new overload, causing a compile error like:

```
error: no matching function for call to
'llvm::DIBuilder::insertDeclare(..., llvm::BasicBlock::iterator)'
note: candidate: insertDeclare(..., llvm::Instruction*)
```

Fix

Replace the version-number guard with a CMake check_cxx_source_compiles feature probe in cmake/utils/FindLLVM.cmake. The probe compiles a small test program that calls insertDeclare with BasicBlock::iterator. The result is exposed as the preprocessor macro TVM_LLVM_INSERTDECLARE_USES_ITERATOR.

cmake_push_check_state/cmake_pop_check_state is used to avoid leaking CMAKE_REQUIRED_* variables into the rest of the build.

Three call sites in src/target/llvm/codegen_llvm.cc are updated to use #if TVM_LLVM_INSERTDECLARE_USES_ITERATOR instead of #if TVM_LLVM_VERSION >= 200.

Behavior by configuration:

LLVM build Probe result Macro set Code path
Upstream LLVM >= 20 with new overload Compiles Yes BasicBlock::iterator
ROCm LLVM 20 (old overload) Fails No Instruction*
Any LLVM < 20 Probe skipped No Instruction*

Testing

Tested locally with LLVM 20.1.8 (Ubuntu package). The probe correctly detects Failed (uses Instruction* path), libtvm.so builds cleanly, and all 39 LLVM codegen tests pass:

```
tests/python/codegen/test_target_codegen_llvm.py 39 passed
```

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces several fixes and improvements to the TVM build and compilation pipelines. It adds CMake feature detection for LLVM 20's DIBuilder::insertDeclare to handle differences between upstream and ROCm-bundled versions. In the Relax VM build, it now prefers target-specific pipelines when using the "default" configuration. The compile_relax integration for MetaSchedule was refactored to ensure a correct pass ordering, including DLight fallback scheduling. Additionally, safety checks were added to TIRX passes to handle functions without defined targets. Feedback suggests improving the target-specific pass detection in the MetaSchedule integration to support backends beyond CUDA, avoiding manual duplication of pass lists, and ensuring CMake variable state is preserved during feature detection.

@swjng swjng marked this pull request as draft April 11, 2026 14:58
ROCm ships its own LLVM 20 build that still uses the pre-LLVM-20
`Instruction*` overload of `DIBuilder::insertDeclare`, while upstream
LLVM 20 switched to `BasicBlock::iterator`. The previous version-number
guard `#if TVM_LLVM_VERSION >= 200` broke ROCm users on LLVM 20.

Replace the version guard with a CMake `check_cxx_source_compiles`
feature probe (`TVM_LLVM_INSERTDECLARE_USES_ITERATOR`) that compiles a
small test program to detect which overload is actually available.
Use `cmake_push_check_state`/`cmake_pop_check_state` to avoid leaking
CMake check variables. Three call sites in `codegen_llvm.cc` are
updated to use the new macro.

Fixes apache#18709
@swjng swjng force-pushed the fix/llvm20-insertdeclare-api branch from a7ceb05 to 70e8887 Compare April 11, 2026 15:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] Compile the ROCM backend,compile failed

1 participant