llvm / llvm/llvm-project

[SPIRV] `appendToUsedList` utility appends incompatible addrspace ptrs

Open
#221,339 4 comments 0 reactions 0 assignees View on GitHub
backend:SPIR-V crash
Dominant language
LLVM
Stars
40.5k
Forks
18.7k
PR merge metrics
PR metrics pending

Description

reproducer:
```
clang -cc1 -debug-info-kind=limited -triple spirv64-unknown-unknown -x hip -fcuda-is-device -emit-llvm -fdynamic-debugging - < /dev/null
```

stacktrace:
```
clang: /usr/workspace/moyasarda1/gpu-kernel-versioning/llvm-project-testing/llvm/lib/IR/Constants.cpp:1445: static Constant *llvm::ConstantArray::getImpl(ArrayType *, ArrayRef): Assertion `C->getType() == Ty->getElementType() && "Wrong type in array element initializer"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace and dumped files.
Stack dump:
0. Program arguments: /usr/WS1/moyasarda1/gpu-kernel-versioning/build-tioga-testing/bin/clang -cc1 -debug-info-kind=limited -triple spirv64-unknown-unknown -x hip -fcuda-is-device -emit-llvm -fdynamic-debugging -
1. parser at end of file
#0 0x00000000031899ab llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /usr/workspace/moyasarda1/gpu-kernel-versioning/llvm-project-testing/llvm/lib/Support/Unix/Signals.inc:931:13
#1 0x0000000003187244 llvm::sys::RunSignalHandlers() /usr/workspace/moyasarda1/gpu-kernel-versioning/llvm-project-testing/llvm/lib/Support/Signals.cpp:109:18
#2 0x000000000318a3e0 SignalHandler(int, siginfo_t*, void*) /usr/workspace/moyasarda1/gpu-kernel-versioning/llvm-project-testing/llvm/lib/Support/Unix/Signals.inc:474:38
#3 0x000000000318a268 bool __gnu_cxx::__ops::_Iter_equals_val::operator()(int const*) /opt/rh/gcc-toolset-15/root/usr/lib/gcc/x86_64-redhat-linux/15/../../../../include/c++/15/bits/predefined_ops.h:270:17
#4 0x000000000318a268 int const* std::__find_if>(int const*, int const*, __gnu_cxx::__ops::_Iter_equals_val) /opt/rh/gcc-toolset-15/root/usr/lib/gcc/x86_64-redhat-linux/15/../../../../include/c++/15/bits/stl_algobase.h:2095:36
#5 0x000000000318a268 int const* std::find(int const*, int const*, int const&) /opt/rh/gcc-toolset-15/root/usr/lib/gcc/x86_64-redhat-linux/15/../../../../include/c++/15/bits/stl_algo.h:3895:14
#6 0x000000000318a268 bool llvm::is_contained(int const (&) [10], int const&) /usr/workspace/moyasarda1/gpu-kernel-versioning/llvm-project-testing/llvm/include/llvm/ADT/STLExtras.h:1953:12
#7 0x000000000318a268 SignalHandlerTerminate(int, siginfo_t*, void*) /usr/workspace/moyasarda1/gpu-kernel-versioning/llvm-project-testing/llvm/lib/Support/Unix/Signals.inc:514:7
#8 0x0000155555116990 __restore_rt (/lib64/libpthread.so.0+0x12990)
#9 0x0000155553b855af raise (/lib64/libc.so.6+0x4e5af)
#10 0x0000155553b58ee5 abort (/lib64/libc.so.6+0x21ee5)
#11 0x0000155553b58db9 _nl_load_domain.cold.0 (/lib64/libc.so.6+0x21db9)
#12 0x0000155553b7df06 (/lib64/libc.so.6+0x46f06)
#13 0x0000000002a47497 llvm::Constant* getSequenceIfElementsMatch(llvm::Constant*, llvm::ArrayRef) /usr/workspace/moyasarda1/gpu-kernel-versioning/llvm-project-testing/llvm/lib/IR/Constants.cpp:0:0
#14 0x0000000002a47497 llvm::ConstantArray::getImpl(llvm::ArrayType*, llvm::ArrayRef) /usr/workspace/moyasarda1/gpu-kernel-versioning/llvm-project-testing/llvm/lib/IR/Constants.cpp:1466:12
#15 0x0000000002a46a03 llvm::ConstantArray::get(llvm::ArrayType*, llvm::ArrayRef) /usr/workspace/moyasarda1/gpu-kernel-versioning/llvm-project-testing/llvm/lib/IR/Constants.cpp:1433:17
#16 0x0000000003284df1 llvm::Twine::Twine(llvm::StringRef) /usr/workspace/moyasarda1/gpu-kernel-versioning/llvm-project-testing/llvm/include/llvm/ADT/Twine.h:288:39
#17 0x0000000003284df1 appendToUsedList(llvm::Module&, llvm::StringRef, llvm::ArrayRef) /usr/workspace/moyasarda1/gpu-kernel-versioning/llvm-project-testing/llvm/lib/Transforms/Utils/ModuleUtils.cpp:154:33
#18 0x00000000068c7ec1 llvm::SmallVectorTemplateCommon::begin() /usr/workspace/moyasarda1/gpu-kernel-versioning/llvm-project-testing/llvm/include/llvm/ADT/SmallVector.h:276:45
#19 0x00000000068c7ec1 llvm::SmallVectorTemplateCommon::end() /usr/workspace/moyasarda1/gpu-kernel-versioning/llvm-project-testing/llvm/include/llvm/ADT/SmallVector.h:278:27
#20 0x00000000068c7ec1 llvm::SmallVector::~SmallVector() /usr/workspace/moyasarda1/gpu-kernel-versioning/llvm-project-testing/llvm/include/llvm/ADT/SmallVector.h:1258:46
#21 0x00000000068c7ec1 llvm::prepareForDynamicDebugging(llvm::Module*, llvm::StringRef) /usr/workspace/moyasarda1/gpu-kernel-versioning/llvm-project-testing/llvm/lib/Transforms/Utils/DynamicDebugging.cpp:176:1
#22 0x0000000003503f2a std::__uniq_ptr_impl>::_M_ptr() const /opt/rh/gcc-toolset-15/root/usr/lib/gcc/x86_64-redhat-linux/15/../../../../include/c++/15/bits/unique_ptr.h:192:51
#23 0x0000000003503f2a std::unique_ptr>::get() const /opt/rh/gcc-toolset-15/root/usr/lib/gcc/x86_64-redhat-linux/15/../../../../include/c++/15/bits/unique_ptr.h:472:21
#24 0x0000000003503f2a std::unique_ptr>::operator*() const /opt/rh/gcc-toolset-15/root/usr/lib/gcc/x86_64-redhat-linux/15/../../../../include/c++/15/bits/unique_ptr.h:455:2
#25 0x0000000003503f2a createAndEmbedModuleForDynamicDebugging(clang::CompilerInstance&, clang::CodeGenOptions&, llvm::Module*, llvm::IntrusiveRefCntPtr, clang::BackendConsumer*) /usr/workspace/moyasarda1/gpu-kernel-versioning/llvm-project-testing/clang/lib/CodeGen/BackendUtil.cpp:1454:32
#26 0x0000000003503f2a clang::emitBackendOutput(clang::CompilerInstance&, clang::CodeGenOptions&, llvm::StringRef, llvm::Module*, clang::BackendAction, llvm::IntrusiveRefCntPtr, std::unique_ptr>, clang::BackendConsumer*) /usr/workspace/moyasarda1/gpu-kernel-versioning/llvm-project-testing/clang/lib/CodeGen/BackendUtil.cpp:1566:5
#27 0x0000000003a826ca std::unique_ptr>::~unique_ptr() /opt/rh/gcc-toolset-15/root/usr/lib/gcc/x86_64-redhat-linux/15/../../../../include/c++/15/bits/unique_ptr.h:397:6
#28 0x0000000003a826ca clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) /usr/workspace/moyasarda1/gpu-kernel-versioning/llvm-project-testing/clang/lib/CodeGen/CodeGenAction.cpp:322:3
#29 0x000000000505ce29 clang::ParseAST(clang::Sema&, bool, bool) /usr/workspace/moyasarda1/gpu-kernel-versioning/llvm-project-testing/clang/lib/Parse/ParseAST.cpp:0:13
#30 0x0000000003d09946 clang::FrontendAction::Execute() /usr/workspace/moyasarda1/gpu-kernel-versioning/llvm-project-testing/clang/lib/Frontend/FrontendAction.cpp:1373:10
#31 0x0000000003c865b7 llvm::Error::getPtr() const /usr/workspace/moyasarda1/gpu-kernel-versioning/llvm-project-testing/llvm/include/llvm/Support/Error.h:278:42
#32 0x0000000003c865b7 llvm::Error::operator bool() /usr/workspace/moyasarda1/gpu-kernel-versioning/llvm-project-testing/llvm/include/llvm/Support/Error.h:241:16
#33 0x0000000003c865b7 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) /usr/workspace/moyasarda1/gpu-kernel-versioning/llvm-project-testing/clang/lib/Frontend/CompilerInstance.cpp:1040:23
#34 0x0000000003dbd86a clang::ExecuteCompilerInvocation(clang::CompilerInstance*) /usr/workspace/moyasarda1/gpu-kernel-versioning/llvm-project-testing/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:332:25
#35 0x00000000004a92fc cc1_main(llvm::ArrayRef, char const*, void*) /usr/workspace/moyasarda1/gpu-kernel-versioning/llvm-project-testing/clang/tools/driver/cc1_main.cpp:296:13
#36 0x00000000004a53a5 ExecuteCC1Tool(llvm::SmallVectorImpl&, llvm::ToolContext const&, llvm::IntrusiveRefCntPtr) /usr/workspace/moyasarda1/gpu-kernel-versioning/llvm-project-testing/clang/tools/driver/driver.cpp:229:12
#37 0x00000000004a44b1 clang_main(int, char**, llvm::ToolContext const&) /usr/workspace/moyasarda1/gpu-kernel-versioning/llvm-project-testing/clang/tools/driver/driver.cpp:277:12
#38 0x00000000004b44fd main /usr/workspace/moyasarda1/gpu-kernel-versioning/build-tioga-testing/tools/clang/tools/driver/clang-driver.cpp:17:10
#39 0x0000155553b71865 __libc_start_main (/lib64/libc.so.6+0x3a865)
#40 0x00000000004a2eee _start (/usr/WS1/moyasarda1/gpu-kernel-versioning/build-tioga-testing/bin/clang+0x4a2eee)
```

Clang emits `@llvm.compiler.used = appending addrspace(1) global [1 x ptr addrspace(4)] [...]`. The following transform passes that call `appendToUsedList` hit the assert because the utility tries to append an addrspace 0 ptr.

Contributor guide

Open the contributing guide

Research direction

Run the provided clang -cc1 SPIR-V reproducer to confirm the assertion. Start in llvm/lib/Transforms/Utils/ModuleUtils.cpp at appendToUsedList and inspect the failing ConstantArray construction in llvm/lib/IR/Constants.cpp. Done means the reproducer no longer asserts when used-list pointers have non-default address spaces, with regression coverage for the case.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp
Domain
compilers
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
62/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.