[llvm] [CodeGen] Mark read_register of allocatable physreg as live-in (PR #200825)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 1 06:57:16 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-selectiondag
Author: Adhemerval Zanella (zatrazz)
<details>
<summary>Changes</summary>
Reading an allocatable register via llvm.read_register / llvm.read_volatile_register lowers to a COPY from a physical register that might never be defined in the function. With LLVM_ENABLE_EXPENSIVE_CHECKS the machine verifier rejects this as "Using an undefined physical register" (e.g. AArch64 read-fp-reg.ll reading d5).
Declare the register as a function live-in in Select_READ_REGISTER, the same way incoming physreg arguments are modelled, so the COPY no longer uses an undefined register. Reserved registers (e.g. the stack pointer) are exempt and need no live-in.
The same "Using an undefined physical register" verifier error was hit for Mips readcyclecounter.ll, which was first xfailed over with "XFAIL: expensive_checks" (b8054104d36d) and then properly fixed by reserving the hardware register (0c809ea33614, "[Mips] Reserve hardware register HWR2"). Reserving is not an option for allocatable registers, so marking them live-in is the analogous root-cause fix here.
---
Full diff: https://github.com/llvm/llvm-project/pull/200825.diff
1 Files Affected:
- (modified) llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp (+11)
``````````diff
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
index 3dc599b556ddd..c295982f9f9de 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
@@ -2544,6 +2544,17 @@ void SelectionDAGISel::Select_READ_REGISTER(SDNode *Op) {
} else {
New =
CurDAG->getCopyFromReg(Op->getOperand(0), dl, Reg, Op->getValueType(0));
+ // Reading an allocatable physical register copies a value that is not
+ // defined in this function. Declare it as a live-in so the resulting COPY
+ // does not use an undefined physical register (which the machine verifier
+ // rejects). Reserved registers (e.g. the stack pointer) are exempt and
+ // need no live-in.
+ MachineFunction &MFn = CurDAG->getMachineFunction();
+ MachineRegisterInfo &MRI = MFn.getRegInfo();
+ const TargetRegisterInfo *TRI = MFn.getSubtarget().getRegisterInfo();
+ if (Reg.isPhysical() && !TRI->getReservedRegs(MFn).test(Reg) &&
+ !MRI.isLiveIn(Reg))
+ MRI.addLiveIn(Reg);
}
New->setNodeId(-1);
``````````
</details>
https://github.com/llvm/llvm-project/pull/200825
More information about the llvm-commits
mailing list