llvm / llvm/llvm-project

[Clang] c23: _BitInt(BITINT_MAXWIDTH) snippet that causes a compiler crash

Open
#160,784 2 comments 0 reactions 0 assignees View on GitHub
backend:X86 c23 crash-on-valid llvm:SelectionDAG
Dominant language
LLVM
Stars
40.5k
Forks
18.7k
PR merge metrics
PR metrics pending

Description

Was experimenting with contrived C23 BitInt code when I stumbled upon a code+compiler-options combination that failed to compile with a compiler crash. I used llvm/clang-20.1.8 as it's installed on my host, but the same code block timed out during compilation on [Godbolt](https://godbolt.org/#g:!((g:!((g:!((h:codeEditor,i:(filename:'1',fontScale:14,fontUsePx:'0',j:1,lang:___c,selection:(endColumn:1,endLineNumber:11,positionColumn:1,positionLineNumber:11,selectionStartColumn:1,selectionStartLineNumber:11,startColumn:1,startLineNumber:11),source:'%23include+%3Climits.h%3E%0A%23include+%3Cstdio.h%3E%0A%23include+%3Cstdlib.h%3E%0A%0Atypedef+unsigned+_BitInt(BITINT_MAXWIDTH)+Big%3B%0A%0Astatic+void+work(Big+*val,+unsigned+int+pos)%0A%7B%0A%09Big+*mask+%3D+malloc(sizeof(*mask))%3B%0A%09*mask+%3D+1+%3C%3C+pos%3B%0A%0A%09if+(*mask+%26+*val)%0A%09%09putchar(!'y!')%3B%0A%09else%0A%09%09putchar(!'n!')%3B%0A%09putchar(!'%5Cn!')%3B%0A%0A%09*mask+%3D+1%3B%0A%09for+(unsigned+int+i+%3D+0%3B+i+%3C+BITINT_MAXWIDTH%3B+i%2B%2B,+*mask%3C%3C%3D1)+%7B%0A%09%09if+(*mask+%26+*val)%0A%09%09%09putchar(!'1!')%3B%0A%09%09else%0A%09%09%09putchar(!'0!')%3B%09%0A%09%09putchar(!'%5Cn!')%3B%0A%09%7D%0A%0A%09free(mask)%3B%0A%7D%0A%0Aint+main(int+argc,+char**)%0A%7B%0A%09srand(0)%3B%0A%0A%09Big+*val+%3D+malloc(sizeof(*val))%3B%0A%09*val+%3D+rand()%3B%0A%0A%09work(val,+argc)%3B%0A%0A%09free(val)%3B%0A%09return+0%3B%0A%7D%0A%0A'),l:'5',n:'0',o:'C+source+%231',t:'0')),k:50,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((h:compiler,i:(compiler:cclang_trunk,filters:(b:'0',binary:'1',binaryObject:'1',commentOnly:'0',debugCalls:'1',demangle:'0',directives:'0',execute:'1',intel:'0',libraryCode:'0',trim:'1',verboseDemangling:'0'),flagsViewOpen:'1',fontScale:14,fontUsePx:'0',j:1,lang:___c,libs:!(),options:'-std%3Dc23+-march%3Dx86-64-v4+-mtune%3Dskylake-avx512+-fpie+-pipe',overrides:!(),selection:(endColumn:1,endLineNumber:1,positionColumn:1,positionLineNumber:1,selectionStartColumn:1,selectionStartLineNumber:1,startColumn:1,startLineNumber:1),source:1),l:'5',n:'0',o:'+x86-64+clang+(trunk)+(Editor+%231)',t:'0')),k:50,l:'4',n:'0',o:'',s:0,t:'0')),l:'2',n:'0',o:'',t:'0')),version:4) with clang trunk, so I'm guessing this can still happen.

Note: Using gcc v15.2.1, with same code and compiler options, this builds fine, in under a second.

