From: Puyan Lotfi Date: Fri, 31 May 2019 04:49:58 +0000 (+0000) Subject: [MIR-Canon] Hardening propagateLocalCopies. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c76a61c205e30a2d3d46a4621ffe176a6186cda1;p=llvm [MIR-Canon] Hardening propagateLocalCopies. This is am almost NFC, it does the following: - If there is no register class for a COPY's src or dst, bail. - Fixes uses iterator invalidation bug. Differential Revision: https://reviews.llvm.org/D62713 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@362191 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/MIRCanonicalizerPass.cpp b/lib/CodeGen/MIRCanonicalizerPass.cpp index 650240e60fe..d36c0c89ba0 100644 --- a/lib/CodeGen/MIRCanonicalizerPass.cpp +++ b/lib/CodeGen/MIRCanonicalizerPass.cpp @@ -343,15 +343,23 @@ static bool propagateLocalCopies(MachineBasicBlock *MBB) { continue; if (!TargetRegisterInfo::isVirtualRegister(Src)) continue; + // Not folding COPY instructions if regbankselect has not set the RCs. + // Why are we only considering Register Classes? Because the verifier + // sometimes gets upset if the register classes don't match even if the + // types do. A future patch might add COPY folding for matching types in + // pre-registerbankselect code. + if (!MRI.getRegClassOrNull(Dst)) + continue; if (MRI.getRegClass(Dst) != MRI.getRegClass(Src)) continue; - for (auto UI = MRI.use_begin(Dst); UI != MRI.use_end(); ++UI) { - MachineOperand *MO = &*UI; + std::vector Uses; + for (auto UI = MRI.use_begin(Dst); UI != MRI.use_end(); ++UI) + Uses.push_back(&*UI); + for (auto *MO : Uses) MO->setReg(Src); - Changed = true; - } + Changed = true; MI->eraseFromParent(); } diff --git a/test/CodeGen/MIR/AMDGPU/mir-canon-multi.mir b/test/CodeGen/MIR/AMDGPU/mir-canon-multi.mir index 65ad2ff41a7..005014d5e83 100644 --- a/test/CodeGen/MIR/AMDGPU/mir-canon-multi.mir +++ b/test/CodeGen/MIR/AMDGPU/mir-canon-multi.mir @@ -1,8 +1,13 @@ # RUN: llc -o - -march=amdgcn -run-pass mir-canonicalizer -x mir %s | FileCheck %s +# CHECK: %namedVReg4354:vgpr_32 = COPY $vgpr0 # CHECK: %namedVReg1352:vgpr_32 = COPY %namedVReg4353 -# CHECK: %namedVReg1359:vgpr_32 = COPY %namedVReg1362 -# CHECK: %namedVReg1360:vgpr_32 = COPY %namedVReg1363 +# CHECK-NEXT: %namedVReg1358:vgpr_32 = COPY %namedVReg1361 +# CHECK-NEXT: %namedVReg1359:vgpr_32 = COPY %namedVReg1362 +# CHECK-NEXT: %namedVReg1353:vreg_64 = REG_SEQUENCE %namedVReg4354, %subreg.sub0, %namedVReg1352, %subreg.sub1 +# CHECK-NEXT: %namedVReg1354:sgpr_128 = REG_SEQUENCE %namedVReg4354, %subreg.sub0, %namedVReg1352, %subreg.sub1, %namedVReg1358, %subreg.sub2, %namedVReg1359, %subreg.sub3 +# This tests for the itereator invalidation fix (reviews.llvm.org/D62713) +# CHECK-NEXT: BUFFER_STORE_DWORD_ADDR64 %namedVReg1352, %namedVReg1353, %namedVReg1354, 0, 0, 0, 0, 0, 0, implicit $exec ... --- name: foo