From 99d57310f8fc610b3711da4c51967999b1359a3e Mon Sep 17 00:00:00 2001 From: Nick Desaulniers Date: Fri, 31 May 2019 21:20:13 +0000 Subject: [PATCH] [RegisterCoalescer] fix potential use of undef value. NFC Summary: Fixes a warning produced from scan-build (llvm.org/reports/scan-build/), further warnings found by annotation isMoveInstr [[nodiscard]]. isMoveInstr potentially does not assign to its parameters, so if they were uninitialized, they will potentially stay uninitialized. It seems most call sites pass references to uninitialized values, then use them without checking the return value. Reviewers: wmi Reviewed By: wmi Subscribers: MatzeB, qcolombet, hiraditya, tpr, llvm-commits, srhines Tags: #llvm Differential Revision: https://reviews.llvm.org/D62109 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@362265 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/RegisterCoalescer.cpp | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/lib/CodeGen/RegisterCoalescer.cpp b/lib/CodeGen/RegisterCoalescer.cpp index 58e29d613f0..1f0046ab164 100644 --- a/lib/CodeGen/RegisterCoalescer.cpp +++ b/lib/CodeGen/RegisterCoalescer.cpp @@ -358,9 +358,10 @@ INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass) INITIALIZE_PASS_END(RegisterCoalescer, "simple-register-coalescing", "Simple Register Coalescing", false, false) -static bool isMoveInstr(const TargetRegisterInfo &tri, const MachineInstr *MI, - unsigned &Src, unsigned &Dst, - unsigned &SrcSub, unsigned &DstSub) { +LLVM_NODISCARD static bool isMoveInstr(const TargetRegisterInfo &tri, + const MachineInstr *MI, unsigned &Src, + unsigned &Dst, unsigned &SrcSub, + unsigned &DstSub) { if (MI->isCopy()) { Dst = MI->getOperand(0).getReg(); DstSub = MI->getOperand(0).getSubReg(); @@ -1516,7 +1517,8 @@ MachineInstr *RegisterCoalescer::eliminateUndefCopy(MachineInstr *CopyMI) { // CoalescerPair may have a new register class with adjusted subreg indices // at this point. unsigned SrcReg, DstReg, SrcSubIdx, DstSubIdx; - isMoveInstr(*TRI, CopyMI, SrcReg, DstReg, SrcSubIdx, DstSubIdx); + if(!isMoveInstr(*TRI, CopyMI, SrcReg, DstReg, SrcSubIdx, DstSubIdx)) + return nullptr; SlotIndex Idx = LIS->getInstructionIndex(*CopyMI); const LiveInterval &SrcLI = LIS->getInterval(SrcReg); @@ -3514,7 +3516,8 @@ bool RegisterCoalescer::applyTerminalRule(const MachineInstr &Copy) const { if (!UseTerminalRule) return false; unsigned DstReg, DstSubReg, SrcReg, SrcSubReg; - isMoveInstr(*TRI, &Copy, SrcReg, DstReg, SrcSubReg, DstSubReg); + if (!isMoveInstr(*TRI, &Copy, SrcReg, DstReg, SrcSubReg, DstSubReg)) + return false; // Check if the destination of this copy has any other affinity. if (TargetRegisterInfo::isPhysicalRegister(DstReg) || // If SrcReg is a physical register, the copy won't be coalesced. @@ -3538,8 +3541,9 @@ bool RegisterCoalescer::applyTerminalRule(const MachineInstr &Copy) const { if (&MI == &Copy || !MI.isCopyLike() || MI.getParent() != OrigBB) continue; unsigned OtherReg, OtherSubReg, OtherSrcReg, OtherSrcSubReg; - isMoveInstr(*TRI, &Copy, OtherSrcReg, OtherReg, OtherSrcSubReg, - OtherSubReg); + if (!isMoveInstr(*TRI, &Copy, OtherSrcReg, OtherReg, OtherSrcSubReg, + OtherSubReg)) + return false; if (OtherReg == SrcReg) OtherReg = OtherSrcReg; // Check if OtherReg is a non-terminal. -- 2.50.1