llvm-project
llvm-project copied to clipboard
Segfault in SelectionDAGBuilder::visitInlineAsm upon encountering output memory operand constraint in inline asm
define external i16 @"test"() {
Entry:
call i32 asm "nop", "=m"()
ret i16 0
}
Compiling with llc test.ll segfaults (LLVM 14.0.5):
Stack dump:
0. Program arguments: llc test.ll
1. Running pass 'Function Pass Manager' on module 'test.ll'.
2. Running pass 'X86 DAG->DAG Instruction Selection' on function '@test'
#0 0x00007fad16cd33a1 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/usr/lib/x86_64-linux-gnu/libLLVM-14.so.1+0xea23a1)
#1 0x00007fad16cd10fe llvm::sys::RunSignalHandlers() (/usr/lib/x86_64-linux-gnu/libLLVM-14.so.1+0xea00fe)
#2 0x00007fad16cd38d6 (/usr/lib/x86_64-linux-gnu/libLLVM-14.so.1+0xea28d6)
#3 0x00007fad15e22200 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x12200)
#4 0x00007fad17479bc5 llvm::SelectionDAGBuilder::visitInlineAsm(llvm::CallBase const&, llvm::BasicBlock const*) (/usr/lib/x86_64-linux-gnu/libLLVM-14.so.1+0x1648bc5)
#5 0x00007fad17466b53 llvm::SelectionDAGBuilder::visitCall(llvm::CallInst const&) (/usr/lib/x86_64-linux-gnu/libLLVM-14.so.1+0x1635b53)
#6 0x00007fad1745a651 llvm::SelectionDAGBuilder::visit(llvm::Instruction const&) (/usr/lib/x86_64-linux-gnu/libLLVM-14.so.1+0x1629651)
#7 0x00007fad174ec569 llvm::SelectionDAGISel::SelectBasicBlock(llvm::ilist_iterator<llvm::ilist_detail::node_options<llvm::Instruction, false, false, void>, false, true>, llvm::ilist_iterator<llvm::ilist_detail::node_options<llvm::Instruction, false, false, void>, false, true>, bool&) (/usr/lib/x86_64-linux-gnu/libLLVM-14.so.1+0x16bb569)
#8 0x00007fad174ebff8 llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) (/usr/lib/x86_64-linux-gnu/libLLVM-14.so.1+0x16baff8)
#9 0x00007fad174e9b69 llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) (/usr/lib/x86_64-linux-gnu/libLLVM-14.so.1+0x16b8b69)
#10 0x00007fad194954ad (/usr/lib/x86_64-linux-gnu/libLLVM-14.so.1+0x36644ad)
#11 0x00007fad1705a07e llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (/usr/lib/x86_64-linux-gnu/libLLVM-14.so.1+0x122907e)
#12 0x00007fad16e0daa0 llvm::FPPassManager::runOnFunction(llvm::Function&) (/usr/lib/x86_64-linux-gnu/libLLVM-14.so.1+0xfdcaa0)
#13 0x00007fad16e15093 llvm::FPPassManager::runOnModule(llvm::Module&) (/usr/lib/x86_64-linux-gnu/libLLVM-14.so.1+0xfe4093)
#14 0x00007fad16e0e646 llvm::legacy::PassManagerImpl::run(llvm::Module&) (/usr/lib/x86_64-linux-gnu/libLLVM-14.so.1+0xfdd646)
#15 0x0000000000410cb3 main (/usr/lib/llvm-14/bin/llc+0x410cb3)
#16 0x00007fad158da7fd __libc_start_main ./csu/../csu/libc-start.c:332:16
#17 0x000000000040bafa _start (/usr/lib/llvm-14/bin/llc+0x40bafa)
[1] 48331 segmentation fault llc-14 test.ll
Occurs with -mtriple=x86_64-linux-none, -mtriple=riscv-linux-none, and -mtriple=aarch64-linux-none
I haven't tried other architectures
I think this is supposed to be =*m but this still shouldn't assert
The best we can probably do here is a report_fatal_error. We don't have the right level of information in the IR verifier (well, unless we want to hardcode constraints there).