[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