In lieu of attachments, here are the relevant gists:
* [backtrace](https://gist.github.com/thac0/2bcf24a7e26e7eb39e7baf81293b567f)
* [pre-processed source](https://gist.github.com/thac0/1455e5538d25f246294e9ae4b0739e9c)
* [build script](https://gist.github.com/thac0/0fd57d4e4afa11529a9f9b062b5beed0)

And the copy-pasted backtrace (note the compiler had run for about 6 minutes prior to crash-- on a modern 2-socket Xeon server with about 384GB of RAM, no contention):
```
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
0. Program arguments: clang -v -std=c23 -march=x86-64-v4 -mtune=skylake-avx512 -Og -fpie -pipe -c -o i_dare_you_to_compile_me.o i_dare_you_to_compile_me.c
1. parser at end of file
2. Code generation
3. Running pass 'Function Pass Manager' on module 'i_dare_you_to_compile_me.c'.
4. Running pass 'X86 DAG->DAG Instruction Selection' on function '@main'
#0 0x00007f6d3ccea01d llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /usr/src/debug/llvm/llvm-20.1.8.src/lib/Support/Unix/Signals.inc:799:22
#1 0x00007f6d3cce7b77 llvm::sys::RunSignalHandlers() /usr/src/debug/llvm/llvm-20.1.8.src/lib/Support/Signals.cpp:105:20
#2 0x00007f6d3cce7b77 llvm::sys::CleanupOnSignal(unsigned long) /usr/src/debug/llvm/llvm-20.1.8.src/lib/Support/Unix/Signals.inc:369:31
#3 0x00007f6d3cbcbb29 HandleCrash /usr/src/debug/llvm/llvm-20.1.8.src/lib/Support/CrashRecoveryContext.cpp:73:5
#4 0x00007f6d3cbcbb29 CrashRecoverySignalHandler /usr/src/debug/llvm/llvm-20.1.8.src/lib/Support/CrashRecoveryContext.cpp:390:62
#5 0x00007f6d3bc3e540 (/usr/lib/libc.so.6+0x3e540)
#6 0x00007f6d3d38c44f llvm::MachineRegisterInfo::addRegOperandToUseList(llvm::MachineOperand*) /usr/src/debug/llvm/llvm-20.1.8.src/lib/CodeGen/MachineRegisterInfo.cpp:276:25
#7 0x00007f6d3d2dd010 llvm::MachineInstr::addOperand(llvm::MachineFunction&, llvm::MachineOperand const&) /usr/src/debug/llvm/llvm-20.1.8.src/lib/CodeGen/MachineInstr.cpp:274:34
#8 0x00007f6d3d7eecb5 llvm::TrackingMDRef::untrack() /usr/src/debug/llvm/llvm-20.1.8.src/include/llvm/IR/TrackingMDRef.h:89:9
#9 0x00007f6d3d7eecb5 llvm::TrackingMDRef::~TrackingMDRef() /usr/src/debug/llvm/llvm-20.1.8.src/include/llvm/IR/TrackingMDRef.h:55:29
#10 0x00007f6d3d7eecb5 llvm::TypedTrackingMDRef::~TypedTrackingMDRef() /usr/src/debug/llvm/llvm-20.1.8.src/include/llvm/IR/TrackingMDRef.h:106:26
#11 0x00007f6d3d7eecb5 llvm::DebugLoc::~DebugLoc() /usr/src/debug/llvm/llvm-20.1.8.src/include/llvm/IR/DebugLoc.h:33:9
#12 0x00007f6d3d7eecb5 llvm::MIMetadata::~MIMetadata() /usr/src/debug/llvm/llvm-20.1.8.src/include/llvm/CodeGen/MachineInstrBuilder.h:348:7
#13 0x00007f6d3d7eecb5 llvm::InstrEmitter::AddRegisterOperand(llvm::MachineInstrBuilder&, llvm::SDValue, unsigned int, llvm::MCInstrDesc const*, llvm::SmallDenseMap, llvm::detail::DenseMapPair>&, bool, bool, bool) /usr/src/debug/llvm/llvm-20.1.8.src/lib/CodeGen/SelectionDAG/InstrEmitter.cpp:354
:50
#14 0x00007f6d3d7f6c60 llvm::InstrEmitter::EmitMachineNode(llvm::SDNode*, bool, bool, llvm::SmallDenseMap, llvm::detail::Dens
eMapPair>&) /usr/src/debug/llvm/llvm-20.1.8.src/lib/CodeGen/SelectionDAG/InstrEmitter.cpp:1120:32
#15 0x00007f6d3d90a195 llvm::InstrEmitter::EmitNode(llvm::SDNode*, bool, bool, llvm::SmallDenseMap, llvm::detail::DenseMapPai
r>&) /usr/src/debug/llvm/llvm-20.1.8.src/lib/CodeGen/SelectionDAG/InstrEmitter.h:145:22
#16 0x00007f6d3d90a195 operator() /usr/src/debug/llvm/llvm-20.1.8.src/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp:874:21
#17 0x00007f6d3d911c10 llvm::ScheduleDAGSDNodes::EmitSchedule(llvm::MachineInstrBundleIterator&) /usr/src/debug/llvm/llvm-20.1.8.src/lib/CodeGen/SelectionDAG/ScheduleDAGSDNod
es.cpp:965:17
#18 0x00007f6d3da0fc35 llvm::SelectionDAGISel::CodeGenAndEmitDAG() /usr/src/debug/llvm/llvm-20.1.8.src/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1153:29
#19 0x00007f6d3da12f54 llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) /usr/src/debug/llvm/llvm-20.1.8.src/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1904:33
#20 0x00007f6d3da147a4 llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) /usr/src/debug/llvm/llvm-20.1.8.src/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:616:22
#21 0x00007f6d3da0270b llvm::OptLevelChanger::~OptLevelChanger() /usr/src/debug/llvm/llvm-20.1.8.src/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:269:7
#22 0x00007f6d3da0270b llvm::SelectionDAGISelLegacy::runOnMachineFunction(llvm::MachineFunction&) /usr/src/debug/llvm/llvm-20.1.8.src/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:376:1
#23 0x00007f6d3da0270b llvm::SelectionDAGISelLegacy::runOnMachineFunction(llvm::MachineFunction&) /usr/src/debug/llvm/llvm-20.1.8.src/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:347:6
#24 0x00007f6d3d2d28ff llvm::MachineFunctionPass::runOnFunction(llvm::Function&) /usr/src/debug/llvm/llvm-20.1.8.src/lib/CodeGen/MachineFunctionPass.cpp:94:33
#25 0x00007f6d3ced0fa3 llvm::FPPassManager::runOnFunction(llvm::Function&) /usr/src/debug/llvm/llvm-20.1.8.src/lib/IR/LegacyPassManager.cpp:1406:40
#26 0x00007f6d3ced1183 llvm::ilist_detail::node_base_prevnext, false>::getNext() const /usr/src/debug/llvm/llvm-20.1.8.src/include/llvm/ADT/ilist_node_base.h:28:38
#27 0x00007f6d3ced1183 llvm::ilist_node_impl>::getNext() /usr/src/debug/llvm/llvm-20.1.8.src/include/llvm/ADT/ilist_nod
e.h:117:66
#28 0x00007f6d3ced1183 llvm::ilist_iterator, false, false>::operator++() /usr/src/debug/llvm/llvm-20.1.8.src/include/ll
vm/ADT/ilist_iterator.h:187:25
#29 0x00007f6d3ced1183 llvm::FPPassManager::runOnModule(llvm::Module&) /usr/src/debug/llvm/llvm-20.1.8.src/lib/IR/LegacyPassManager.cpp:1451:22
#30 0x00007f6d3ced0382 runOnModule /usr/src/debug/llvm/llvm-20.1.8.src/lib/IR/LegacyPassManager.cpp:1521:38
#31 0x00007f6d3ced0382 llvm::legacy::PassManagerImpl::run(llvm::Module&) /usr/src/debug/llvm/llvm-20.1.8.src/lib/IR/LegacyPassManager.cpp:539:55
#32 0x00007f6d476fd162 RunCodegenPipeline /usr/src/debug/clang/clang-20.1.8.src/lib/CodeGen/BackendUtil.cpp:1229:9
#33 0x00007f6d476fd162 emitAssembly /usr/src/debug/clang/clang-20.1.8.src/lib/CodeGen/BackendUtil.cpp:1252:21
#34 0x00007f6d476fd162 clang::emitBackendOutput(clang::CompilerInstance&, clang::CodeGenOptions&, llvm::StringRef, llvm::Module*, clang::BackendAction, llvm::IntrusiveRefCntPtr,
std::unique_ptr>, clang::BackendConsumer*) /usr/src/debug/clang/clang-20.1.8.src/lib/CodeGen/BackendUtil.cpp:1416:25
#35 0x00007f6d47b4793d llvm::IntrusiveRefCntPtr::release() /usr/include/llvm/ADT/IntrusiveRefCntPtr.h:232:9
#36 0x00007f6d47b4793d llvm::IntrusiveRefCntPtr::~IntrusiveRefCntPtr() /usr/include/llvm/ADT/IntrusiveRefCntPtr.h:196:34
#37 0x00007f6d47b4793d clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) /usr/src/debug/clang/clang-20.1.8.src/lib/CodeGen/CodeGenAction.cpp:315:20
#38 0x00007f6d46307516 __gnu_cxx::__normal_iterator>*, std::vector>, std::allocator>>>>::__normal_iterator(std::unique_ptr>* const&) /usr/include/c++/15.1.1/bits/stl_itera
tor.h:1059:9
#39 0x00007f6d46307516 std::vector>, std::allocator>>>::begin() /usr/include/c++/15.1.1/bits/stl_vector.h:999:16
#40 0x00007f6d46307516 void clang::finalize>, std::allocator>>>>(std::vector>, std::allocator>>>&, clang::Sema const&) /usr/src/debug/clang/cla
ng-20.1.8.src/include/clang/Sema/TemplateInstCallback.h:54:3
#41 0x00007f6d46307516 clang::ParseAST(clang::Sema&, bool, bool) /usr/src/debug/clang/clang-20.1.8.src/lib/Parse/ParseAST.cpp:191:11
#42 0x00007f6d4849f23c clang::CompilerInstance::shouldBuildGlobalModuleIndex() const /usr/src/debug/clang/clang-20.1.8.src/lib/Frontend/CompilerInstance.cpp:88:58
#43 0x00007f6d4849f23c clang::FrontendAction::Execute() /usr/src/debug/clang/clang-20.1.8.src/lib/Frontend/FrontendAction.cpp:1076:38
#44 0x00007f6d48425c57 llvm::Error::getPtr() const /usr/include/llvm/Support/Error.h:282:12
#45 0x00007f6d48425c57 llvm::Error::operator bool() /usr/include/llvm/Support/Error.h:242:22
#46 0x00007f6d48425c57 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) /usr/src/debug/clang/clang-20.1.8.src/lib/Frontend/CompilerInstance.cpp:1056:42
#47 0x00007f6d4850742f std::__shared_ptr::get() const /usr/include/c++/15.1.1/bits/shared_ptr_base.h:1673:16
#48 0x00007f6d4850742f std::__shared_ptr_access::_M_get() const /usr/include/c++/15.1.1/bits/shared_ptr_base.h:1370:69
#49 0x00007f6d4850742f std::__shared_ptr_access::operator*() const /usr/include/c++/15.1.1/bits/shared_ptr_base.h:1358:40
#50 0x00007f6d4850742f clang::CompilerInvocation::getFrontendOpts() /usr/src/debug/clang/clang-20.1.8.src/include/clang/Frontend/CompilerInvocation.h:259:48
#51 0x00007f6d4850742f clang::CompilerInstance::getFrontendOpts() /usr/src/debug/clang/clang-20.1.8.src/include/clang/Frontend/CompilerInstance.h:313:39
#52 0x00007f6d4850742f clang::ExecuteCompilerInvocation(clang::CompilerInstance*) /usr/src/debug/clang/clang-20.1.8.src/lib/FrontendTool/ExecuteCompilerInvocation.cpp:297:29
#53 0x00005595527cfa03 cc1_main(llvm::ArrayRef, char const*, void*) /usr/src/debug/clang/clang-20.1.8.src/tools/driver/cc1_main.cpp:290:40
#54 0x00005595527d3781 ExecuteCC1Tool /usr/src/debug/clang/clang-20.1.8.src/tools/driver/driver.cpp:218:20
#55 0x00007f6d48048205 operator() /usr/src/debug/clang/clang-20.1.8.src/lib/Driver/Job.cpp:437:32
#56 0x00007f6d48048205 callback_fn >, std::string*, bool*) const:: > /usr/include/llvm/ADT/STLFunctionalExtras
.h:46:52
#57 0x00007f6d3cbcbf88 llvm::CrashRecoveryContext::RunSafely(llvm::function_ref) /usr/src/debug/llvm/llvm-20.1.8.src/lib/Support/CrashRecoveryContext.cpp:428:1
#58 0x00007f6d48052a15 clang::driver::CC1Command::Execute(llvm::ArrayRef>, std::__cxx11::basic_string, std::allocator>*, bool*) const /
usr/src/debug/clang/clang-20.1.8.src/lib/Driver/Job.cpp:441:10
#59 0x00007f6d4807fcfb clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&, bool) const /usr/src/debug/clang/clang-20.1.8.src/lib/Driver/Compilation
.cpp:196:22
#60 0x00007f6d480800ec clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&, llvm::SmallVectorImpl>&, bool) const /usr/src/debug/clang/cla
ng-20.1.8.src/lib/Driver/Compilation.cpp:251:5
#61 0x00007f6d48084895 llvm::SmallVectorBase::empty() const /usr/include/llvm/ADT/SmallVector.h:81:46
#62 0x00007f6d48084895 clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl>&) /usr/src/debug/clang/clang-20.1.8.sr
c/lib/Driver/Driver.cpp:2190:28
#63 0x00005595527d59e4 llvm::SmallVectorBase::size() const /usr/include/llvm/ADT/SmallVector.h:78:32
#64 0x00005595527d59e4 llvm::SmallVectorTemplateCommon, void>::end() /usr/include/llvm/ADT/SmallVector.h:269:41
#65 0x00005595527d59e4 clang_main(int, char**, llvm::ToolContext const&) /usr/src/debug/clang/clang-20.1.8.src/tools/driver/driver.cpp:404:26
#66 0x00005595527c61e0 main /usr/src/debug/clang/clang-20.1.8.src/build/tools/driver/clang-driver.cpp:18:1
#67 0x00007f6d3bc27675 __libc_start_call_main /usr/src/debug/glibc/glibc/csu/../sysdeps/nptl/libc_start_call_main.h:74:3
#68 0x00007f6d3bc27729 call_init /usr/src/debug/glibc/glibc/csu/../csu/libc-start.c:128:20
#69 0x00007f6d3bc27729 __libc_start_main /usr/src/debug/glibc/glibc/csu/../csu/libc-start.c:347:5
#70 0x00005595527c6245 _start (/usr/bin/clang-20+0xb245)
clang: error: clang frontend command failed with exit code 139 (use -v to see invocation)
clang version 20.1.8
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
clang: note: diagnostic msg:
********************

PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
clang: note: diagnostic msg: /home/jbkonno/tmp/i_dare_you_to_compile_me-7cc4a1.c
clang: note: diagnostic msg: /home/jbkonno/tmp/i_dare_you_to_compile_me-7cc4a1.sh
clang: note: diagnostic msg:

********************
clang -v -std=c23 -march=x86-64-v4 -mtune=skylake-avx512 -Og -fpie -pipe -c -

408.19s user 0.98s system 99% cpu 6:50.33 total
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.