llvm / llvm/llvm-project

[MIR] Why does `constrainRegClass` not consider whether `NewRC` is allocatable?

Open
#198,063 0 comments 0 reactions 0 assignees View on GitHub
new issue
Dominant language
LLVM
Stars
40.5k
Forks
18.7k
PR merge metrics
PR metrics pending

Description

```
static const TargetRegisterClass *
constrainRegClass(MachineRegisterInfo &MRI, Register Reg,
const TargetRegisterClass *OldRC,
const TargetRegisterClass *RC, unsigned MinNumRegs) {
if (OldRC == RC)
return RC;
const TargetRegisterClass *NewRC =
MRI.getTargetRegisterInfo()->getCommonSubClass(OldRC, RC);
if (!NewRC || NewRC == OldRC)
return NewRC;
if (NewRC->getNumRegs() < MinNumRegs)
return nullptr;
MRI.setRegClass(Reg, NewRC);
return NewRC;
}
```

```
#1 llvm::MachineRegisterInfo::setRegClass at lllvm/lib/CodeGen/MachineRegisterInfo.cpp:59
#2 0x0000000005e812cd in constrainRegClass at llvm/lib/CodeGen/MachineRegisterInfo.cpp:80
#3 0x0000000005e81334 in llvm::MachineRegisterInfo::constrainRegClass at llvm/lib/CodeGen/MachineRegisterInfo.cpp:88
```

If NewRC is non-allocable, an assertion failure is triggered within `setRegClass`.
assert(RC && RC->isAllocatable() && "Invalid RC for virtual register");

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.