[llvm] [Thumb1] Resolve FIXME: Use 'mov hi, $src; mov $dst, hi' (PR #81908)
Tim Northover via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 2 06:44:17 PDT 2024
================
@@ -47,24 +49,63 @@ void Thumb1InstrInfo::copyPhysReg(MachineBasicBlock &MBB,
assert(ARM::GPRRegClass.contains(DestReg, SrcReg) &&
"Thumb1 can only copy GPR registers");
- if (st.hasV6Ops() || ARM::hGPRRegClass.contains(SrcReg)
- || !ARM::tGPRRegClass.contains(DestReg))
+ if (st.hasV6Ops() || ARM::hGPRRegClass.contains(SrcReg) ||
+ !ARM::tGPRRegClass.contains(DestReg))
BuildMI(MBB, I, DL, get(ARM::tMOVr), DestReg)
.addReg(SrcReg, getKillRegState(KillSrc))
.add(predOps(ARMCC::AL));
else {
- // FIXME: Can also use 'mov hi, $src; mov $dst, hi',
- // with hi as either r10 or r11.
-
const TargetRegisterInfo *RegInfo = st.getRegisterInfo();
- if (MBB.computeRegisterLiveness(RegInfo, ARM::CPSR, I)
- == MachineBasicBlock::LQR_Dead) {
+ LiveRegUnits UsedRegs(*RegInfo);
+ UsedRegs.addLiveOuts(MBB);
+
+ auto InstUpToI = MBB.end();
+ while (InstUpToI != I)
+ // The pre-decrement is on purpose here.
+ // We want to have the liveness right before I.
+ UsedRegs.stepBackward(*--InstUpToI);
+
+ if (UsedRegs.available(ARM::CPSR)) {
BuildMI(MBB, I, DL, get(ARM::tMOVSr), DestReg)
.addReg(SrcReg, getKillRegState(KillSrc))
->addRegisterDead(ARM::CPSR, RegInfo);
return;
}
+ BitVector Allocatable = RegInfo->getAllocatableSet(
+ MF, RegInfo->getRegClass(ARM::hGPRRegClassID));
+
+ // LR is techically caller-save, not callee-save. This means that as long as
+ // it is saved on stack and killed, it is safe to use as a temporary high
+ // register, as it will be restored anyway.
+ Allocatable.reset(ARM::SP);
----------------
TNorthover wrote:
Is this necessary? I'd expect `getAllocatableSet` to already block out reserved registers (which these had better be!)
https://github.com/llvm/llvm-project/pull/81908
More information about the llvm-commits
mailing list