llvm / llvm-project

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.
http://llvm.org
Other
28.23k stars 11.65k forks source link

[WebAssembly] Assertion failure on emitting an unused result of an inline asm #30348

Open llvmbot opened 7 years ago

llvmbot commented 7 years ago
Bugzilla Link 31000
Version trunk
OS Linux
Reporter LLVM Bugzilla Contributor
CC @sunfishcode

Extended Description

The WebAssembly backend hits an assertion failure when a result of inline assembly is unused. Here is a repro case and the stack trace.

--- foo.ll target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" target triple = "wasm32"

define void @​f() { A: %t = xor i1 1, 0 br i1 %t, label %B, label %X

B: %y = tail call i32 asm "i32.ctz $0=, $1", "=r,r"(i32 0) br label %X

X: %r = phi i32 [ 0, %A ], [ %y, %B ] ret void }


llc: /home/tzik/backpack/dev/llvm/src/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp:112: std::string (anonymous namespace)::WebAssemblyAsmPrinter::regToString(const llvm::MachineOperand &): Assertion `WAReg != WebAssemblyFunctionInfo::UnusedReg' failed.

​0 0x00007f11258d989c llvm::sys::PrintStackTrace(llvm::raw_ostream&) /home/tzik/backpack/dev/llvm/src/llvm/lib/Support/Unix/Signals.inc:402:11

​1 0x00007f11258d9d89 PrintStackTraceSignalHandler(void*) /home/tzik/backpack/dev/llvm/src/llvm/lib/Support/Unix/Signals.inc:466:1

​2 0x00007f11258d8113 llvm::sys::RunSignalHandlers() /home/tzik/backpack/dev/llvm/src/llvm/lib/Support/Signals.cpp:45:5

​3 0x00007f11258da0e4 SignalHandler(int) /home/tzik/backpack/dev/llvm/src/llvm/lib/Support/Unix/Signals.inc:256:1

​4 0x00007f1124d5be20 __restore_rt (/lib64/libpthread.so.0+0x10e20)

​5 0x00007f11241752e7 gsignal (/lib64/libc.so.6+0x332e7)

​6 0x00007f112417676a abort (/lib64/libc.so.6+0x3476a)

​7 0x00007f112416e30d (/lib64/libc.so.6+0x2c30d)

​8 0x00007f112416e3c2 (/lib64/libc.so.6+0x2c3c2)

​9 0x00007f1129aa9cde (anonymous namespace)::WebAssemblyAsmPrinter::regToString(llvm::MachineOperand const&) /home/tzik/backpack/dev/llvm/src/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp:112:3

​10 0x00007f1129aa96cd (anonymous namespace)::WebAssemblyAsmPrinter::PrintAsmOperand(llvm::MachineInstr const, unsigned int, unsigned int, char const, llvm::raw_ostream&) /home/tzik/backpack/dev/llvm/src/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp:274:13

​11 0x00007f112853d891 EmitGCCInlineAsmStr(char const, llvm::MachineInstr const, llvm::MachineModuleInfo, int, int, llvm::AsmPrinter, unsigned int, llvm::raw_ostream&) /home/tzik/backpack/dev/llvm/src/llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp:409:21

​12 0x00007f112853cabd llvm::AsmPrinter::EmitInlineAsm(llvm::MachineInstr const*) const /home/tzik/backpack/dev/llvm/src/llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp:482:5

​13 0x00007f1128515171 llvm::AsmPrinter::EmitFunctionBody() /home/tzik/backpack/dev/llvm/src/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp:879:9

​14 0x00007f1129aaa268 llvm::AsmPrinter::runOnMachineFunction(llvm::MachineFunction&) /home/tzik/backpack/dev/llvm/src/llvm/include/llvm/CodeGen/AsmPrinter.h:230:5

​15 0x00007f1129aa8b1f (anonymous namespace)::WebAssemblyAsmPrinter::runOnMachineFunction(llvm::MachineFunction&) /home/tzik/backpack/dev/llvm/src/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp:63:5

​16 0x00007f1127cfbc61 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) /home/tzik/backpack/dev/llvm/src/llvm/lib/CodeGen/MachineFunctionPass.cpp:62:8

​17 0x00007f112744239f llvm::FPPassManager::runOnFunction(llvm::Function&) /home/tzik/backpack/dev/llvm/src/llvm/lib/IR/LegacyPassManager.cpp:1511:23

​18 0x00007f11274426b5 llvm::FPPassManager::runOnModule(llvm::Module&) /home/tzik/backpack/dev/llvm/src/llvm/lib/IR/LegacyPassManager.cpp:1532:16

​19 0x00007f1127442e4a (anonymous namespace)::MPPassManager::runOnModule(llvm::Module&) /home/tzik/backpack/dev/llvm/src/llvm/lib/IR/LegacyPassManager.cpp:1588:23

​20 0x00007f1127442976 llvm::legacy::PassManagerImpl::run(llvm::Module&) /home/tzik/backpack/dev/llvm/src/llvm/lib/IR/LegacyPassManager.cpp:1691:16

​21 0x00007f1127443361 llvm::legacy::PassManager::run(llvm::Module&) /home/tzik/backpack/dev/llvm/src/llvm/lib/IR/LegacyPassManager.cpp:1722:3

​22 0x000000000041d019 (llc+0x41d019)

​23 0x000000000041b502 (llc+0x41b502)

​24 0x00007f1124162620 __libc_start_main (/lib64/libc.so.6+0x20620)

​25 0x000000000041afa9 (llc+0x41afa9)

Stack dump:

  1. Program arguments: llc -filetype asm foo.ll
  2. Running pass 'Function Pass Manager' on module 'foo.ll'.
  3. Running pass 'WebAssembly Assembly Printer' on function '@f'
sunfishcode commented 6 years ago

The segfault is "fixed" in the wasm32-unknown-unknown-wasm target by r317707. That said, it only works for text output, rather than integrated-as mode, because assembly parsing is not yet implemented.