llvm-project icon indicating copy to clipboard operation
llvm-project copied to clipboard

Segfault in SelectionDAGBuilder::visitInlineAsm upon encountering output memory operand constraint in inline asm

Open topolarity opened this issue 3 years ago • 3 comments

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

topolarity avatar Jul 26 '22 23:07 topolarity

Occurs with -mtriple=x86_64-linux-none, -mtriple=riscv-linux-none, and -mtriple=aarch64-linux-none

I haven't tried other architectures

topolarity avatar Jul 26 '22 23:07 topolarity

I think this is supposed to be =*m but this still shouldn't assert

arsenm avatar Jul 27 '22 00:07 arsenm

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).

nikic avatar Jul 27 '22 08:07 nikic