llvm / llvm/llvm-project

Artificial subregisters of non-artificial super-register crashes tablegen

Open
#218,854 0 comments 0 reactions 0 assignees View on GitHub
crash tablegen
Dominant language
LLVM
Stars
40.5k
Forks
18.7k
PR merge metrics
PR metrics pending

Description

The following setup for specifying 16 and 8 bit artificial subregisters of a 32-bit register causes tablegen to crash.
```
class SHRegWithSubRegs Enc, string n, list subregs>
: RegisterWithSubRegs {
let HWEncoding = Enc;
let Namespace = "SH";
}

class GPRReg8 Enc, string n> : SHReg {
let isArtificial = 1;
}

class GPRReg16 Enc, string n, list subregs>
: SHRegWithSubRegs {
let isArtificial = 1;
let SubRegIndices = [sub_8];
}

// SH General Purpose Registers.
class GPRReg32 Enc, string n, list subregs>
: SHRegWithSubRegs {
let SubRegIndices = [sub_16];
}

multiclass GPRReg Enc, string n> {
def NAME#B : GPRReg8;
defvar RB = !cast(NAME#B);

def NAME#W : GPRReg16;
defvar RW = !cast(NAME#W);

def NAME : GPRReg32;
}
```

The following stacktrace is produced during the crash.
```
/usr/bin/../lib/gcc/x86_64-redhat-linux/16/../../../../include/c++/16/bits/stl_vector.h:1253: reference std::vector::operator[](size_type) [_Tp = unsigned int, _Alloc = std::allocator]: Assertion '__n < this->size()' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace and instructions to reproduce the bug.
Stack dump:
0. Program arguments: /mnt/Work/projects/llvm-sh/ll_build/bin/llvm-tblgen -gen-register-info -I/mnt/Work/projects/llvm-sh/llvm-project/llvm/lib/Target/SuperH -I/mnt/Work/projects/llvm-sh/ll_build/include -I/mnt/Work/projects/llvm-sh/llvm-project/llvm/include -I /mnt/Work/projects/llvm-sh/llvm-project/llvm/lib/Target /mnt/Work/projects/llvm-sh/llvm-project/llvm/lib/Target/SuperH/SuperH.td --write-if-changed -o SuperHGenRegisterInfo.inc -d SuperHGenRegisterInfo.inc.d
#0 0x0000000000bf7d7d llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /mnt/Work/projects/llvm-sh/llvm-project/llvm/lib/Support/Unix/Signals.inc:880:11
#1 0x0000000000bf82ab PrintStackTraceSignalHandler(void*) /mnt/Work/projects/llvm-sh/llvm-project/llvm/lib/Support/Unix/Signals.inc:962:1
#2 0x0000000000bf6144 llvm::sys::RunSignalHandlers() /mnt/Work/projects/llvm-sh/llvm-project/llvm/lib/Support/Signals.cpp:108:5
#3 0x0000000000bf89d9 SignalHandler(int, siginfo_t*, void*) /mnt/Work/projects/llvm-sh/llvm-project/llvm/lib/Support/Unix/Signals.inc:448:38
#4 0x00007f78f2e20fb0 __restore_rt (/lib64/libc.so.6+0x19fb0)
#5 0x00007f78f2e7bccc __pthread_kill_implementation (/lib64/libc.so.6+0x74ccc)
#6 0x00007f78f2e20e8e gsignal (/lib64/libc.so.6+0x19e8e)
#7 0x00007f78f2e087b3 abort (/lib64/libc.so.6+0x17b3)
#8 0x00007f78f300b64a (/lib64/libstdc++.so.6+0xb64a)
#9 0x000000000060ac6d std::vector>::operator[](unsigned long) /usr/bin/../lib/gcc/x86_64-redhat-linux/16/../../../../include/c++/16/bits/stl_vector.h:1253:2
#10 0x0000000000731ace llvm::CodeGenRegBank::pruneUnitSets() /mnt/Work/projects/llvm-sh/llvm-project/llvm/utils/TableGen/Common/CodeGenRegisters.cpp:2089:38
#11 0x00000000007321a2 llvm::CodeGenRegBank::computeRegUnitSets() /mnt/Work/projects/llvm-sh/llvm-project/llvm/utils/TableGen/Common/CodeGenRegisters.cpp:2166:3
#12 0x0000000000733501 llvm::CodeGenRegBank::computeDerivedInfo() /mnt/Work/projects/llvm-sh/llvm-project/llvm/utils/TableGen/Common/CodeGenRegisters.cpp:2332:3
#13 0x0000000000a27103 (anonymous namespace)::RegisterInfoEmitter::RegisterInfoEmitter(llvm::RecordKeeper const&) /mnt/Work/projects/llvm-sh/llvm-project/llvm/utils/TableGen/RegisterInfoEmitter.cpp:71:3
#14 0x0000000000a2705c llvm::TableGen::Emitter::MultiFileOptClass<(anonymous namespace)::RegisterInfoEmitter>::run(llvm::StringRef, llvm::RecordKeeper const&) /mnt/Work/projects/llvm-sh/llvm-project/llvm/include/llvm/TableGen/TableGenBackend.h:76:12
#15 0x0000000000c67b57 llvm::TableGen::Emitter::ApplyCallback(llvm::RecordKeeper const&, llvm::TableGenOutputFiles&, llvm::StringRef) /mnt/Work/projects/llvm-sh/llvm-project/llvm/lib/TableGen/TableGenBackend.cpp:75:5
#16 0x0000000000c1b719 llvm::TableGenMain(char const*, llvm::function_ref) /mnt/Work/projects/llvm-sh/llvm-project/llvm/lib/TableGen/Main.cpp:184:7
#17 0x000000000061eb85 tblgen_main(int, char**) /mnt/Work/projects/llvm-sh/llvm-project/llvm/utils/TableGen/Basic/TableGen.cpp:77:10
#18 0x0000000000a066d2 main /mnt/Work/projects/llvm-sh/llvm-project/llvm/utils/TableGen/llvm-tblgen.cpp:18:35
#19 0x00007f78f2e0a681 __libc_start_call_main (/lib64/libc.so.6+0x3681)
#20 0x00007f78f2e0a798 __libc_start_main@GLIBC_2.2.5 (/lib64/libc.so.6+0x3798)
#21 0x0000000000587115 _start (/mnt/Work/projects/llvm-sh/ll_build/bin/llvm-tblgen+0x587115)
```

Contributor guide

Open the contributing guide

Research direction

Start with llvm/utils/TableGen/Common/CodeGenRegisters.cpp at CodeGenRegBank::pruneUnitSets(), using the reproducer in llvm/lib/Target/SuperH/SuperH.td and the supplied llvm-tblgen command. Trace why these artificial subregisters produce an invalid vector index. Done means the reproducer no longer crashes and a regression test covers the setup.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp
Domain
compilers
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
68/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.