John Reppy via llvm-dev
2021-Mar-25 22:06 UTC
[llvm-dev] problem with porting a custom calling convention to LLVM 11.0.1
We are attempting to use LLVM as a backend for our Standard ML compiler and
have defined a custom calling convention that passes all arguments in
registers (details can be found in in http://dx.doi.org/10.4204/EPTCS.285.5).
We have this calling convention working in LLVM version 10.0.1 (and previous
versions), but when we ported it to 11.0.1, it fails on the most trivial of
examples.
I'm not sure if something changed in LLVM 11 that requires further changes
to support our calling convention, or if it is a bug in LLVM?
Here are the details. The failure message is:
Can't get register for value!
UNREACHABLE executed at
/Users/jhr/Work/smlnj/sml-llvm/llvm-codegen/llvm-11.0.1.src/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp:1609!
PLEASE submit a bug report to https://bugs.llvm.org/ and include the crash
backtrace.
Stack dump:
0. Program arguments: ../llvm-debug/bin/llc -O1 -o triv.s triv.ll
1. Running pass 'Function Pass Manager' on module 'triv.ll'.
2. Running pass 'X86 DAG->DAG Instruction Selection' on function
'@entry71'
0 llc 0x00000001033fc73a
llvm::sys::PrintStackTrace(llvm::raw_ostream&) + 58
1 llc 0x00000001033fccc9
PrintStackTraceSignalHandler(void*) + 25
2 llc 0x00000001033fab9b llvm::sys::RunSignalHandlers() +
123
3 llc 0x00000001033fea79 SignalHandler(int) + 249
4 libsystem_platform.dylib 0x00007fff692445fd _sigtramp + 29
5 libsystem_platform.dylib 000000000000000000 _sigtramp + 18446603338752178720
6 libsystem_c.dylib 0x00007fff6911a808 abort + 120
7 llc 0x0000000103297854
llvm::llvm_unreachable_internal(char const*, char const*, unsigned int) + 180
8 llc 0x0000000103028bb2
llvm::SelectionDAGBuilder::getValueImpl(llvm::Value const*) + 6642
9 llc 0x000000010302714d
llvm::SelectionDAGBuilder::getValue(llvm::Value const*) + 173
10 llc 0x000000010301d92a
llvm::SelectionDAGBuilder::visitBitCast(llvm::User const&) + 58
11 llc 0x0000000103012d5b
llvm::SelectionDAGBuilder::visit(unsigned int, llvm::User const&) + 1115
12 llc 0x00000001030120dd
llvm::SelectionDAGBuilder::visit(llvm::Instruction const&) + 141
13 llc 0x0000000103127a4a
llvm::SelectionDAGISel::SelectBasicBlock(llvm::ilist_iterator<llvm::ilist_detail::node_options<llvm::Instruction,
true, false, void>, false, true>,
llvm::ilist_iterator<llvm::ilist_detail::node_options<llvm::Instruction,
true, false, void>, false, true>, bool&) + 218
14 llc 0x0000000103125b3d
llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) + 6061
15 llc 0x0000000103122501
llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) + 2129
16 llc 0x0000000100da6153 (anonymous
namespace)::X86DAGToDAGISel::runOnMachineFunction(llvm::MachineFunction&) +
259
17 llc 0x0000000101cf080d
llvm::MachineFunctionPass::runOnFunction(llvm::Function&) + 541
18 llc 0x00000001024d6dcc
llvm::FPPassManager::runOnFunction(llvm::Function&) + 700
19 llc 0x00000001024df035
llvm::FPPassManager::runOnModule(llvm::Module&) + 117
20 llc 0x00000001024d7794 (anonymous
namespace)::MPPassManager::runOnModule(llvm::Module&) + 772
21 llc 0x00000001024d72b8
llvm::legacy::PassManagerImpl::run(llvm::Module&) + 296
22 llc 0x00000001024df3d1
llvm::legacy::PassManager::run(llvm::Module&) + 33
23 llc 0x00000001007f3937 compileModule(char**,
llvm::LLVMContext&) + 6663
24 llc 0x00000001007f1807 main + 1447
25 libdyld.dylib 0x00007fff6904bcc9 start + 1
26 libdyld.dylib 0x0000000000000005 start + 18446603338754245437
Abort
and the IR immediately before the crash is
*** IR Dump After Safe Stack instrumentation pass ***
; Function Attrs: naked
define cc20 void @entry71(i64** %allocPtr, i64** %limitPtr, i64** %storePtr,
i64* %0, i64* %1, i64* %2, i64* %3, i64* %4, i64* %5, i64* %6) #0 {
L_71:
%7 = bitcast i64* %2 to void (i64**, i64**, i64**, i64*, i64*, i64*, i64*,
i64*, i64*, i64*)*
tail call cc20 void %7(i64** %allocPtr, i64** %limitPtr, i64** %storePtr, i64*
undef, i64* undef, i64* %2, i64* %3, i64* %4, i64* %5, i64* %6)
ret void
}
The Value in question is "%2" and is an "Argument". We see
this error for both the x86-64 and arm64 targets.
Using LLVM 10.0.1, where this example does not crash, the IR dump immediately
following the above is:
# *** IR Dump After Finalize ISel and expand pseudo-instructions ***:
# Machine code for function entry71: IsSSA, TracksLiveness
Function Live Ins: $rdi in %0, $r14 in %1, $r15 in %2, $rsi in %5, $rbx in %6,
$rcx in %7, $rdx in %8, $rbp in %9
bb.0.L_71:
liveins: $rdi, $r14, $r15, $rsi, $rbx, $rcx, $rdx, $rbp
%9:gr64 = COPY $rbp
%8:gr64 = COPY $rdx
%7:gr64 = COPY $rcx
%6:gr64 = COPY $rbx
%5:gr64_tc = COPY $rsi
%2:gr64 = COPY $r15
%1:gr64 = COPY $r14
%0:gr64 = COPY $rdi
$rdi = COPY %0:gr64
$r14 = COPY %1:gr64
$r15 = COPY %2:gr64
%10:gr64 = IMPLICIT_DEF
$r8 = COPY %10:gr64
%11:gr64 = IMPLICIT_DEF
$r9 = COPY %11:gr64
$rsi = COPY %5:gr64_tc
$rbx = COPY %6:gr64
$rcx = COPY %7:gr64
$rdx = COPY %8:gr64
$rbp = COPY %9:gr64
TCRETURNri64 %5:gr64_tc, 0, <regmask>, implicit $rsp, implicit $ssp,
implicit $rdi, implicit $r14, implicit $r15, implicit $r8, implicit $r9,
implicit $rsi, implicit $rbx, implicit $rcx, implicit $rdx, implicit $rbp
# End machine code for function entry71.
Any help in figuring this problem out will be appreciated.
- John