diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2025-12-06 19:56:45 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2025-12-06 20:08:43 +0000 |
| commit | 3f709e42e3be0f28a88ca3e77663a02b52c914f4 (patch) | |
| tree | 948796bf3bf7e164373caf6c31f9f128ca85fd8c /llvm/lib/Target/SystemZ/SystemZPostRewrite.cpp | |
| parent | 32a711e1c447004eb1fd015925f305ed1d8426de (diff) | |
Diffstat (limited to 'llvm/lib/Target/SystemZ/SystemZPostRewrite.cpp')
| -rw-r--r-- | llvm/lib/Target/SystemZ/SystemZPostRewrite.cpp | 53 |
1 files changed, 38 insertions, 15 deletions
diff --git a/llvm/lib/Target/SystemZ/SystemZPostRewrite.cpp b/llvm/lib/Target/SystemZ/SystemZPostRewrite.cpp index e15f9027cc20..8d4cee655235 100644 --- a/llvm/lib/Target/SystemZ/SystemZPostRewrite.cpp +++ b/llvm/lib/Target/SystemZ/SystemZPostRewrite.cpp @@ -19,6 +19,7 @@ #include "llvm/ADT/Statistic.h" #include "llvm/CodeGen/LivePhysRegs.h" #include "llvm/CodeGen/MachineFunctionPass.h" +#include "llvm/CodeGen/MachineInstr.h" #include "llvm/CodeGen/MachineInstrBuilder.h" using namespace llvm; @@ -31,9 +32,7 @@ namespace { class SystemZPostRewrite : public MachineFunctionPass { public: static char ID; - SystemZPostRewrite() : MachineFunctionPass(ID) { - initializeSystemZPostRewritePass(*PassRegistry::getPassRegistry()); - } + SystemZPostRewrite() : MachineFunctionPass(ID) {} const SystemZInstrInfo *TII; @@ -101,32 +100,53 @@ void SystemZPostRewrite::selectSELRMux(MachineBasicBlock &MBB, unsigned LowOpcode, unsigned HighOpcode) { Register DestReg = MBBI->getOperand(0).getReg(); - Register Src1Reg = MBBI->getOperand(1).getReg(); - Register Src2Reg = MBBI->getOperand(2).getReg(); + MachineOperand &Src1MO = MBBI->getOperand(1); + MachineOperand &Src2MO = MBBI->getOperand(2); + Register Src1Reg = Src1MO.getReg(); + Register Src2Reg = Src2MO.getReg(); bool DestIsHigh = SystemZ::isHighReg(DestReg); bool Src1IsHigh = SystemZ::isHighReg(Src1Reg); bool Src2IsHigh = SystemZ::isHighReg(Src2Reg); + // A copy instruction that we might create, held here for the purpose of + // debug instr value tracking. + MachineInstr *CopyInst = nullptr; + + // In rare cases both sources are the same register (after + // machine-cse). This must be handled as it may lead to wrong-code (after + // machine-cp) if the kill flag on Src1 isn't cleared (with + // expandCondMove()). + if (Src1Reg == Src2Reg) { + CopyInst = BuildMI(*MBBI->getParent(), MBBI, MBBI->getDebugLoc(), + TII->get(SystemZ::COPY), DestReg) + .addReg(Src1Reg, getRegState(Src1MO) & getRegState(Src2MO)); + MBB.getParent()->substituteDebugValuesForInst(*MBBI, *CopyInst, 1); + MBBI->eraseFromParent(); + return; + } // If sources and destination aren't all high or all low, we may be able to // simplify the operation by moving one of the sources to the destination // first. But only if this doesn't clobber the other source. if (DestReg != Src1Reg && DestReg != Src2Reg) { if (DestIsHigh != Src1IsHigh) { - BuildMI(*MBBI->getParent(), MBBI, MBBI->getDebugLoc(), - TII->get(SystemZ::COPY), DestReg) - .addReg(MBBI->getOperand(1).getReg(), getRegState(MBBI->getOperand(1))); - MBBI->getOperand(1).setReg(DestReg); + CopyInst = BuildMI(*MBBI->getParent(), MBBI, MBBI->getDebugLoc(), + TII->get(SystemZ::COPY), DestReg) + .addReg(Src1Reg, getRegState(Src1MO)); + Src1MO.setReg(DestReg); Src1Reg = DestReg; Src1IsHigh = DestIsHigh; } else if (DestIsHigh != Src2IsHigh) { - BuildMI(*MBBI->getParent(), MBBI, MBBI->getDebugLoc(), - TII->get(SystemZ::COPY), DestReg) - .addReg(MBBI->getOperand(2).getReg(), getRegState(MBBI->getOperand(2))); - MBBI->getOperand(2).setReg(DestReg); + CopyInst = BuildMI(*MBBI->getParent(), MBBI, MBBI->getDebugLoc(), + TII->get(SystemZ::COPY), DestReg) + .addReg(Src2Reg, getRegState(Src2MO)); + Src2MO.setReg(DestReg); Src2Reg = DestReg; Src2IsHigh = DestIsHigh; } } + // if a copy instruction was inserted, record the debug value substitution + if (CopyInst) + MBB.getParent()->substituteDebugValuesForInst(*MBBI, *CopyInst, 1); // If the destination (now) matches one source, prefer this to be first. if (DestReg != Src1Reg && DestReg == Src2Reg) { @@ -190,8 +210,11 @@ bool SystemZPostRewrite::expandCondMove(MachineBasicBlock &MBB, // In MoveMBB, emit an instruction to move SrcReg into DestReg, // then fall through to RestMBB. - BuildMI(*MoveMBB, MoveMBB->end(), DL, TII->get(SystemZ::COPY), DestReg) - .addReg(MI.getOperand(2).getReg(), getRegState(MI.getOperand(2))); + MachineInstr *CopyInst = + BuildMI(*MoveMBB, MoveMBB->end(), DL, TII->get(SystemZ::COPY), DestReg) + .addReg(MI.getOperand(2).getReg(), getRegState(MI.getOperand(2))); + // record the debug value substitution for CopyInst + MBB.getParent()->substituteDebugValuesForInst(*MBBI, *CopyInst, 1); MoveMBB->addSuccessor(RestMBB); NextMBBI = MBB.end(); |
