diff --git a/llvm/include/llvm/CodeGen/TargetInstrInfo.h b/llvm/include/llvm/CodeGen/TargetInstrInfo.h index 175f205328361..041958b7a3649 100644 --- a/llvm/include/llvm/CodeGen/TargetInstrInfo.h +++ b/llvm/include/llvm/CodeGen/TargetInstrInfo.h @@ -2158,7 +2158,7 @@ class LLVM_ABI TargetInstrInfo : public MCInstrInfo { return TargetOpcode::COPY; } - /// During PHI eleimination lets target to make necessary checks and + /// During PHI elimination lets target to make necessary checks and /// insert the copy to the PHI destination register in a target specific /// manner. virtual MachineInstr *createPHIDestinationCopy( @@ -2168,7 +2168,7 @@ class LLVM_ABI TargetInstrInfo : public MCInstrInfo { .addReg(Src); } - /// During PHI eleimination lets target to make necessary checks and + /// During PHI elimination lets target to make necessary checks and /// insert the copy to the PHI destination register in a target specific /// manner. virtual MachineInstr *createPHISourceCopy(MachineBasicBlock &MBB, @@ -2180,6 +2180,17 @@ class LLVM_ABI TargetInstrInfo : public MCInstrInfo { .addReg(Src, 0, SrcSubReg); } + /// During PHI elimination lets target to decide if two phis can use the + /// same register \p Reg when they have the same rhs. Register \p Reg has + /// been used for the first phi and \p PHIReg is the DestReg of the second + /// Phi. This function is to check if the second phi can reuse \p Reg as + /// its temporary register. + /// The default is to allow reuse. + virtual bool allowPHIReuse(Register Reg, Register PHIReg, + const MachineFunction &MF) const { + return true; + } + /// Returns a \p outliner::OutlinedFunction struct containing target-specific /// information for a set of outlining candidates. Returns std::nullopt if the /// candidates are not suitable for outlining. \p MinRepeats is the minimum diff --git a/llvm/lib/CodeGen/PHIElimination.cpp b/llvm/lib/CodeGen/PHIElimination.cpp index 34a9d5d0e401f..fc2ecb9317bc4 100644 --- a/llvm/lib/CodeGen/PHIElimination.cpp +++ b/llvm/lib/CodeGen/PHIElimination.cpp @@ -380,7 +380,7 @@ void PHIEliminationImpl::LowerPHINode(MachineBasicBlock &MBB, Register *Entry = nullptr; if (AllEdgesCritical) Entry = &LoweredPHIs[MPhi]; - if (Entry && *Entry) { + if (Entry && *Entry && TII->allowPHIReuse(*Entry, DestReg, MF)) { // An identical PHI node was already lowered. Reuse the incoming register. IncomingReg = *Entry; reusedIncoming = true;